Estoy tratando de implementar una función en TypeScript, cuyo tipo de devolución está determinado por el segundo argumento que se pasa a la función.
Por ejemplo,
const a = ifNotEmpty(var1, "hello"); //a's type should be string const b = ifNotEmpty(var2, [1, 2]); //b's type should be number[]Pero en cambio, estoy obteniendo el tipo de a como "hola" y el tipo de b como [1, 2]. Ambos tipos constantes, codificados en "hola" y [1,2] en lugar de ser "cadena" o "número []";
Aquí hay una captura de pantalla de los tipos determinados en VSCode 
Como puede ver, el tipo de a está codificado como "verdadero", en lugar de booleano. ¿Hay alguna manera de inferir el tipo del segundo parámetro y devolver ese tipo como el tipo de retorno de la función, por lo que el tipo de a será "booleano" y no "verdadero"?
Aquí está la función, lo que traté de hacer:
const ifNotEmpty = <U>(value: any, defaultValue: U): U => { return value ?? defaultValue; };true se deduce porque el valor predeterminado se toma del segundo parámetro de la forma más estricta posible. No hay forma de decirle a TS lo contrario. Podría verse como una ventaja :)
Además, edité su tipo de función, para no ignorar el primer parámetro a menos que sea realmente nulo o indefinido, haciendo que refleje el tipo correctamente.
const ifNotEmpty = <D, T>( value: T, defaultValue: U, ): T extends null | undefined ? D : T => { return value ?? defaultValue; }; const a: boolean = ifNotEmpty(null, true);si estoy haciendo bien lo que quieres hacer. Solo necesitas regresar
return value != null && value!=undefined ? typeof value : defaultValue;Y luego obtienes el tipo de tu primer valor y no el contenido de la variable