如何声明一个接受字符串数的TypeScript索引器?

ehd*_*hdv 3 typescript

我正在尝试d.ts为API 编写一个文件,该文件的集合对象表示键值对的有序集合.键和值都是字符串.因此,行为是:

  • thing["foo"] 返回键为"foo"的对的字符串值
  • thing[1] 返回有序集合中第二对的字符串值
  • thing.length 将键值对的计数作为数字返回

我尝试了以下,但它产生了错误"An index signature parameter must be type 'string' or 'number':

declare class FrobCollection {
    [index: string|number] : string;

}
Run Code Online (Sandbox Code Playgroud)

有没有办法在TypeScript中正确建模此对象的行为?

编辑:我找到了一种方法来模拟两个索引器,但仍然无法使该length属性工作.

Rya*_*ugh 5

  • thing ["foo"]返回键为"foo"的对的字符串值
  • thing [1]返回有序集合中第二对的字符串值
  • thing.length将键值对的计数作为数字返回

问题是第一颗子弹并不适用于所有的值"foo".例如,thing["0"]是一个字符串,但是thing["length"]是一个数字,对于任意字符串,x您实际上无法预测其类型thing[x]

这种类型的准确定义是:

declare class HeaderCollection {
    length: number;
    [index: number]: string;
    [key: string]: number|string;
}
Run Code Online (Sandbox Code Playgroud)

它是给调用者,以确保它们实际上是由不与一些保留名称,如匹配的值索引length,或者说实际上是一个数字的字符串.