首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类型转换

类型转换
EN

Stack Overflow用户
提问于 2017-11-18 16:51:54
回答 1查看 2.4K关注 0票数 4

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

请考虑以下简单的例子

代码语言:javascript
复制
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'

那我们怎么办?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-18 17:18:38

博士,你可以做,但你可能不想做。将字符串解析为数字。

只有当至少一种类型可以分配给另一种类型时,才允许从一种类型到另一种类型的类型断言。有一个安全的“向上浇铸”方向,其中a可以将一个值扩展到一个超级类型(丢弃信息):

代码语言:javascript
复制
// safe
let h = "hello" as (string | number); // widening string to string|number

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

代码语言:javascript
复制
// 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".

但是,您不能做的是在两个不相关类型之间执行类型断言,其中一个不能分配给另一个类型:

代码语言:javascript
复制
let s = "string";
s as number; // error
let n = 1;
n as string; // error

输入any,类型系统的逃逸舱口。any类型被认为可以分配给和从其他类型分配。如果确实希望断言值是不相关的类型,则可以使用any作为中介。当然,这是相当不安全的:

代码语言:javascript
复制
n = s as any as number; // you're the boss
s = n as any as string; // you're the boss

所以你可以这么做:

代码语言:javascript
复制
myAge = window.prompt('age?') as any as number; // bad idea

但请不要这么做。TypeScript警告您,正确地说,string不是number。当然,很多JavaScript函数都会将字符串强制转换为数字,但很多JavaScript函数不会这样做:

代码语言:javascript
复制
n = "3" as any as number;
console.log(n + 5); // 35, not 8!

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

代码语言:javascript
复制
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()检查它。

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

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47368587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档