Тип, возвращаемый функцией TypeScript из аргумента, показывает неправильный тип

#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-й аргумент функции).