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
相关产品推荐
相关产品推荐

