如何为TypeScript泛型函数定义基于参数的动态返回类型?
TypeScript泛型函数动态返回属性子集类型的解决方案
你需要用TypeScript内置的Pick工具类型来实现这个需求,它专门用来从指定类型中提取指定属性的子集,完美匹配你要的动态返回类型效果。
正确的函数定义
修改泛型参数和返回类型,用Pick<T, K>作为返回类型即可:
type TestType = { value1: string, value2: number } function testFn<T, K extends keyof T>(...pick: K[]): Pick<T, K> { // 示例实现:从一个T类型的源对象中提取指定属性 const source: T = { value1: "demo", value2: 123 }; const result = {} as Pick<T, K>; pick.forEach(key => { result[key] = source[key]; }); return result; }
调用效果
现在调用时,返回类型会严格匹配你传入的属性:
// 返回类型为 { value1: string } const singleProp = testFn<TestType>("value1"); // 返回类型为 { value1: string; value2: number } const bothProps = testFn<TestType>("value1", "value2");
你之前写法的问题
你用Record<K, string | number>的问题主要有两点:
- 没有复用原类型
T中属性的具体类型,而是统一用string | number,丢失了类型的精准性; Record只是构造了一个键为K的对象,但无法关联T中对应属性的原始类型,所以达不到你要的子集类型效果。
内容的提问来源于stack exchange,提问作者KeonWoo Lee
相关产品推荐
相关产品推荐

