我试着这样做:

var script:HTMLScriptElement = document.getElementsByName("script")[0];
alert(script.type);

但是它给了我一个错误

Cannot convert 'Node' to 'HTMLScriptElement': Type 'Node' is missing property 'defer' from type 'HTMLScriptElement'
(elementName: string) => NodeList

我不能访问脚本元素的'type'成员,除非我将其转换为正确的类型,但我不知道如何做到这一点。我查了文件和样本,但什么都没找到。


当前回答

var script = (<HTMLScriptElement[]><any>document.getElementsByName(id))[0];    

其他回答

这似乎解决了问题,使用[index: TYPE]数组访问类型,干杯。

interface ScriptNodeList extends NodeList {
    [index: number]: HTMLScriptElement;
}

var script = ( <ScriptNodeList>document.getElementsByName('foo') )[0];

不要进行类型转换。从来没有。使用类型保护:

const e = document.getElementsByName("script")[0];
if (!(e instanceof HTMLScriptElement)) 
  throw new Error(`Expected e to be an HTMLScriptElement, was ${e && e.constructor && e.constructor.name || e}`);
// locally TypeScript now types e as an HTMLScriptElement, same as if you casted it.

让编译器为您工作,并在您的假设错误时得到错误。

在这种情况下,它可能看起来太过了,但如果您稍后返回并更改选择器,例如添加dom中缺少的类,它将对您有很大帮助。

澄清一下,这是正确的。

无法将“NodeList”转换为“HTMLScriptElement[]”

作为一个NodeList不是一个实际的数组(例如,它不包含. foreach, .slice, .push等…)

因此,如果它在类型系统中转换为HTMLScriptElement[],如果您尝试调用Array,则不会得到类型错误。在编译时它上的原型成员,但在运行时它将失败。

如果TypeScript将HTMLCollection定义为返回类型而不是NodeList,则可以在声明文件(lib.d.ts)中解决。

DOM4还将此指定为正确的返回类型,但旧的DOM规范不太清楚。

参见http://typescript.codeplex.com/workitem/252

我们可以使用显式返回类型为变量类型:

const script: HTMLScriptElement = document.getElementsByName(id).item(0);

或assert as (TSX需要):

const script = document.getElementsByName(id).item(0) as HTMLScriptElement;

或者在更简单的情况下使用尖括号语法断言。


类型断言类似于其他语言中的类型强制转换,但不执行特殊的数据检查或重构。它对运行时没有影响,完全由编译器使用。

文档:

基本类型-类型断言