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

如何在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规范中有详细说明:类型断言

  • 如何正确断言呢?

  • 定义如下 使用 出现下面的报错: 为什么在使用typeof的情况下ts对类型判断还是有问题?平常在消费联合类型的时候,都只需要借助typeof就能达到缩小类型范围的目的,但是这里没有效果,我想问下什么时候会出现这种问题? 我知道解决方案: 通过强制的类型断言来告诉ts这是一个函数 通过is关键字来做类型预测 但是不知道什么时候需要这么去解决,只有报错的时候才会尝试这么去解决,恳求大佬解惑。

  • TypeScript 类型检查机制包含三个部分: 类型推断 类型保护 类型兼容性 本节介绍其中的类型推断,类型推断主要用于那些没有明确指出类型的地方帮助确定和提供类型,这是 TypeScript 的一种能力。 类型推断是有方向的,要注意区分从左向右和从右向左两种推断的不同应用。 1. 慕课解释 类型推断的含义是不需要指定变量类型或函数的返回值类型,TypeScript 可以根据一些简单的规则推断其