TypeScript类方法泛型推断优化:如何简化getProp的类型参数传入
TypeScript getProp 泛型简化实现方案
核心问题说明
TypeScript 目前不支持部分泛型参数推断:只要手动指定了任意一个泛型参数,剩余未指定的泛型就不会自动推导,这是原写法需要传入3个泛型参数的根本原因。另外原定义中的V泛型是完全冗余的,V等价于T[K],可以直接删除。
最优实现方案(柯里化拆分泛型层)
把需要手动指定的泛型T单独放在外层函数,需要自动推断的泛型K放在内层函数,即可实现期望的调用效果:
// 方法定义 public getProp<T extends Record<string, any>>() { return async <K extends Extract<keyof T, string>>(prop: K): Promise<T[K] | undefined> => { const result: Partial<T> = await this.getProps<T>([prop]); return result?.[prop]; }; } // 调用示例 private async exampleUsage() { // 仅需指定一次T,参数和返回值自动完成类型推断 const result2 = await this.getProp<{ foo: Date; bar: number }>()('foo'); // result2 自动推断类型为:Date | undefined }
可选简化方案(无需额外括号)
如果你不想多写一层括号,也可以用类型占位参数的方式实现,运行时多传入的占位参数不会产生实际副作用:
// 方法定义 public async getProp< T extends Record<string, any>, K extends Extract<keyof T, string> >(prop: K, _typePlaceholder?: T): Promise<T[K] | undefined> { const result: Partial<T> = await this.getProps<T>([prop]); return result?.[prop]; } // 调用示例 private async exampleUsage() { const result2 = await this.getProp('foo', null as { foo: Date; bar: number }); // result2 自动推断类型为:Date | undefined }
内容的提问来源于stack exchange,提问作者Hawxby
相关产品推荐
相关产品推荐

