我试着这样做:

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'成员,除非我将其转换为正确的类型,但我不知道如何做到这一点。我查了文件和样本,但什么都没找到。


当前回答

从TypeScript 0.9开始,lib.d.ts文件使用专门的重载签名,为调用getElementsByTagName返回正确的类型。

这意味着你不再需要使用类型断言来改变类型:

// No type assertions needed
var script: HTMLScriptElement = document.getElementsByTagName('script')[0];
alert(script.type);

其他回答

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

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

或assert as (TSX需要):

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

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


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

文档:

基本类型-类型断言

从TypeScript 0.9开始,lib.d.ts文件使用专门的重载签名,为调用getElementsByTagName返回正确的类型。

这意味着你不再需要使用类型断言来改变类型:

// No type assertions needed
var script: HTMLScriptElement = document.getElementsByTagName('script')[0];
alert(script.type);

我还会推荐sitepen指南

https://www.sitepen.com/blog/2013/12/31/definitive-guide-to-typescript/(见下文)和 https://www.sitepen.com/blog/2014/08/22/advanced-typescript-concepts-classes-types/

TypeScript还允许你指定不同的返回类型 精确字符串作为函数的参数提供。例如, TypeScript对DOM的createElement方法的环境声明 看起来是这样的:

createElement(tagName: 'a'): HTMLAnchorElement;
createElement(tagName: 'abbr'): HTMLElement;
createElement(tagName: 'address'): HTMLElement;
createElement(tagName: 'area'): HTMLAreaElement;
// ... etc.
createElement(tagName: string): HTMLElement;

这意味着,在TypeScript中,当你调用e.g.。 document.createElement('video'), TypeScript知道返回值是 一个HTMLVideoElement,将能够确保你是交互的 正确地使用DOM视频API,而不需要任何类型断言。

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

因为它是一个节点列表,而不是数组,所以不应该使用括号或强制转换为数组。获取第一个节点的属性方法是:

document.getElementsByName(id).item(0)

你可以直接转换:

var script = <HTMLScriptElement> document.getElementsByName(id).item(0)

或者,扩展NodeList:

interface HTMLScriptElementNodeList extends NodeList
{
    item(index: number): HTMLScriptElement;
}
var scripts = <HTMLScriptElementNodeList> document.getElementsByName('script'),
    script = scripts.item(0);