如何使TypeScript函数getWithOverrides返回强类型数组而非string[]?
解决TypeScript泛型K无法正确推断为NewOptions键的问题
你的问题出在泛型参数的声明顺序和约束逻辑上。当前TypeScript无法自动将K推断为NewOptions的键,因为K被放在泛型参数第一位,TypeScript会优先尝试推断K,而非从传入的newOptions对象中提取键类型。
修改方案如下:
export const getWithOverrides = < NewOptions extends { [key: string]: boolean | undefined }, K extends keyof NewOptions = keyof NewOptions >( newOptions: NewOptions, overrides: { [x in K]?: boolean } ): K[] => (Object.keys(newOptions) as K[]).filter(key => { if (typeof overrides[key] === 'boolean') { return overrides[key]; } return newOptions[key]; }); const hi = getWithOverrides({ s: true, bb: true }, { s: true }); // 此时hi的类型为("s" | "bb")[]
关键修改点:
- 将
NewOptions作为第一个泛型参数,让TypeScript先推断传入对象的具体类型 - 让
K继承自keyof NewOptions并设置默认值,确保TypeScript自动将K推断为NewOptions的键联合类型 - 调整
Overrides的约束,直接基于K定义,保证类型一致性
这样修改后,hi的类型会正确推断为('s'|'bb')[],符合预期。
内容的提问来源于stack exchange,提问作者Ziv
相关产品推荐
相关产品推荐

