当前位置: 首页 > 知识库问答 >
问题:

如何在TypeScript中断言HTMLElement的类型?

梁丘俊人
2023-03-14

我正在尝试这样做:

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

除非我将其转换为正确的类型,否则我无法访问脚本元素的“类型”成员,但我不知道如何做到这一点。我搜索了文档

共有3个答案

卓宏达
2023-03-14

不要打字。从不使用类型防护装置:

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中缺少的类,它将对您有很大帮助。

百里俭
2023-03-14

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

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

// No type assertions needed
var script: HTMLScriptElement = document.getElementsByTagName('script')[0];
alert(script.type);
董和泽
2023-03-14

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关键字来做类型预测 但是不知道什么时候需要这么去解决,只有报错的时候才会尝试这么去解决,恳求大佬解惑。