我正在尝试这样做:
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
除非我将其转换为正确的类型,否则我无法访问脚本元素的“类型”成员,但我不知道如何做到这一点。我搜索了文档
不要打字。从不使用类型防护装置:
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中缺少的类,它将对您有很大帮助。
从TypeScript 0.9开始,lib。d、 ts
文件使用专门的重载签名,为调用getElementsByTagName
返回正确的类型。
这意味着您不再需要使用类型断言来更改类型:
// No type assertions needed
var script: HTMLScriptElement = document.getElementsByTagName('script')[0];
alert(script.type);
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];
本节介绍类型断言,有使用关键字 as 和标签 <> 两种方式,因后者会与JSX 语法冲突,建议统一使用 as 来进行类型断言。 1. 慕课解释 TypeScript 允许你覆盖它的推断,毕竟作为开发者你比编译器更了解你写的代码。 类型断言主要用于当 TypeScript 推断出来类型并不满足你的需求,你需要手动指定一个类型。 2. 关键字 as 当你把 JavaScript 代码迁移到 TypeS
编辑:OK,在typescript规范中有详细说明:类型断言
如何正确断言呢?
我在项目中定义了两个 interface , 接下有个函数是处理这两个类型的 我自己想到了用 js 的 is 关键词去判断某个属性是否存在来具体区分这两个 interface ,但是这样好像已经到了 js 的层面了。 问题:在 TS 层面有没有可以实现的方式呢?
定义如下 使用 出现下面的报错: 为什么在使用typeof的情况下ts对类型判断还是有问题?平常在消费联合类型的时候,都只需要借助typeof就能达到缩小类型范围的目的,但是这里没有效果,我想问下什么时候会出现这种问题? 我知道解决方案: 通过强制的类型断言来告诉ts这是一个函数 通过is关键字来做类型预测 但是不知道什么时候需要这么去解决,只有报错的时候才会尝试这么去解决,恳求大佬解惑。