在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
相关产品推荐
相关产品推荐

