打字稿类型转换

时间:2017-11-18 16:51:54

标签: typescript

TypeScript是否允许我们以我们想要的任何方式覆盖其推断和分析的类型视图?

请考虑以下简单示例

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表示Type 'string' is not assignable to type 'number'

那我们该怎么办?

1 个答案:

答案 0 :(得分:4)

TL; DR你可以做到,但你可能不想。将字符串解析为数字。

只有当至少一种类型可分配给另一种类型时,才允许从一种类型到另一种类型的类型断言。有安全&#34;向上铸造&#34;方向,你把一个值扩展到超类型(扔掉信息):

// safe
let h = "hello" as (string | number); // widening string to string|number

并且存在不安全的&#34;向下铸造&#34;方向,将值缩小为子类型(添加信息,编译器无法验证):

// 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".

但你不能做的是在两个不相关的类型之间输入断言,其中一个都不可分配给另一个:

let s = "string";
s as number; // error
let n = 1;
n as string; // error

输入any,来自类型系统的逃生舱口。类型any被认为可以分配给所有其他类型。如果确实想要断言值是不相关的类型,则可以使用any作为中介。当然,这是非常不安全的:

n = s as any as number; // you're the boss
s = n as any as string; // you're the boss

所以你可以这样做:

myAge = window.prompt('age?') as any as number; // bad idea

但请不要这样做。 TypeScript正确地警告您,string不是number。当然,许多JavaScript函数会将字符串强制转换为数字,如果这是他们所期望的,但许多JavaScript函数不会这样做:

n = "3" as any as number;
console.log(n + 5); // 35, not 8!

因此强迫TypeScript允许你做愚蠢的事情真是个坏主意。如果要将字符串解释为数字,解析它

let myAge: number;
myAge = Number(window.prompt('age?')); // always a number, may be NaN

Number函数将始终返回number,TypeScript知道这一点,现在您和TypeScript都很满意,无论是在编译时还是运行时。请注意,NaNnumber,如果您执行Number("hello")之类的操作,那就是您所获得的。因此,在将myAge作为number后,您可能希望在对其进行任何数字处理之前通过isNaN()进行检查。

希望有所帮助;祝你好运!