- 类型断言(Type Assertion)
- 类型断言可以用来手动指定一个值的类型,即允许变量从一种类型更改为另一种类型
var str = '1'
var str2:number = str
// 报错:能将类型“string”分配给类型“number”。ts(2322)
var str = '1'
var str2:number = <any>str
var 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
类型,编译器允许这一断言。
这种双重类型断言的做法常常用于绕过类型检查系统。