简而言之,你可以这样做,但你可能不想这么做。将字符串解析为数字。
当两个类型中至少有一个可分配给另一个时,才允许从一种类型到另一种类型的类型断言。存在安全的“向上转型”方向,即将值扩大为超类型(丢失信息):
// safe
let h = "hello" as (string | number)
还有一种不安全的 "向下转换" 方向,它将一个值缩小到一个子类型(添加编译器无法验证的信息):
let okay = h as "hello";
let notOkay = h as "goodbye";
但是您不能在两个不相关的类型之间进行类型断言,其中一个类型不能分配给另一个类型:
let s = "string"
s as number
let n = 1
n as string
输入 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允许您做愚蠢的事情是一个非常不好的主意。如果您想将字符串解释为数字,请
解析(parse)它:
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()
检查它。
希望能对您有所帮助;祝好运!
myAge = +myAgeStr;
或者myAge = parseInt(myAgeStr);
。 - Niladri