Pesquisa de site

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!

Artigos relacionados