如何通过函数参数缩小泛型类型范围并实现TypeScript泛型参数自动推断
如何通过函数参数缩小泛型类型范围并实现TypeScript泛型参数自动推断
我太懂你想要的效果了——不用每次都手动给ManuallySetFrom泛型指定<From, To, FromKey>这些类型参数,而是通过传入函数的实际参数,让TypeScript自动帮你把这些泛型类型推断出来,还能把类型范围缩得更精准,对吧?咱们一步步来实现这个需求。
首先先把你给出的泛型类型再明确一下:
type ManuallySetFrom<From, To, FromKey> = { fromKey: FromKey fn: (from: From) => To }
接下来关键就是写对这个manuallySetFrom函数,要让它的参数和泛型参数建立直接关联,这样TypeScript的类型推断系统才能发挥作用。正确的函数实现应该是这样的:
export function manuallySetFrom<From, To, FromKey>( fromKey: FromKey, fn: (from: From) => To ): ManuallySetFrom<From, To, FromKey> { // 直接返回符合类型结构的对象即可 return { fromKey, fn }; }
咱们来举个实际的调用例子,你就能看到自动推断的效果了:
先定义一个测试用的类型:
// 假设我们有个用户类型 type User = { id: number; name: string; };
然后调用这个函数,完全不用手动指定泛型参数:
const userToId = manuallySetFrom("id", (user: User) => user.id.toString());
这时候你把鼠标悬停在userToId上,就能看到TypeScript自动推断出的完整类型:ManuallySetFrom<User, string, "id">。你看,它不仅自动识别了From是User、To是string,还把FromKey精准推断成了字面量类型"id",而不是宽泛的string类型——这就是通过函数参数缩小泛型类型范围的效果!
如果你还想加更严格的约束,比如要求fromKey必须是From类型里的某个键,那咱们可以给泛型加个extends约束,进一步缩小类型范围:
export function manuallySetFrom<From, To, FromKey extends keyof From>( fromKey: FromKey, fn: (from: From) => To ): ManuallySetFrom<From, To, FromKey> { return { fromKey, fn }; }
这时候如果你传入一个From类型里不存在的键,TypeScript会直接报错,比如:
// 这里会触发类型错误:"age"不是User类型的属性 const invalidMapping = manuallySetFrom("age", (user: User) => user.name);
最后再划几个关键点帮你理解:
- 泛型参数必须和函数的入参/返回值有直接关联,TypeScript才能从实际传入的值反向推导泛型类型
- 用
extends可以给泛型加约束,进一步缩小它的类型范围,让类型检查更严格 - 尽量让TypeScript自动推断泛型,既减少代码冗余,又能保证类型的准确性
备注:内容来源于stack exchange,提问作者JD Isaacks
相关产品推荐
相关产品推荐

