TypeScript类型转换

4

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的意思是类型'string'不能分配给类型'number'

那我们该怎么办?


1
你可以尝试使用 myAge = +myAgeStr; 或者 myAge = parseInt(myAgeStr); - Niladri
只使用标准的JavaScript转换,将以下与编程相关的内容从英文翻译成中文。请仅返回翻译后的文本: - Niladri
那绝对可以了。谢谢你。但是为什么 TypeScript 在我的示例中失败了呢?毕竟,它是 JS 的大兄弟。 - Average Joe
1个回答

8

简而言之,你可以这样做,但你可能不想这么做。将字符串解析为数字。


当两个类型中至少有一个可分配给另一个时,才允许从一种类型到另一种类型的类型断言。存在安全的“向上转型”方向,即将值扩大为超类型(丢失信息):

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

还有一种不安全的 "向下转换" 方向,它将一个值缩小到一个子类型(添加编译器无法验证的信息):

// 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允许您做愚蠢的事情是一个非常不好的主意。如果您想将字符串解释为数字,请解析(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()检查它。
希望能对您有所帮助;祝好运!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接