我正在尝试为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
属性生效。
答案 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
属性,所以我还没有走出困境。