En Typescript, ¿cómo hacer que un tipo genérico tenga como valor predeterminado nada?
Estoy intentando definir un tipo Result que tiene un tipo de dato opcional.
Mi definición de tipo actual es:
type Result<Data = void> = {
tx: string,
data: Data
}
Pero tiene los siguientes problemas (la línea #2 no se pasa):
const ret: Result<{userId: string}> = {tx: "123", data: {userId: "456"}} // it is GOOD!
const ret: Result = {tx: "123"} // it will complain missing data, how can we pass it?
¿Alguien puede ayudar? ¡Gracias!
Respuesta #1
void no tiene sentido en un contexto donde se espera un valor de expresión: void es como decir que no hay ningún valor en absoluto (no undefined ni null, sino que no hay ningún valor asociado con ello). Por lo tanto, escribir el tipo de un valor de propiedad como void no tiene sentido, al igual que
const foo: void = <anything>
no tiene sentido, a menos que uses explícitamente algo que devuelva un tipo void, lo cual es realmente raro (mejor no pasarlo en absoluto).
Un enfoque es usar un tipo de objeto condicional:
type Result<Data = void> = void extends Data
? {
tx: string
}
: {
tx: string,
data: Data
};
const ret: Result<{ userId: string }> = { tx: "123", data: { userId: "456" } } // Good
const ret2: Result = { tx: "123" } // Good
const ret3: Result = { tx: "123", data: 'foo' } // Bad
