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

如何让TypeScript识别函数返回值为其参数回调的返回类型?

实现带可选modify回调的类型安全access函数

原实现回顾

原有TypeScript函数可以正确推断访问对象属性后的返回类型:

function access<T, K extends keyof T>(object: T, key: K): T[K] {
    return object[key];
}

const object: Record<string, any> = {
    zero: 0,
    one: 1,
    two: "2",
};
const one = access(object, "one"); // 推断为number类型
const two = access(object, "two"); // 推断为string类型

需求与问题

需要给该函数添加可选的modify回调参数,用于修改获取到的属性值,同时要求TypeScript能正确推断返回类型:

  • 传入Boolean回调时,返回值为boolean类型
  • 不传回调时,返回原属性类型
  • 传入Number回调时,返回值为number类型

此前尝试的泛型写法要么导致未传回调时类型变为unknown,要么限制回调必须返回输入类型,无法满足需求。

正确实现方案

通过为泛型参数设置默认值,并对默认回调做类型断言,可以实现预期的类型推断:

function identity<T>(x: T): T {
    return x;
}

function access<T, K extends keyof T, U = T[K]>(
    object: T,
    key: K,
    modify: (value: T[K]) => U = identity as (value: T[K]) => U
): U {
    return modify(object[key]);
}

// 测试用例
const object = {
    zero: 0,
    one: 1,
    two: "2",
};
const zero = access(object, "zero", Boolean); // 类型推断为boolean
const one = access(object, "one"); // 类型推断为number
const two = access(object, "two", Number); // 类型推断为number

实现说明

  1. 泛型参数设计:新增泛型U并设置默认值为T[K],对应未传入modify时返回原属性类型
  2. 回调类型约束:modify参数的类型为(value: T[K]) => U,确保回调接收的参数是属性的正确类型,返回值类型决定函数最终返回类型
  3. 默认值类型适配:由于TypeScript无法自动推断默认identity函数与泛型U的匹配关系,通过as (value: T[K]) => U做类型断言,让默认值符合类型约束

内容的提问来源于stack exchange,提问作者James Long

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 03:42:23