Me preguntaba si puedo tener tipos condicionales en TypeScript?
Actualmente tengo la siguiente interfaz:
interface ValidationResult {
isValid: boolean;
errorText?: string;
}
Pero quiero eliminar errorText
, y solo tenerlo cuando isValid
es false
como una propiedad requerida .
Desearía poder escribirlo como la siguiente interfaz:
interface ValidationResult {
isValid: true;
}
interface ValidationResult {
isValid: false;
errorText: string;
}
Pero como sabes, no es posible. Entonces, ¿cuál es su idea sobre esta situación?
javascript
typescript
types
Arman
fuente
fuente
isValid
esfalse
?Respuestas:
Una forma de modelar este tipo de lógica es usar un tipo de unión, algo como esto
El compilador puede reducir el tipo basado en la bandera booleana
fuente
r
debe ser de tipoInvalid
aquí.Para evitar crear múltiples interfaces que solo se utilizan para crear un tercero, también puede alternar directamente, con un
type
lugar:fuente
La unión demostrada por los errores es cómo recomiendo manejar esto. No obstante, Letra de imprenta no tiene algo conocido como “ tipos condicionales ”, y que puede manejar esto.
Esto
ValidationResult
(que en realidad seValidationResult<boolean>
debe al parámetro predeterminado) es equivalente a la unión producida en la respuesta de errores o en la respuesta de CertainPerformance , y se puede usar de la misma manera.La ventaja aquí es que también podría pasar un
ValidationResult<false>
valor conocido , y luego no tendría que probarisValid
como se sabefalse
yerrorString
se sabe que existe. Probablemente no sea necesario para un caso como este, y los tipos condicionales pueden ser complejos y difíciles de depurar, por lo que probablemente no deberían usarse innecesariamente. Pero podrías, y parecía que valía la pena mencionarlo.fuente
extends
es el operador adecuado para usar. Y tiene muy potente, sobre todo porque también se puede utilizar para profundizar en los tipos:type SecondOf<T> = T extends Pair<any, infer U> ? U : never;
.SecondOf<number>
'se expande'Pair<any, number>
? Supongo que el dicho "no juzgues un libro por su portada" es pertinente aquí.SecondOf<Pair<any, number>>
evalúa anumber
.SecondOf<number>
evalúa anever
, porquenumber extends Pair<any, infer U>
es falso, yanumber
que no extiende ningunoPair