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

