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'
。
那我们该怎么办?
答案 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都很满意,无论是在编译时还是运行时。请注意,NaN
是number
,如果您执行Number("hello")
之类的操作,那就是您所获得的。因此,在将myAge
作为number
后,您可能希望在对其进行任何数字处理之前通过isNaN()
进行检查。
希望有所帮助;祝你好运!