Typescript 类型脚本类型转换

Typescript 类型脚本类型转换,typescript,Typescript,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

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
让我年龄:数字;
myAge=window.prompt('age?');
//无法执行此操作,因为window.prompt返回字符串
//所以我们需要一个类型断言,但我知道的两种方法并不能解决这个问题
让myAgeStr:string;
myAgeStr=window.prompt('age?');
//方法1
myAge=myAgeStr作为编号;//失败
//方法2
myAge=myAgeStr;//也失败了
失败
表示
类型“string”不能分配给类型“number”


那我们怎么办

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


只有当至少一种类型可分配给另一种类型时,才允许从一种类型到另一种类型的类型断言。有一个安全的“向上投射”方向,即将值加宽到超类型(丢弃信息):

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

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

let s = "string";
s as number; // error
let n = 1;
n as string; // error
输入
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正确地警告您,
字符串
不是
数字
。当然,很多JavaScript函数会将字符串强制为数字,如果这是它们所期望的,但很多JavaScript函数不会这样做:

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

Number
函数将始终返回一个
Number
,TypeScript知道这一点,现在您和TypeScript在编译时和运行时都很高兴。请记住,
NaN
是一个
数字
,如果您执行类似于
number(“hello”)
的操作,您将得到这个数字。因此,在将
myAge
作为
number
获取后,在对其执行任何数字操作之前,您可能希望通过
isNaN()
对其进行检查



希望有帮助;祝你好运

你能用
myAge=+myAgeStr
myAge=parseInt(myAgeStr)仅使用标准javascript转换。就像这把小提琴一样,它确实做到了这一点。非常感谢。但为什么在我的例子中typescript失败了呢?毕竟,这是JS的老大哥。
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
n = "3" as any as number;
console.log(n + 5); // 35, not 8!
let myAge: number;
myAge = Number(window.prompt('age?')); // always a number, may be NaN