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

TypeScript中如何为数组参数的对象单独映射对应属性类型?

解决方案

你遇到的问题根源在于泛型参数O被推断为数组元素的联合类型,导致O["required"]变成了true | false,条件判断O["required"] extends true等价于boolean extends true,结果永远为false,所以所有属性都被映射为string | undefined。

要实现每个属性根据自身required值单独映射类型,可以通过让泛型捕获数组的元组类型,并针对每个属性名提取对应元素的具体required值来解决:

function example<T extends { property: string; required: boolean }[]>(
  arr: [...T]
): {
  [K in T[number]["property"]]: 
    Extract<T[number], { property: K }>["required"] extends true
      ? string
      : string | undefined;
};

example([
  { property: "hey", required: true },
  { property: "ho", required: false },
]);
// 正确返回类型:{ hey: string; ho: string | undefined }

关键改动说明:

  • 使用[...T]的rest参数语法:强制TypeScript将输入数组推断为元组类型,而非宽泛的数组联合类型,这样能保留每个元素的具体类型信息。
  • Extract<T[number], { property: K }>:从元组的元素类型中,精准提取出属性名为K的那个元素类型,确保它的required是具体的true或false,而非联合的boolean。
  • 条件判断基于单个元素的required值:此时每个属性的类型映射都会根据自身对应的required值独立判断,不会被其他元素的required值影响。

内容的提问来源于stack exchange,提问作者Dan Knights

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 10:45:28