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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 18:43:12