TypeScript中LiteralUnion类型及{ _?: never }的作用是什么?
LiteralUnion 类型解析
LiteralUnion 是用来解决 TypeScript 里一个常见痛点的工具类型:既保留字面量类型的自动提示,又允许传入父基础类型的任意值。
比如你直接写 type Foo = 'a' | 'b' | string,TypeScript 会自动把这个类型简化成 string,导致编辑器不会给你提示'a'、'b'这两个字面量选项。但用 LiteralUnion 就能避免这个问题,它能让类型同时支持指定的字面量和父类型的任意值,还保留字面量的提示。
关于 U & { _?: never } 的含义
这部分是核心的“小技巧”,用来骗过 TypeScript 的类型简化逻辑:
U是基础原始类型(比如 string、number 这类Primitive){ _?: never }是一个带有可选属性_的对象类型,属性类型是never(意味着这个属性不可能存在有效值)
把两者交叉后,这个类型本质上还是 U 类型(因为对象类型和原始类型交叉,结果还是原始类型),但 TypeScript 会认为这是一个和 U 相关但不完全相同的类型,不会把 T | U 直接合并成 U。这样一来,类型就会保留 T 的字面量提示,同时又允许传入任意 U 类型的值。
举个实际例子:
type Primitive = string | number | boolean; type MyUnion = LiteralUnion<'success' | 'error', string>; // 编辑器会提示'success'、'error' const status1: MyUnion = 'success'; // 也能输入任意字符串,不会报错 const status2: MyUnion = 'pending';
内容的提问来源于stack exchange,提问作者ChenLee
相关产品推荐
相关产品推荐

