类型断言(Type Assertion)是开发人员告诉 TypeScript 编译器该如何理解值的类型的一种方式。语法:
let someValue: any = "示例"; let strLen: number = (someValue as string).length;
类型断言不会在运行时转换数据,只是向编译器提示它们的类型。如果断言错误,程序不会停止,这可能导致运行时错误。与 C# 或 Java 中的“强转”不同,TypeScript 不会进行任何转换。
使用时,不能直接在不相关的类型之间进行断言(例如 as number as User),但可以通过 as unknown 找到绕过的方法。
使用双重断言
value as unknown as Type将值转换为另一种类型是否安全?
错误答案:是的,这是安全的,因为大多数 TypeScript 开发人员都是这么做的。
正确答案:不,这是危险的。这种做法排除了编译器的检查,让任何类型可以转变为任何其他类型,绕过类型检查,这可能导致运行时错误。仅在确认值确实兼容目标类型时使用。
故事
一个开发人员对来自外部 API 的对象进行了 Type Assertion 为自己的接口 (
as MyType),而没有检查字段。API 更改了结构,应用程序在访问不存在的键时崩溃。
故事
在一个处理 DOM 的库中,有人进行了双重断言
el as unknown as HTMLElement,未确保类型,后来在尝试对另一个对象调用 HTMLElement 的方法时遇到错误。
故事
在与 JS 代码集成时,一位开发人员对配置应用了
as any以解决类型错误。这掩盖了问题,而处理数据不正确的 bug 仅在生产环境中爆发。