TypeScript如何在Record或映射类型中覆盖指定键值类型
类型定义实现方案
要实现「联合类型作为键时,部分键自定义值类型、其余键使用统一默认值类型」的效果,使用交叉类型+键过滤的写法即可,可完全规避TS7061编译错误。
推荐写法(使用内置工具类型)
通过TypeScript内置的Record和Exclude工具类型组合实现,代码简洁可读性高:
// 基础类型定义 type Category = "circle" | "square" | "other"; // 包含十余个成员的联合类型 interface Data {} interface CircleData extends Data {} interface SquareData extends Data {} // 目标DataStore类型 type DataStore = { circle: CircleData; square: SquareData; } & Record<Exclude<Category, "circle" | "square">, Data>;
逻辑说明
Exclude<Category, "circle" | "square">:从Category联合类型中剔除需要自定义值类型的键,得到剩余所有普通键的联合Record<K, Data>:生成键类型为K、所有值类型为Data的对象类型- 两部分类型交叉后,最终类型会自动合并属性:
circle和square对应自定义的子类型,其余键统一对应Data类型,由于CircleData、SquareData本身继承自Data,不会产生类型冲突。
原生映射类型写法
如果不使用内置Record工具类型,也可以直接手写剩余键的映射逻辑,效果完全一致:
type DataStore = { circle: CircleData; square: SquareData; } & { [P in Exclude<Category, "circle" | "square">]: Data; };
语法提示:TypeScript不允许在映射类型的代码块内直接声明额外属性/方法,这是TS7061错误的触发原因,将特殊属性和通用映射拆分为两个独立类型再交叉,是该场景的标准实现方式。
内容的提问来源于stack exchange,提问作者aimozg
相关产品推荐
相关产品推荐

