如何在TypeScript中声明Internet Explorer的`document.all [name:string]`索引器?

时间:2019-12-01 06:15:46

标签: typescript internet-explorer

我正在将一些特定于Internet Explorer 6-9的非常古老的ASP.NET WebForms JavaScript转换为TypeScript,但我不知道如何声明Internet Explorer的各种专有JavaScript DOM扩展。

例如,Internet Explorer的document.all集合允许按名称对元素进行索引,而lib.dom.d.ts的{​​{1}}接口仅公开HTMLAllCollection索引器:

lib.dom.d.ts:

[index: number]

所以我想我可以用自己的代码扩展它:

MyProject.ts

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接口-那么如何正确处理呢?

1 个答案:

答案 0 :(得分:0)

如何声明同时具有stringnumber的索引器呢?您提供的文章具有同时使用stringnumber索引器的示例。这种类型的定义是这样的:

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?