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

