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
Run Code Online (Sandbox Code Playgroud)
Fails 手段 Type 'string' is not assignable to type 'number'。
那我们该怎么办?
TL; DR您可以做到,但您可能不想这样做。将字符串解析为数字。
仅当至少一种类型可分配给另一种类型时,才允许从一种类型到另一种类型的类型声明。有一个安全的“向上转换”方向,即您将值扩展为超型(丢弃信息):
// safe
let h = "hello" as (string | number); // widening string to string|number
Run Code Online (Sandbox Code Playgroud)
还有不安全的“向下转换”方向,您可以将值范围缩小到子类型(添加编译器无法验证的信息):
// 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".
Run Code Online (Sandbox Code Playgroud)
但是您不能做的是在两个不相关的类型之间进行类型断言,这两个类型都不可以分配给另一个:
let s = "string";
s as number; // error
let n = 1;
n as string; // error
Run Code Online (Sandbox Code Playgroud)
输入any,从类型系统逃生舱口。该类型any被认为是可以分配给其他类型的,也可以分配给其他类型。如果您真的想断言一个值是不相关的类型,则可以any用作中介。当然,这是非常不安全的:
n = s as any as number; // you're the boss
s = n as any as string; // you're the boss
Run Code Online (Sandbox Code Playgroud)
因此,您可以这样做:
myAge = window.prompt('age?') as any as number; // bad idea
Run Code Online (Sandbox Code Playgroud)
但是请不要这样做。 TypeScript正确警告您a string不是一个number。当然,如果这是期望的话,很多JavaScript函数会将字符串强制转换为数字,但是很多JavaScript函数不会这样做:
n = "3" as any as number;
console.log(n + 5); // 35, not 8!
Run Code Online (Sandbox Code Playgroud)
因此,强制TypeScript允许您执行愚蠢的事情确实是一个坏主意。如果要将字符串解释为数字,请解析它:
let myAge: number;
myAge = Number(window.prompt('age?')); // always a number, may be NaN
Run Code Online (Sandbox Code Playgroud)
该Number函数将始终返回a number,并且TypeScript知道这一点,现在您和TypeScript在编译时和运行时都很满意。请记住,这NaN是a number,如果您执行类似的操作,那将会得到Number("hello")。因此,在获得myAgea值之后number,您可能希望先对其进行检查,isNaN()然后再对其进行任何数值处理。
希望能有所帮助;祝好运!
| 归档时间: |
|
| 查看次数: |
705 次 |
| 最近记录: |