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

TypeScript中array_2_dict函数默认参数类型不匹配错误解决

解决TypeScript泛型默认值类型不匹配错误

错误原因

当前代码中,泛型V与T未建立关联,TypeScript无法保证默认回调return_self_cb返回的T类型一定兼容V类型(V可被实例化为任意与T无关的类型),因此抛出类型不匹配错误。

解决方案

方案一:为泛型V设置默认类型(推荐)

修改泛型参数定义,将V的默认类型设为T。这样当用户省略get_item_cb时,V会自动推断为T,与return_self_cb的返回类型匹配;若需要将T转换为其他类型,只需传递对应回调函数,TypeScript会自动推断V的实际类型。

修改后的完整代码:

/** return self callback */
export function return_self_cb<T>(item: T): T {
  return item;
}

/** convert array to dict<key, item> */
export function array_2_dict<T, K extends string | number | symbol, V = T>(
    items: T[],
    get_key_cb: (item: T) => K,
    get_item_cb: (item: T) => V = return_self_cb
): Record<K, V> {
  const dict = {} as Record<K, V>;

  for (let item of items) {
    const key = get_key_cb(item);
    dict[key] = get_item_cb(item);
  }

  return dict;
}

方案二:类型断言(不推荐)

若不想修改泛型参数结构,可通过类型断言强制让TypeScript接受默认值,但这种方式会丢失类型安全校验——当V被指定为与T不兼容的类型时,可能导致运行时错误。

修改get_item_cb的默认值部分:

get_item_cb: (item: T) => V = return_self_cb as (item: T) => V

使用示例

  • 省略get_item_cb,直接将数组元素作为字典值:
const users = [{id: 1, name: 'Alice'}, {id: 2, name: 'Bob'}];
const userDict = array_2_dict(users, item => item.id);
// userDict 类型为 Record<number, {id: number; name: string}>
  • 传递get_item_cb转换元素类型:
const userNameDict = array_2_dict(users, item => item.id, item => item.name);
// userNameDict 类型为 Record<number, string>

内容的提问来源于stack exchange,提问作者He.Su

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 10:55:10