Eu queria saber se posso ter tipos condicionais no TypeScript?
Atualmente, tenho a seguinte interface:
interface ValidationResult {
isValid: boolean;
errorText?: string;
}
Mas quero removê-lo errorText
e tê-lo somente quando isValid
é false
uma propriedade necessária .
Eu gostaria de poder escrevê-lo como a seguinte interface:
interface ValidationResult {
isValid: true;
}
interface ValidationResult {
isValid: false;
errorText: string;
}
Mas como você sabe, não é possível. Então, qual é a sua ideia sobre essa situação?
javascript
typescript
types
Arman
fonte
fonte
isValid
éfalse
?Respostas:
Uma maneira de modelar esse tipo de lógica é usar um tipo de união, algo como isto
O compilador pode restringir o tipo com base no sinalizador booleano
fonte
r
deve ser do tipoInvalid
aqui.Para evitar a criação de várias interfaces que apenas são usadas para criar uma terceira, você também pode alternar diretamente, com uma alternativa
type
:fonte
A união demonstrada pelos bugs é como eu recomendo lidar com isso. No entanto, Typescript não tem algo conhecido como “ tipos condicionais ,” e eles podem lidar com isso.
Isso
ValidationResult
(na verdadeValidationResult<boolean>
devido ao parâmetro padrão) é equivalente à união produzida na resposta de bugs ou na resposta de CertainPerformance e pode ser usada da mesma maneira.A vantagem aqui é que você também pode repassar um
ValidationResult<false>
valor conhecido e não precisará testarisValid
como seria conhecidofalse
eerrorString
existe. Provavelmente não é necessário para um caso como esse - e tipos condicionais podem ser complexos e difíceis de depurar, portanto, provavelmente não devem ser usados desnecessariamente. Mas você poderia, e isso parecia digno de menção.fonte
extends
é o operador certo para usar. E tem extremamente poderosa, especialmente desde que você também pode usá-lo para cavar tipos:type SecondOf<T> = T extends Pair<any, infer U> ? U : never;
.SecondOf<number>
'expande' paraPair<any, number>
? Eu acho que o ditado "não julgue um livro pela capa" é pertinente aqui.SecondOf<Pair<any, number>>
avalia comonumber
.SecondOf<number>
avalia comonever
, porquenumber extends Pair<any, infer U>
é falso, comonumber
não se estende a #Pair