#javascript #typescript #typescript-generics
Вопрос:
Я пытаюсь реализовать функцию в TypeScript, тип возвращаемого значения которой определяется 2-м аргументом, передаваемым функции.
Например,
const a = ifNotEmpty(var1, "hello"); //a's type should be string
const b = ifNotEmpty(var2, [1, 2]); //b's type should be number[]
Но вместо этого я получаю
тип a как «привет», а тип b как [1, 2]. Оба постоянных типа жестко закодированы в «привет» и [1,2] вместо «строка» или «число []».;
Вот скриншот определенных типов в VSCode
Как вы можете видеть, тип a является «истинным», жестко закодированным, а не логическим. Есть ли способ определить тип 2-го параметра и вернуть этот тип в качестве возвращаемого типа функции, чтобы тип a был «логическим», а не «истинным»?
Вот функция, которую я пытался сделать:
const ifNotEmpty = <U>(value: any, defaultValue: U): U => {
return value ?? defaultValue;
};
Ответ №1:
true
выводится потому, что значение по умолчанию берется из второго параметра как можно более строго. Нет никакого способа сказать ТС иначе. Это можно рассматривать как преимущество 🙂
Кроме того, я отредактировал тип вашей функции, чтобы не игнорировать первый параметр, если он на самом деле не является нулевым или неопределенным, чтобы он правильно отражал тип.
const ifNotEmpty = <D, T>(
value: T,
defaultValue: U,
): T extends null | undefined ? D : T => {
return value ?? defaultValue;
};
const a: boolean = ifNotEmpty(null, true);
Ответ №2:
если я правильно понимаю, что ты хочешь сделать. Вам просто нужно вернуться
return value != null amp;amp; value!=undefined ? typeof value : defaultValue;
И тогда вы получите тип вашего первого значения, а не содержимое переменной
Комментарии:
1. Эй, может быть, я недостаточно хорошо объяснил. Возвращаемая функция по-прежнему будет либо содержимым переменной, либо значением по умолчанию. Но возвращаемый «тип» должен быть значением по умолчанию (2-й аргумент функции).