1. 类型断言(Type Assertion)
    2. 类型断言可以用来手动指定一个值的类型,即允许变量从一种类型更改为另一种类型
    1. var str = '1'
    2. var str2:number = str
    3. // 报错:能将类型“string”分配给类型“number”。ts(2322)
    4. var str = '1'
    5. var str2:number = <any>str
    6. var str = '1'
    7. var str2:number = str as any
    1. var str = '1'
    2. var str2:number = str as number
    3. // 报错:
    4. // 类型 "string" 到类型 "number" 的转换可能是错误的,
    5. // 因为两种类型不能充分重叠。
    6. // 如果这是有意的,请先将表达式转换为 "unknown"。ts(2352)

    在ts中,上述代码会报错,原因如下:

    • 类型不匹配str 是一个字符串类型的变量,其值为 '1'。而 str2 的类型被明确地声明为 number
    • 类型断言str as number 是一个类型断言。它告诉编译器:“相信我,我知道我在做什么,str 确实是一个 number 类型”。但是,这里的问题是 str 的实际类型确实是 string,不是 number。ts编译器知道这一点,并因此抛出了错误。

    简单地说,我们不能直接将一个字符串通过类型断言转换为数字。

    1. var str = '1'
    2. var str2:number = str as any as number

    这段代码中使用了双重类型断言,因为我们通过使用 any 类型绕过了编译器的类型检查,所以并没有报错。

    首先,我们使用了 as anystr 断言为 any 类型,然后再使用了 as number 将其断言为 number 类型。

    在ts中,any 类型是一个非常灵活的类型,它允许任何类型的赋值。所以,当我们首先将 str 断言为 any 类型时,编译器不再尝试对其类型进行检查。接下来,当我们再将其断言为 number 类型时,由于前面已经是 any 类型,编译器允许这一断言。

    这种双重类型断言的做法常常用于绕过类型检查系统。