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

在TypeScript中定义复杂索引签名时如何遵循DRY原则避免键名重复?

如何在TypeScript索引签名键值映射中遵循DRY原则避免重复键名?

当然可以,你可以通过提取基础数据+自动转换的方式来避免键名重复,下面是两种实用的方案:

方案一:利用Object.fromEntries快速生成映射

先只维护包含核心字段(比如你的extraField)的基础数据,再通过Object.fromEntries自动将键名赋值给name属性,一次性生成符合Type接口的映射:

export interface Type {
  name: string;
  extraField: number;
}

// 仅维护键名和对应的extraField,无需重复写name
const baseData = {
  keyOne: 1,
  keyTwo: 2,
};

// 自动转换为完整的键值映射
const keyValueMap: { [name: string]: Type } = Object.fromEntries(
  Object.entries(baseData).map(([key, extraField]) => [
    key,
    { name: key, extraField }
  ])
);

方案二:泛型辅助函数增强类型检查

如果需要更严格的类型约束(比如让TypeScript推断出键名的具体联合类型,而非宽泛的string),可以写一个泛型辅助函数:

export interface Type {
  name: string;
  extraField: number;
}

function createKeyValueMap<T extends string>(data: Record<T, number>): Record<T, Type> {
  return Object.fromEntries(
    Object.entries(data).map(([key, extraField]) => [
      key,
      { name: key as T, extraField }
    ])
  ) as Record<T, Type>;
}

// 使用时只需传入键名和extraField,自动生成符合要求的映射
const keyValueMap = createKeyValueMap({
  keyOne: 1,
  keyTwo: 2,
});

这种方式下,keyValueMap的键会被推断为"keyOne" | "keyTwo",比单纯的字符串索引签名类型更精确,同时完全遵循DRY原则,不用重复书写键名。

内容的提问来源于stack exchange,提问作者Steven Pauk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 23:25:02