如何让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
实现说明
- 泛型参数设计:新增泛型
U并设置默认值为T[K],对应未传入modify时返回原属性类型 - 回调类型约束:
modify参数的类型为(value: T[K]) => U,确保回调接收的参数是属性的正确类型,返回值类型决定函数最终返回类型 - 默认值类型适配:由于TypeScript无法自动推断默认
identity函数与泛型U的匹配关系,通过as (value: T[K]) => U做类型断言,让默认值符合类型约束
内容的提问来源于stack exchange,提问作者James Long
相关产品推荐
相关产品推荐

