Typescript: Tipos condicionais
Tipos condicionais
Tipos condicionais em TypeScript são muito poderosos. Eles nos permitem criar funções de tipo. Eu vou te mostrar:
Suponha que temos 3 tipos: A
, B
e C
.
type A
type B
type C
TypeScripttype A
type B
type C
Eles poderiam ser qualquer coisa, as digamos que A
é string
, B
é number
e C
é a união entre A
e B
.
type A = string;
type B = number;
type C = A | B;
TypeScripttype A = string;
type B = number;
type C = A | B;
Agora, nós queremos converter string
e number
para representações numéricas literais.
string
deve ser 1
,
type NumberA = 1;
type NumberB = number;
type NumberC = 1 | number;
TypeScripttype NumberA = 1;
type NumberB = number;
type NumberC = 1 | number;
number
deve ser 2
, e qualquer outra coisa, deve ser 0
.
type NumberA = 1;
type NumberB = 2;
type NumberC = 1 | 2;
TypeScripttype NumberA = 1;
type NumberB = 2;
type NumberC = 1 | 2;
Se isso fosse uma função, você poderia simplesmente usar condicionais para conduzir o código. Ficaria algo assim:
const ToNumber = (T) => (T === string ? 1 : T === number ? 2 : 0);
TypeScriptconst ToNumber = (T) => (T === string ? 1 : T === number ? 2 : 0);
Essa sintaxe não funciona para tipos, mas chegou bem perto.
type ToNumber = (T) =>
T === string
? 1
: T === number
? 2
: 0
TypeScripttype ToNumber = (T) =>
T === string
? 1
: T === number
? 2
: 0
Em vez de uma seta, usamos igual.
type ToNumber(T) =
T === string
? 1
: T === number
? 2
: 0
TypeScripttype ToNumber(T) =
T === string
? 1
: T === number
? 2
: 0
Em vez de parênteses, usamos colchetes angulares.
type ToNumber<T> =
T === string
? 1
: T === number
? 2
: 0
TypeScripttype ToNumber<T> =
T === string
? 1
: T === number
? 2
: 0
E em vez de triplo igual, usamos extends.
type ToNumber<T> = T extends string ? 1 : T extends number ? 2 : 0;
TypeScripttype ToNumber<T> = T extends string ? 1 : T extends number ? 2 : 0;
Veja, não estamos perguntando ao TypeScript se T
é igual a string
,o que estamos perguntando é se T
é um subconjunto de string
.
Que também inclui tipos de string literais, assim como o tipo literal string "abc"
.
type A = string
type B = number
type C = A | B
ToNumber<A> // -> 1
ToNumber<B> // -> 2
ToNumber<C> // -> 1 | 2
ToNumber<boolean> // -> 0
ToNumber<"abc"> // -> 1
TypeScripttype A = string
type B = number
type C = A | B
ToNumber<A> // -> 1
ToNumber<B> // -> 2
ToNumber<C> // -> 1 | 2
ToNumber<boolean> // -> 0
ToNumber<"abc"> // -> 1
Conclusão
As referências estão abaixo.
Este vídeo faz parte da minha série de Narrowing TypeScript. Você pode assistir à série completa gratuitamente no meu canal.
Deixe um like, tenha um ótimo dia e até breve!