【问题标题】:How to create generic Map interface in TypeScript如何在 TypeScript 中创建通用 Map 接口
【发布时间】:2016-04-13 16:13:48
【问题描述】:

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

所需的接口

export interface IMap<I extends string | number, T> {
  [property: I]: T;
}

错误:

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

【问题讨论】:

  • 你正在尝试创建一个泛型。
  • 事实上,从今天开始,您只能使用 stringnumber 进行此操作

标签: typescript


【解决方案1】:

您可以同时定义字符串和数字索引签名。

来自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'

【讨论】:

  • 谢谢,但是我希望能够将接口用作IMap&lt;number, string&gt;IMap&lt;string, string&gt;,定义每次使用的索引类型。看来这是不可能的。
  • 啊,好的。嗯你是对的。你可以创建两个单独的接口,但这有点违背了目的。
  • 是的,它可能只有两种类型。如果 TypeScript 允许通过枚举进行索引,那么就更需要泛型了。
猜你喜欢
  • 2019-11-17
  • 1970-01-01
  • 2020-11-04
  • 2019-09-03
  • 1970-01-01
  • 2019-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多