如何在TypeScript中创建通用Map接口

Chi*_*hic 7 typescript

我想在TypeScript中创建一个Map接口,但我似乎无法弄清楚如何约束属性访问器以取悦编译器

期望的界面

export interface IMap<I extends string | number, T> {
  [property: I]: T;
}
Run Code Online (Sandbox Code Playgroud)

错误:

索引签名类型必须是"字符串"或"数字"

Sea*_*mus 11

您可以定义字符串和数字索引签名.

规格:

对象类型最多可包含一个字符串索引签名和一个数字索引签名.

所以你可以这样做:

interface IMap<T> {
    [index: string]: T;
    [index: number]: T;
} 
Run Code Online (Sandbox Code Playgroud)

这就是你追求的吗?

此外,当您仅定义字符串索引签名时:

具体来说,在类型为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'
Run Code Online (Sandbox Code Playgroud)