我想在TypeScript中创建一个Map接口,但我似乎无法弄清楚如何约束属性访问器以取悦编译器
export interface IMap<I extends string | number, T> {
[property: I]: T;
}
索引签名类型必须是'string'或'number'
答案 0 :(得分:10)
您可以定义字符串和数字索引签名。
来自spec:
对象类型最多只能包含一个字符串索引签名和一个数字索引签名。
所以你可以这样做:
interface IMap<T> {
[index: string]: T;
[index: number]: T;
}
那是你所追求的吗?
此外,当您仅定义字符串索引签名时:
具体而言,在类型为T的字符串索引签名的类型中,所有属性和数字索引签名必须具有可分配给T的类型。
所以:
class Foo {
[index: string]: number;
}
let f = new Foo();
f[1] = 1; //OK
f[6] = "hi"; //ERROR: Type 'string' is not assignable to type 'number'