You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 22:16:02