如何避免TypeScript中赋值后变量的类型自动收窄?
最优解决方案:使用类型安全的 identity 工具函数
你可以定义一个全局通用的类型标注工具函数,既可以保证变量类型固定为C,又完全符合类型安全要求,写法也非常简洁:
type A = {foo: "foo"} type B = {bar: "bar"} type C = A | B // 全局复用的通用工具函数,仅做类型标注无运行时开销 const asType = <T>(value: T) => value let x1 = asType<C>({ foo: "foo" }) console.log(x1) // x1 类型固定为 C,不会被收窄为 A
这个方案的优势非常明显:
- 完全类型安全:如果传入的对象不符合
C的类型约束,TS会直接抛出编译错误,不会像as断言那样跳过类型校验 - 写法简洁:不需要写冗余的立即执行函数,也不需要额外的重复类型声明
- 无运行时负担:这个工具函数本质上就是直接返回入参,编译后会被完全擦除,不会产生任何额外运行时代码
补充说明
你遇到的类型收窄是TypeScript控制流分析的正常行为:当你给显式标注了联合类型的变量赋值一个明确匹配某条子类型的字面量时,TS会自动把变量类型收窄为对应的子类型,方便后续直接访问子类型的独有属性。
如果你不想额外定义工具函数,也可以在需要用到C类型的上下文处手动标注类型,比如给接收x1作为参数的函数显式声明入参类型为C,也能触发正确的类型推断。
内容的提问来源于stack exchange,提问作者schpet。
相关产品推荐
相关产品推荐

