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

时间:2015-08-06 17:22:48

标签: typescript

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

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

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

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

}

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

编辑:我找到了一种模拟两个索引器的方法,但仍无法使length属性生效。

2 个答案:

答案 0 :(得分: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;
}

由调用者确定它们实际上是通过与某个保留名称(如length不匹配的值)或实际为数字的字符串进行索引。

答案 1 :(得分:0)

我找到了一种似乎有效的方法,但我还没有完全测试它。

declare class HeaderCollection {
    [index: number] : string;
    [key: string] : string;
}

我认为这会引起抱怨,因为TypeScript通常不允许重载,但这次似乎并非如此。但是,我仍然无法声明length类型的number属性,所以我还没有走出困境。