使用冒号和as语法声明类型有什么区别?

时间:2019-02-14 07:08:07

标签: typescript

:声明类型的语法之间有什么区别

let serverMessage: UServerMessage = message;

as语法

let serverMessage = message as UServerMessage;

在本示例中,它们似乎至少产生相同的结果

2 个答案:

答案 0 :(得分:8)

一个是类型注释,一个是类型声明。

类型注释告诉编译器检查分配是否完全有效,并且message确实与UServerMessage兼容

类型断言告诉编译器,我知道我在做什么,messageUServerMessage,不用管你认为你知道什么,我有更多信息,而且我知道最好。即使使用类型断言,仍会执行某些检查,因此,例如,如果message as any as UServerMessage的类型与message

非常不兼容,则可能会看到双重断言UServerMessage

与断言相比,您应该始终偏爱类型注释。仅在必要时谨慎使用断言。类型断言是一种锤子,用于将一个方钉固定到一个圆孔中,这有时会很有用,但您可能需要重新审视自己在做什么以确保其正确。确保不是:

答案 1 :(得分:2)

是的他们不同

首先,让我们看一下这个示例

let a: string;
let b: number;

function c() {
    const d = (a || b) as number; // Works
    const e: number = (a || b); // Throw typing error
}

所以as number告诉Typescript在这种情况下,值将是一个数字( 定义结果的类型 )。它迫使Typescript认为它将始终返回一个数字(即使可能不是真的 )。

``:数字``` 定义变量的类型 ,而不是结果。因此,Typescript将验证并确保不会再有其他情况(即使永远不会发生, )。

希望有帮助。