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

TypeScript中如何让函数arr参数类型随attr动态解析?

问题描述

现有如下TypeScript代码:

const func = <T>(obj: T, attr: keyof T, arr: T[typeof attr][]) => {} 
const obj = {foo: 1, bar: true}; 
func(obj, 'foo', [1]); 
func(obj, 'bar', [1]); // 这里应该报错
func(obj, 'foo', [true]); // 这里应该报错
func(obj, 'bar', [true]);

当前代码中,arr参数的类型始终被解析为(number | boolean)[],无法根据传入的attr参数动态匹配obj对应属性的类型。需要调整arr的类型定义,让TypeScript在调用func时能根据实际传入的attr自动推断arr的正确类型,实现类型匹配校验。

解决方案

核心是给函数增加一个额外的泛型参数K,将其约束为keyof T,用来明确指定当前传入的attr对应的键类型,这样就能精准关联obj中该键对应属性的类型,进而约束arr的类型。

修改后的代码如下:

const func = <T, K extends keyof T>(obj: T, attr: K, arr: T[K][]) => {} 
const obj = {foo: 1, bar: true}; 
func(obj, 'foo', [1]); // 类型正确,无报错
func(obj, 'bar', [1]); // 类型不匹配,TS报错:类型“number”的参数不能赋给类型“boolean”的参数
func(obj, 'foo', [true]); // 类型不匹配,TS报错:类型“boolean”的参数不能赋给类型“number”的参数
func(obj, 'bar', [true]); // 类型正确,无报错

通过引入泛型K,TypeScript可以准确追踪attr对应的键,从而将arr的类型严格限定为obj[attr]的数组类型,实现了动态的类型依赖匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 10:57:14