Conversão de tipo em Typescript
É verdade que o TypeScript nos permite substituir sua visão inferida e analisada dos tipos da maneira que quisermos?
Considere o seguinte exemplo simples, por favor
let myAge: number;
myAge = window.prompt('age?');
// we cannot do this because window.prompt returns a string
// so we need a type assertion, but the 2 ways I know does not cut it
let myAgeStr: string;
myAgeStr = window.prompt('age?');
// method 1
myAge = myAgeStr as number; // fails
// method 2
myAge = <number> myAgeStr; // also fails
Fails significa Tipo 'string' não pode ser atribuído ao tipo 'number'.
O que fazemos então?
Resposta #1
Resumindo, você pode fazer isso, mas provavelmente não vai querer. Analise a string como um número.
Aserções de tipo de um tipo para outro só são permitidas quando pelo menos um dos tipos é atribuível ao outro. Existe a direção segura de "up casting", onde você amplia um valor para um supertipo (desperdiçando informações):
// safe
let h = "hello" as (string | number); // widening string to string|number
E há a direção insegura de "down casting", onde você reduz um valor para um subtipo (adicionando informações que o compilador não pode verificar):
// unsafe but correct
let okay = h as "hello"; // narrowed string|number to string literal "hello"
// unsafe and incorrect
let notOkay = h as "goodbye"; // narrowed string|number to string literal "goodbye".
Mas o que você não pode fazer é fazer asserções de tipo entre dois tipos não relacionados, onde nenhum deles é atribuível ao outro:
let s = "string";
s as number; // error
let n = 1;
n as string; // error
Digite any, a saída de emergência do sistema de tipos. O tipo any é considerado atribuível a e de todos os outros tipos. Se você realmente quiser afirmar que um valor é de um tipo não relacionado, você pode usar any como intermediário. Isso é bastante inseguro, é claro:
n = s as any as number; // you're the boss
s = n as any as string; // you're the boss
Então você pode fazer isso:
myAge = window.prompt('age?') as any as number; // bad idea
Mas, por favor, não faça isso. O TypeScript está lhe avisando, corretamente, que um string não é um number. Claro, muitas funções do JavaScript vão forçar a conversão de uma string em número se for isso que elas esperam, mas muitas funções do JavaScript não farão isso:
n = "3" as any as number;
console.log(n + 5); // 35, not 8!
Então, realmente é uma má ideia forçar o TypeScript a permitir que você faça coisas tolas. Se você quiser interpretar uma string como um número, a parse:
let myAge: number;
myAge = Number(window.prompt('age?')); // always a number, may be NaN
A função Number sempre retornará um number, e o TypeScript sabe disso, e agora tanto você quanto o TypeScript estão felizes, tanto em tempo de compilação quanto em tempo de execução. Mas tenha em mente que NaN é um number e é isso que você receberá se fizer algo como Number("hello"). Então, após obter myAge como um number, você provavelmente vai querer verificá-lo usando isNaN() antes de fazer qualquer operação numérica com ele.
Espero que isso ajude; boa sorte!
