typescript - Typescript NetworkInformation 类型不包含所有属性
问题描述
我想访问NetworkInformation对象effectiveType
的downlink
属性。
我知道这些属性可能不存在,具体取决于浏览器,我正在检查如下:
const info: string[] = ['Downloading...'];
if ('connection' in window.navigator) {
info.push(`Connection Type: ${navigator.connection.effectiveType}`);
if ('downlink' in window.navigator.connection) {
info.push(`Speed: ${navigator.connection.downlink} MB/s`);
}
}
但是类型只包含type
属性。虽然当我在控制台中打印该对象时,它具有我期望的所有属性:
我应该怎么做才能克服打字稿错误?
类型“NetworkInformation”.ts(2339) 上不存在属性“下行链路”
解决方案
问题
for 的类型NetworkInformation
存在于lib.dom.d.ts
并且在撰写本文时看起来像这样:
interface NetworkInformation extends EventTarget {
readonly type: ConnectionType;
}
– lib.dom.d.ts L10430-L10432 @ 65ae16c
不幸的是downlink
,effectiveType
那里还没有(以及更多)。
DOM lib 实际上是由一个工具生成的:TypeScript-DOM-lib-generator。在自述文件中,它具有以下内容:
为什么我喜欢的 API 在这里仍然不可用?
一个功能需要得到两个或多个主要浏览器引擎的支持,以确保供应商之间达成良好共识:Gecko (Firefox)、Blink (Chrome/Edge) 和WebKit (Safari)。
–参考
当类型丢失时
自动算法可能决定浏览器不能很好地支持它,因此将其删除。假设我们要添加一个名为
Foo
. 检查MDN中是否有关于该接口的文档。如果有,请查看浏览器兼容性部分并检查它是否被两个或多个浏览器引擎支持。(请注意,基于 Chromium 的浏览器使用相同的浏览器引擎,因此它们的支持算作单一支持。)
–参考
检查浏览器兼容性表NetworkInformation
,在撰写本文时它看起来像这样:
铬合金 | 边缘 | 火狐 | IE浏览器 | 歌剧 | 苹果浏览器 | |
---|---|---|---|---|---|---|
NetworkInformation (实验性) |
61 ✅</td> | 79 ✅</td> | 没有❌</td> | 没有❌</td> | 48 ✅</td> | 没有❌</td> |
downlink (实验性) |
61 ✅</td> | 79 ✅</td> | 没有❌</td> | 没有❌</td> | 48 ✅</td> | 没有❌</td> |
downlinkMax (实验性) |
61 ✅</td> | 没有❌</td> | 没有❌</td> | 没有❌</td> | 没有❌</td> | 没有❌</td> |
effectiveType (实验性) |
61 ✅</td> | 79 ✅</td> | 没有❌</td> | 没有❌</td> | 48 ✅</td> | 没有❌</td> |
onchange (实验性) |
61 ✅</td> | 79 ✅</td> | 没有❌</td> | 没有❌</td> | 48 ✅</td> | 没有❌</td> |
ontypechange (实验性)(弃用)(非标准⚠️) |
没有❌</td> | 没有❌</td> | 没有❌</td> | 没有❌</td> | 未知❓</td> | 没有❌</td> |
rtt (实验性) |
61 ✅</td> | 79 ✅</td> | 没有❌</td> | 没有❌</td> | 48 ✅</td> | 没有❌</td> |
saveData (实验性) |
65 ✅</td> | 79 ✅</td> | 没有❌</td> | 没有❌</td> | 是的 | 没有❌</td> |
type (实验性) |
61 ✅</td> | 没有❌</td> | 没有❌</td> | 没有❌</td> | 没有❌</td> | 没有❌</td> |
在工人中可用(实验性) | 61 ✅</td> | 79 ✅</td> | 没有❌</td> | 没有❌</td> | 48 ✅</td> | 没有❌</td> |
–参考
查看上表,似乎只有基于 Blink/Chromium 的浏览器(Chrome、Edge 和 Opera)支持NetworkInformation
界面的各个部分。Gecko 和 WebKit 没有。因此,它不符合需要支持两个或更多主要浏览器引擎才能将 API 添加到类型的测试。
至于为什么NetworkInformation
甚至首先存在于类型中,我不知道。但是你可以看到它是如何通过GitHub 中lib.dom.d.ts
的责备进入的。
解决方案
您可以创作自己的类型或使用其他人在此处创作的类型。
推荐阅读
- javascript - 确定数字输入的内容
- intellij-idea - Intellij 配色方案去除白线
- apache-spark - 是否可以在同一个 Spark 会话中将两个不同的 csv 文件作为两个结构化流(两个表)加载
- html-framework-7 - 如何在 app.request 中显示预加载器以获取自动完成元素?
- tensorflow - 噪声向量的输入形状如何影响 GAN 中的生成器?
- c++ - 与stitching_detailed.cpp opencv有关的问题
- .net - 应用程序被 Microsoft AV 标记为病毒 - 不确定它发现可疑行为或尝试将其删除的方法
- json - 在 Dart 中将现有字符串转换为原始字符串
- java - XSD 到 Java 类 - 解析模式问题
- google-maps - Anylogic GIS 功能