我正在将一些特定于Internet Explorer 6-9的非常古老的ASP.NET WebForms JavaScript转换为TypeScript,但我不知道如何声明Internet Explorer的各种专有JavaScript DOM扩展。
例如,Internet Explorer的document.all
集合允许按名称对元素进行索引,而lib.dom.d.ts
的{{1}}接口仅公开HTMLAllCollection
索引器:
[index: number]
所以我想我可以用自己的代码扩展它:
interface HTMLAllCollection {
readonly length: number;
item(nameOrIndex?: string): HTMLCollection | Element | null;
namedItem(name: string): HTMLCollection | Element | null;
[index: number]: Element;
}
但这会破坏一切,因为向接口添加字符串索引器意味着接口上的所有其他属性还必须返回与字符串索引器(interface HTMLAllCollection {
[name: string]: HTMLElement;
}
)相同的类型,在这种情况下,这是错误的,因为,例如,HTMLElement
属性必须返回length
。本文对此进行了解释:https://basarat.gitbooks.io/typescript/docs/types/index-signatures.html
幸运的是,Internet Explorer 6中添加了the namedItem
getter,并且我正在使用的网站不需要IE 5.5兼容性(phe!),因此,现在我可以将number
替换为document.all["name"].value = "bar"
但是将来还有其他具有类似技巧的DOM接口-那么如何正确处理呢?
答案 0 :(得分:0)
如何声明同时具有string
和number
的索引器呢?您提供的文章具有同时使用string
和number
索引器的示例。这种类型的定义是这样的:
interface ArrStr {
[key: string]: string | number; // Must accommodate all members
[index: number]: string; // Can be a subset of string indexer
// Just an example member
length: number;
}
参考链接:Index Signatures
How to declare a TypeScript indexer that accepts string|number?