TypeScript中如何复用对象键名生成同键不同值类型的新对象?
如何基于已有对象类型生成键名相同、值类型不同的新类型?
当然可以!TypeScript的**映射类型(Mapped Types)**就是为这类场景量身打造的——它能让你基于已有类型生成一个键名完全相同,但值类型自定义的新类型,彻底告别重复写键名的麻烦。
具体实现步骤
首先,我们可以把你的配置类型抽成一个独立的类型别名,方便后续复用和维护:
// 定义原配置类型 type TextureConfig = { default?: boolean, multiply?: boolean, dark?: boolean };
接下来,用映射类型生成值类型替换后的新类型。映射类型会自动遍历原类型的所有键,并为每个键指定新的值类型,同时保留原属性的可选性:
// 生成键名与TextureConfig相同,值类型为[]的新类型 type TextureObject = { [K in keyof TextureConfig]: [] };
如果以后需要替换成其他值类型,还可以写一个更通用的工具类型,方便复用:
// 通用工具类型:替换任意类型的所有值类型为指定类型V type ReplaceValueType<T, V> = { [K in keyof T]: V }; // 用这个工具类型生成我们需要的TextureObject type TextureObject = ReplaceValueType<TextureConfig, []>;
修改你的函数
现在就可以在函数里直接使用这个新类型了,不用再手动重复键名:
function generateTextures(config: TextureConfig = {default: true, multiply: true, dark: true}) { // 用类型断言初始化,告诉TS后续会填充对应属性 const textures: TextureObject = {} as TextureObject; // 示例逻辑:根据config的开关生成对应的空数组 if (config.default !== false) { textures.default = []; } if (config.multiply !== false) { textures.multiply = []; } if (config.dark !== false) { textures.dark = []; } return textures; }
为什么这能行?
- 映射类型
[K in keyof T]会遍历原类型T的所有键(包括可选键),自动继承原属性的可选修饰符(比如原类型的default?: boolean会变成default?: [])。 - 这种方式能让新类型和原类型保持同步:如果以后你修改
TextureConfig的键(比如新增一个light?: boolean),TextureObject会自动更新对应的键,不用手动修改,大幅减少维护成本。
内容的提问来源于stack exchange,提问作者Yurii Horchynskyi
相关产品推荐
相关产品推荐

