是否可以做这样的事情:
fromPairs<T extends KeyValuePair<K, V>>(pairs: T[]): {[index: K]: V};
当然,K需要约束为number
或string
,不知道该怎么办。
我得到的错误是:
Cannot find name
代表K
和V
答案 0 :(得分:2)
我会这样写(带函数重载):
declare function fromPairs<V>(pairs: {key: string; value: V; }[]): {[index: string]: V};
declare function fromPairs<V>(pairs: {key: number; value: V; }[]): {[index: number]: V};
在TypeScript中使用通用的'key'类型参数通常没用 - string
几乎就是你想要的。
答案 1 :(得分:1)
首先,索引参数只能是string
或number
,因此使用[index: K]
是非法的。
其次,您尝试在通用约束中引用类型参数无法在TypeScript中完成,并且最终可能会出现Constraint of a type parameter cannot reference any type parameter from the same type parameter list
错误。
在您的情况下,似乎不需要T
类型参数,并且可以简化该功能:
function fromPairs<K, V>(pairs: KeyValuePair<K, V>[]): {[index: string]: V}
由于index
参数为string
(或number
),K
类型参数也变得毫无意义。因此,该函数可以具有以下签名:
function fromPairs<V>(pairs: KeyValuePair<any, V>[]): {[index: string]: V}