Por que o código a seguir não verifica o tipo (TypeScript 5.5.4):
type ValidationResult$Type = 'success' | 'invalid_or_expired_token'
export type ValidationResult = {
type: 'success'
token_info: object
} | {
type: 'invalid_or_expired_token'
};
const x: ValidationResult = undefined as unknown as ValidationResult;
const {type}: {type: ValidationResult$Type} = x;
switch (type) {
case 'success':
const {token_info} = x;
break;
case 'invalid_or_expired_token':
break;
}
enquanto o código abaixo, mais simples, faz:
// type ValidationResult$Type = 'success' | 'invalid_or_expired_token'
export type ValidationResult = {
type: 'success'
token_info: object
} | {
type: 'invalid_or_expired_token'
};
const x: ValidationResult = undefined as unknown as ValidationResult;
// const {type}: {type: ValidationResult$Type} = x;
const {type} = x;
switch (type) {
case 'success':
const {token_info} = x;
break;
case 'invalid_or_expired_token':
break;
}
Nesta demonstração você pode ver os dois casos juntos:
UM)
Neste caso,
type
é"success" | "invalid_or_expired_token"
. Quando o TypeScript está processando a análise do fluxo de controle, ele é capaz de ver quetype
vem dex.type
, então o TS é inteligente o suficiente para adivinhar que sex.type
for"success"
, entãox
tem a propriedadetoken_info
.B)
Neste caso,
type
também é"success" | "invalid_or_expired_token"
. Quando o TypeScript está processando a análise do fluxo de controle, NÃO é possível ver o quetype
vem do arquivox.type
. Sua anotação{type: ValidationResult$Type}
tem precedência sobre a inferência dex
, então TS não tem como conectar os pontos e adivinhar que, setype
for"success"
, entãox
possui a propriedadetoken_info
.A moral da história é que você deve evitar adicionar anotações manuais sempre que possível .