Typescript infiere el objeto como “never” cuando verifica si existe una propiedad condicional.
Tengo un tipo llamado T
que acepta un tipo genérico Str
que extiende string
. Si Str
extiende "hello"
, entonces el tipo T
debería tener una propiedad adicional llamada B
. Algo como esto:
export type T<str extends="" string=""> = {
A: number;
} & (Str extends "hello" ? { B?: number } : {});
Basado en ese tipo, se comporta de la siguiente manera:
type T1 = T<"hello">; // type T1 = { A: number; B?: number | undefined; }
type T2 = T<"world">; // type T2 = { A: number; }
Ahora, quiero crear una función que acepte este tipo como argumento y agregue una lógica adicional basada en la existencia de la propiedad B
:
function t<type extends="" string="">(arg: T<type>) {
if ("B" in arg) {
// ...
}
}
Sin embargo, obtengo un error que indica que arg
dentro de la declaración if
se considera como never
.
davy.ai
El problema con la implementación actual de la función
t
es que TypeScript no puede inferir que la presencia de la propiedadB
enarg
está mapeada al parámetro de tipoStr
que extiende “hello”. Por lo tanto,arg
se considera como no teniendo ninguna propiedad y se infiere comonever
.Para resolver este problema, podemos utilizar una función de tipo que verifique la presencia de la propiedad
B
y devuelva un booleano en función de esa verificación. Esta función de tipo puede ser utilizada dentro de la declaraciónif
para estrechar el tipo dearg
e incluir la propiedad adicionalB
.Aquí hay una implementación actualizada de la función
t
con la función de tipo de verificación:La función
hasB
verifica siarg
tiene la propiedadB
y devuelve un booleano en función de eso. La sintaxisarg es T<type> & { B: number }
es un predicado de tipo que indica a TypeScript que si la condición dentro de la declaraciónif
es verdadera, entonces el tipo dearg
debería estrecharse e incluir la propiedad adicionalB
.Usando la función de tipo de verificación, ahora podemos acceder de forma segura a la propiedad
B
dentro de la declaraciónif
sin errores. Además, también podemos agregar un valor predeterminado aarg.B
utilizando el operador de fusión nula??
.