TypeScript中如何让函数返回类型T指定属性的类型数组?
实现类型安全的extractDistinct函数
要让TypeScript自动推导返回值为目标字段的类型数组,核心是利用泛型关联数组元素类型与字段名,具体实现如下:
function extractDistinct<T, K extends keyof T>(array: T[], fieldName: K): T[K][] { const distinctValues = new Set(array.map(item => item[fieldName])); return Array.from(distinctValues); }
代码说明
- 泛型
T:代表数组中元素的类型,由传入的数组自动推断。 - 泛型
K extends keyof T:约束fieldName必须是T类型的合法属性名,同时让TypeScript关联到该属性对应的类型T[K]。 - 返回值直接定义为
T[K][],无需手动类型断言,TypeScript会根据输入自动推导具体类型。
使用示例
// 定义示例类型 type User = { id: number; name: string; role: 'admin' | 'user' | 'guest'; }; const users: User[] = [ { id: 1, name: 'Alice', role: 'admin' }, { id: 2, name: 'Bob', role: 'user' }, { id: 3, name: 'Alice', role: 'admin' }, { id: 4, name: 'Charlie', role: 'guest' }, ]; // 自动推导返回类型为string[] const distinctNames = extractDistinct(users, 'name'); // 自动推导返回类型为("admin" | "user" | "guest")[] const distinctRoles = extractDistinct(users, 'role'); // 自动推导返回类型为number[] const distinctIds = extractDistinct(users, 'id');
这样实现后,函数不仅能校验fieldName的合法性,还能让返回值类型完全匹配目标字段的类型,彻底告别手动类型断言。
内容的提问来源于stack exchange,提问作者Oli
相关产品推荐
相关产品推荐

