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

Typescript 使用冒号和as语法声明类型有什么区别?,typescript,Typescript,声明类型的:语法之间有什么区别 let serverMessage: UServerMessage = message; 以及作为语法 let serverMessage = message as UServerMessage; 在本例中,它们似乎产生了相同的结果,至少是的,它们是不同的 首先,让我们看看这个例子 let a: string; let b: number; function c() { const d = (a || b) as number; // Works

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

let serverMessage: UServerMessage = message;
以及
作为
语法

let serverMessage = message as UServerMessage;
在本例中,它们似乎产生了相同的结果,至少

是的,它们是不同的

首先,让我们看看这个例子

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认为它将始终返回一个数字(即使它可能不是真的)

``:number``定义变量的类型,而不是结果。因此,Typescript将验证并确保不会出现另一种情况(即使它永远不会发生)


希望有帮助。

一个是类型注释一个是类型断言

类型注释告诉编译器检查赋值是否完全有效,以及
message
是否确实与
UServerMessage
兼容

类型断言告诉编译器,我知道我在做什么,
message
是一个
UServerMessage
,不管你认为你知道什么,我有更多的信息,我知道得最好。即使使用类型断言,仍会执行一些检查,因此您可能会将双重断言
消息视为任何UServerMessage
,例如,如果
消息的类型与
UServerMessage
非常不兼容

您应该总是更喜欢类型注释而不是断言。谨慎使用断言,并且只有在必要时才使用。类型断言是一把锤子,用来将一个方形的销钉固定到一个圆孔中,有时很有用,但您可能需要再次检查一下您正在做什么,以确保它是正确的。确保它不是: