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

如何使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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 21:50:35