有时您会有 TypeScript 无法知道的值类型的信息。

例如,如果您正在使用 document.getElementById,TypeScript 只知道它将返回某种类型的 HTMLElement,但是您可能知道您的页面将始终有一个带有给定 ID 的 HTMLCanvasElement。

在这种情况下,可以使用类型断言来指定更具体的类型:

const myCanvas = document.getElementById("main_canvas") as HTMLCanvasElement;

与类型注释一样,类型断言会被编译器删除,不会影响代码的运行时的行为。

您还可以使用尖括号语法(除非代码位于. tsx 文件中) ,这是等价的:

const myCanvas = <HTMLCanvasElement>document.getElementById("main_canvas");

<aside> 💡 提醒: 因为类型断言在编译时被删除,所以没有与类型断言关联的运行时检查。如果类型断言是错误的,则不会产生异常或 null

</aside>

TypeScript 只允许将类型断言转换为更具体或更不具体的类型。该规则可以防止“不可能”的强制转换,比如:

const x = "hello" as number;
// Conversion of type 'string' to type 'number' may be a mistake because neither type sufficiently overlaps with the other. If this was intentional, convert the expression to 'unknown' first.

有时,这一规则可能过于保守,将不允许可能有效的强制转换。如果发生这种情况,您可以使用两个断言,首先对任何(或未知的,我们将在后面介绍) ,然后对所需的类型:

const a = expr as any as T;

该语句先将 a 断言为 any 类型。等同于关闭了类型检查,然后将其断言为T,实现了强制转换