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 isValides falsecomo 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

isValidesfalse?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
rdebe ser de tipoInvalidaquí.Para evitar crear múltiples interfaces que solo se utilizan para crear un tercero, también puede alternar directamente, con un
typelugar: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 probarisValidcomo se sabefalseyerrorStringse 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
extendses 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, yanumberque no extiende ningunoPair