我有这个功能:
interface NumDict<T> {
[key : number] : T
}
export function mapNumDictValues<T,R>(dict: NumDict<T>, f: (v: T, key?: number) => R): NumDict<R> {
let emptyDict : NumDict<R> = {};
return Object.keys(dict).reduce((acc, key) => {
const keyInt = parseInt(key);
acc[keyInt] = f(dict[keyInt], keyInt);
return acc;
}, emptyDict);
}
现在我希望它适用于字符串索引的字典以及数字索引的字典,例如就像是:
function mapDictValues<K extends string|number,T,R>(obj: {[id: K]: T}, f: (v: T, key?: K) => R): {[id: K]: R} {
但是,这使我出现此错误:
error TS1023: An index signature parameter type must be 'string' or 'number'.
有办法吗?
最佳答案
试试这个:
interface IStringToNumberDictionary {
[index: string]: number;
}
interface INumberToStringDictionary {
[index: number]: string;
}
type IDictionary = IStringToNumberDictionary | INumberToStringDictionary;
例子:
let dict: IDictionary = Object.assign({ 0: 'first' }, { 'first': 0 });
let numberValue = dict["first"]; // 0
let stringValue = dict[0]; // first
在您的情况下,如下所示:
interface IStringKeyDictionary<T> {
[index: string]: T;
}
interface INumberKeyDictionary<T> {
[index: number]: T;
}
type IDictionary<T> = IStringKeyDictionary<T> | INumberKeyDictionary<T>;