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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 12:24:05