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

TypeScript:基于可选泛型定义函数返回类型的问题

解决ArrayUtils.toMap的类型报错问题

方法一:使用函数重载(推荐)

类的静态方法重载需要用函数声明形式(箭头函数不支持重载),通过重载明确两种调用场景的类型:

export default class ArrayUtils {
  /** Return a map from array like { [key]: value } */
  static toMap<T>(array: T[], key: (item: T) => string | number): { [key: string | number]: T };
  static toMap<T, V>(array: T[], key: (item: T) => string | number, value: (item: T) => V): { [key: string | number]: V };
  static toMap<T, V = T>(
    array: T[],
    key: (item: T) => string | number,
    value?: (item: T) => V
  ): { [key: string | number]: V } {
    return Object.fromEntries(
      array.map(item => [key(item), value ? value(item) : item])
    );
  }
}

这种方式的优势:

  • 自动推断类型:不传value时,返回值的value类型为数组项本身;传入value时,类型匹配生成器的返回值
  • 类型安全:如果显式指定V却不传value,TypeScript会直接报错

方法二:优化泛型与类型断言

如果坚持使用箭头函数,可以通过调整泛型默认值+类型断言解决报错:

export default class ArrayUtils {
  /** Return a map from array like { [key]: value } */
  static toMap = <T, V = T>(
    array: T[],
    key: (item: T) => string | number,
    value: (item: T) => V = ((item: T) => item) as (item: T) => V
  ): { [key: string | number]: V } => {
    return Object.fromEntries(array.map(item => [key(item), value(item)]));
  };
}

注意:这种方式存在潜在风险——如果用户显式指定V但不传value,TypeScript不会报错,运行时会返回T类型的值,可能导致类型不匹配。

原代码报错原因

原泛型设计V = T2 extends void ? T : T2存在逻辑漏洞:当用户显式指定V(或T2)时,默认的value函数返回T类型,无法赋值给任意的V类型,因此触发类型不匹配报错。重载方案通过拆分调用场景,从根源上避免了这个问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 17:33:20