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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 14:32:52