¿Cómo distinguir `(() => any) | undefined` de solo `() => any` en TypeScript?
Tengo dos tipos: (() => any) | undefined
y () => any
. Me gustaría extraer el tipo de retorno de la función, pero solo si el valor no es definitivamente indefinido.
He intentado lo siguiente:
type IsUndefined<t> = T extends (() => any) ? "no" : "yes";
Pero esto resuelve a "yes" | "no"
cuando el tipo no es indefinido. Quiero detectar la diferencia entre estos tipos sin crear una unión.
Consulta el siguiente enlace del playground para ver un ejemplo.
Esa es la historia corta, la historia larga es que tengo una estructura como la siguiente:
type MyStruct = {
optionalHook?: ((...args: any) => any) | undefined,
requiredHook: (...args: any) => any,
}
Me gustaría extraer el tipo de retorno del gancho opcional, pero solo cuando exista. Me gustaría extraer el tipo de retorno del gancho requerido en caso contrario.
Consulta el siguiente enlace del playground para ver un ejemplo más completo.
davy.ai
Para extraer el tipo de retorno de una función solo si el valor definitivamente no es indefinido, puede crear un alias de tipo usando tipos condicionales. Aquí tienes un ejemplo:
El alias de tipo
FunctionReturnType
toma un valor de tipoT
y verifica si se extiende a un tipo de función utilizando un tipo condicional. Si es un tipo de función, utilizamos la palabra claveinfer
para extraer el tipo de retorno de la función en una nueva variable de tipoR
. Luego verificamos siundefined
se puede asignar aR
. Si es así, devolvemosnever
, lo que significa que el valor definitivamente no es indefinido. De lo contrario, devolvemosR
, el tipo de retorno real de la función.En el ejemplo de
MyStruct
, puedes usar el alias de tipoFunctionReturnType
para extraer el tipo de retorno del hook opcional solo si existe, y utilizar el tipo de retorno del hook obligatorio en caso contrario. Aquí tienes una versión actualizada de la estructura:El alias de tipo
ExtractReturnType
toma un tipo genéricoT
y un tipo literal de cadenaK
, que es una clave deT
. Primero verificamos siK
es una clave deT
utilizando otro tipo condicional. Si lo es, verificamos si el tipo de retorno deT[K]
(es decir, el tipo de la propiedad correspondiente aK
) se puede asignar aundefined
. Si es así, devolvemos el tipo de retorno de la propiedadrequiredHook
deMyStruct
. De lo contrario, devolvemos el tipo de retorno real deT[K]
.Usando
ExtractReturnType
, puedes extraer el tipo de retorno del hook opcional solo si existe, y utilizar el tipo de retorno del hook obligatorio en caso contrario. En el ejemplo anterior, el alias de tipoOptionalReturnType
devuelve() => void
porque el tipo de retorno del hook opcional definitivamente no es indefinido. El alias de tipoRequiredReturnType
devuelve() => any
porque el tipo de retorno del hook opcional es indefinido.</mystruct,></mystruct,></t[k]></t[‘requiredhook’]></t[k]></t,>