- 类型断言(Type Assertion)
- 类型断言可以用来手动指定一个值的类型,即允许变量从一种类型更改为另一种类型
var str = '1'var str2:number = str// 报错:能将类型“string”分配给类型“number”。ts(2322)var str = '1'var str2:number = <any>strvar str = '1'var str2:number = str as any
var str = '1'var str2:number = str as number// 报错:// 类型 "string" 到类型 "number" 的转换可能是错误的,// 因为两种类型不能充分重叠。// 如果这是有意的,请先将表达式转换为 "unknown"。ts(2352)
在ts中,上述代码会报错,原因如下:
- 类型不匹配:
str是一个字符串类型的变量,其值为'1'。而str2的类型被明确地声明为number - 类型断言:
str as number是一个类型断言。它告诉编译器:“相信我,我知道我在做什么,str确实是一个number类型”。但是,这里的问题是str的实际类型确实是string,不是number。ts编译器知道这一点,并因此抛出了错误。
简单地说,我们不能直接将一个字符串通过类型断言转换为数字。
var str = '1'var str2:number = str as any as number
这段代码中使用了双重类型断言,因为我们通过使用 any 类型绕过了编译器的类型检查,所以并没有报错。
首先,我们使用了 as any 将 str 断言为 any 类型,然后再使用了 as number 将其断言为 number 类型。
在ts中,any 类型是一个非常灵活的类型,它允许任何类型的赋值。所以,当我们首先将 str 断言为 any 类型时,编译器不再尝试对其类型进行检查。接下来,当我们再将其断言为 number 类型时,由于前面已经是 any 类型,编译器允许这一断言。
这种双重类型断言的做法常常用于绕过类型检查系统。
