编译目标
ESNexr
库
lib.dom.d.ts
缺失/不正确的定义
getEntriesByType
的返回类型是许多不同对象类型的联合。可以在规范中看到一个列表,或者在 https://developer.mozilla.org/en-US/docs/Web/API/PerformanceEntry ("性能条目示例总是以下子类之一:: [可能的子类列表]")中。
返回类型可以(我认为应该)为 getEntriesByType
的相应字符串参数硬编码,因为可能的字符串常量数量有限,每个都恰好对应一个可能的返回类型。也许这个函数可以有一个重载的定义?
目前,返回类型设置为 PerformanceEntryList
,它实际上是 PerformanceEntry[]
,而该类型是一个只有最少条目的接口。
这导致当我使用例如 performance.getEntriesByType('navigation')
时,尝试访问从该查询获得的 PerformanceNavigationTiming
数组上的属性时会出现 TypeScript 错误。
示例代码
Playground Link
function pageWasRealoaded(): boolean {
return performance
.getEntriesByType('navigation')
// Error: TS2339: Property type does not exist on type PerformanceEntry
// This is wrong, because this is a PerformanceNavigationTiming object
.some(entry => entry.type === 'reload');
}
文档链接
https://developer.mozilla.org/en-US/docs/Web/API/PerformanceEntry
4条答案
按热度按时间wsewodh21#
@RyanCavanaugh 我想深入研究这个问题并着手解决。我是这个项目的新贡献者。
8wigbo562#
TypeScript/tests/lib/lib.d.ts
第12203行 in cde45aa
| | interfacePerformance{ |
我认为我需要在这里做一些修改,但是我需要做什么?
ehxuflar3#
我认为我需要在这里做一些改变,但是我需要做什么呢?
我会使用函数签名重载。这只是一堆不同的函数头定义,用于描述相同函数的不同参数组合和返回类型。
为每个单独的类型字符串定义一个签名重载函数 - 参见 here for the list of string constants and what object type is returned for each - 并为该特定输入字符串常量添加相应的返回类型。
对于每种字符串常量和返回对象的组合,这是14行(如果我数对了)的一个函数头定义。
我最喜欢函数签名重载,因为没有魔法,它们比“类型魔法”的东西更易读。你看到的就是你得到的,它写得很明白,没有类型计算和变量/类型参数/泛型,或者 ifs 或三元运算符,或者索引访问到某个辅助接口类型或其他东西。
显然,你可以将多个方法条目写入接口中吗?类型示例:Playground链接 - 我为一个项目演示了它。您可能还需要为各种返回对象创建接口,乍一看,我没有看到例如 "PerformanceElementTiming" 声明。我认为它们都继承自“PerformanceEntry”(因此继承也需要添加到每个新对象接口中),这已经定义过了。
估计的工作量:大约半个小时的纯打字和打开 MDN 页面的时间,以及检查,几乎不需要思考。我想是这样的。
rdrgkggo4#
暂时我只会做
entry as PerformanceNavigationTiming
。