TypeScript中如何用never类型定义对象字段实现单字段或空对象类型
TypeScript 单属性可选对象类型实现方案
错误原因
你原始的Explode类型生成的联合类型每个成员都要求包含Foo的所有属性,未被选中的属性类型为never,因此必须显式声明所有未用到的属性并赋值为never才能通过类型校验,不符合实际使用需求。
修正实现
调整类型逻辑,将未选中的属性设为可选的never类型,既禁止为未选中属性赋值有效值,又不需要显式声明这些属性,额外联合空对象类型满足你允许传入{}的需求:
interface Foo { a: number; b: string; c: boolean; } type Explode<T> = keyof T extends infer K ? K extends unknown ? { [I in keyof T as I extends K ? I : never]: T[I] } & { [I in keyof T as I extends K ? never : I]?: never } : never : never; // 联合空对象支持无属性场景 type Test = Explode<Foo> | {};
验证效果
以下实例化均可正常通过校验:
// 仅包含单个属性 const test1: Test = {a: 1}; const test2: Test = {b: 'test string'}; const test3: Test = {c: false}; // 空对象 const test4: Test = {};
同时如果传入包含多个属性的对象会触发类型报错,符合预期约束。
如果不需要支持空对象,直接删掉Test类型定义中的| {}即可。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

