我正在try 编写一个函数,该函数接受一个对象数组,并对它们进行映射.该函数有两个可能的签名:
-
数据和密钥获取器:
type KeyMapOnly<T> = (data: T[], keyGetter: (itm: T) => string) => T[]
-
数据、键获取程序和值获取程序
type KeyAndValue<T, U> = ( data: T[], keyGetter: (itm: T) => string, valueGetter: (itm: T) => U ) => Record<string, U>
然而,当我试图将这两个放在一起时,我得到了错误.我到底做错了什么?
type KeyGetter<T> = (itm: T) => string
type ValueGetter<T, U> = (itm: T) => U
const identity = <T>(itm: T): T => itm
type IndexFunc = {
<T>(arr: T[], keyGetter: KeyGetter<T>): Record<string, T>
<T, U>(
arr: T[],
keyGetter: KeyGetter<T>,
valueGetter: ValueGetter<T, U>
): Record<string, U>
}
export const buildIndex: IndexFunc = (
arr,
keyGetter,
valueGetter = identity
) => {
const result = {} as any
for (const itm of arr) {
result[keyGetter(itm)] = valueGetter(itm)
}
return result
}
使用此配置时,我会收到以下错误:
Parameter 'arr' implicitly has an 'any' type.
Parameter 'keyGetter' implicitly has an 'any' type.
这两个参数都出现在both个函数重载中,所以我搞不懂它们怎么可能具有类型ANY.
-
data
始终是T[]
类型 -
keyGetter
始终是(itm: T) => string
类型
我到底做错了什么?