我正在尝试这样做:
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
我无法访问script元素的' type‘成员,除非我将其强制转换为正确的类型,但我不知道如何做到这一点。我搜索了文档和样本,但什么也找不到。
发布于 2012-10-02 16:47:36
TypeScript使用'<>‘包围类型转换,因此上面的代码变成:
var script = <HTMLScriptElement>document.getElementsByName("script")[0];
然而,不幸的是,您不能这样做:
var script = (<HTMLScriptElement[]>document.getElementsByName(id))[0];
你会得到错误
Cannot convert 'NodeList' to 'HTMLScriptElement[]'
但是你可以这样做:
(<HTMLScriptElement[]><any>document.getElementsByName(id))[0];
发布于 2014-01-16 07:48:40
从TypeScript 0.9开始,lib.d.ts
文件使用专门的重载签名,为getElementsByTagName
调用返回正确的类型。
这意味着您不再需要使用类型断言来更改类型:
// No type assertions needed
var script: HTMLScriptElement = document.getElementsByTagName('script')[0];
alert(script.type);
发布于 2017-04-21 01:18:54
不要使用类型强制转换。绝不可能。使用类型保护:
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中缺少的类,它将对您有很大帮助。
https://stackoverflow.com/questions/12686927
复制相似问题