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

如何让TypeScript中Record的value函数参数匹配对应key的类型?

解决TypeScript转换器函数参数与类型匹配问题

当前代码中converter的函数参数被统一定义为Filters联合类型,导致每个函数内部需要手动做类型断言才能访问对应子类型的属性。我们可以通过映射类型+条件类型让每个key对应的函数参数自动匹配对应的Filter子类型,无需断言。

修改后的完整代码

type Filter1 = {
  type: 'filter1',
  value1: number
}

type Filter2 = {
  type: 'filter2',
  value2: number;
}

type Filters = Filter1 | Filter2;

// 定义映射类型,为每个filter type匹配对应的具体类型
type Converter = {
  [K in Filters['type']]: (filter: Extract<Filters, { type: K }>) => string;
};

const converter: Converter = {
  filter1: (filter) => {
    // filter自动推断为Filter1类型
    return filter.value1.toString(); 
  },
  filter2: (filter) => {
    // filter自动推断为Filter2类型
    return filter.value2.toString(); 
  },
};

核心原理说明

  • Extract<Filters, { type: K }>:从Filters联合类型中精准提取出type属性等于K的子类型,比如当K为'filter1'时,返回Filter1类型。
  • 映射类型{ [K in Filters['type']]: ... }:遍历Filters所有的type值,为每个type生成对应的函数类型,确保函数参数与当前type对应的Filter子类型完全匹配。
  • 经过这样的定义,TypeScript会自动推断每个函数的filter参数类型,无需手动断言,既保证了类型安全,也简化了代码。

内容的提问来源于stack exchange,提问作者Dávid Molnár

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 02:24:58