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

如何使用泛型访问另一类型的类型值以约束参数类型

解决方案

要实现根据第一个参数的feature类型,约束第二个参数variation对象的键类型,你需要在泛型中明确绑定feature的具体键类型,从而提取对应的值类型作为键的约束。

修改后的函数实现

enum Feats {
  feature1 = 'feature1',
  feature2 = 'feature2',
}

type Features = {
  [Feats.feature1]: 'maybeThis' | 'maybeThat';
  [Feats.feature2]: 'true' | 'false';
};

// 新增泛型参数K,绑定feature的具体键类型
function useFeature<T, K extends keyof T>(
  feature: K,
  opts: { variation: Record<T[K], () => void> },
) {}

// 正常运行:variation的键符合feature1对应的类型
const a = useFeature(Feats.feature1, {
  variation: { maybeThis: () => {} },
});

// 报错:hello不属于'maybeThis' | 'maybeThat'
const b = useFeature(Feats.feature1, {
  variation: { hello: () => {} },
});

关键说明

  • 新增泛型参数K extends keyof T,用来捕获传入的feature的具体键类型,而非模糊的keyof T。
  • 使用Record<T[K], () => void>约束variation对象:T[K]会提取feature对应的值类型(比如传入Feats.feature1时,T[K]就是'maybeThis' | 'maybeThat'),确保variation的键只能是该类型的有效值。
  • TypeScript会自动推导泛型参数,调用时无需手动指定,比如:
    const c = useFeature(Feats.feature2, {
      variation: { 'true': () => {} },
    });
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 11:26:11