TypeScript TS 5.4.5:性能.getEntriesByType的返回类型不准确,

ivqmmu1c  于 6个月前  发布在  TypeScript
关注(0)|答案(4)|浏览(51)

编译目标

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

wsewodh2

wsewodh21#

@RyanCavanaugh 我想深入研究这个问题并着手解决。我是这个项目的新贡献者。

8wigbo56

8wigbo562#

TypeScript/tests/lib/lib.d.ts
第12203行 in cde45aa
| | interfacePerformance{ |
我认为我需要在这里做一些修改,但是我需要做什么?

ehxuflar

ehxuflar3#

我认为我需要在这里做一些改变,但是我需要做什么呢?
我会使用函数签名重载。这只是一堆不同的函数头定义,用于描述相同函数的不同参数组合和返回类型。
为每个单独的类型字符串定义一个签名重载函数 - 参见 here for the list of string constants and what object type is returned for each - 并为该特定输入字符串常量添加相应的返回类型。
对于每种字符串常量和返回对象的组合,这是14行(如果我数对了)的一个函数头定义。
我最喜欢函数签名重载,因为没有魔法,它们比“类型魔法”的东西更易读。你看到的就是你得到的,它写得很明白,没有类型计算和变量/类型参数/泛型,或者 ifs 或三元运算符,或者索引访问到某个辅助接口类型或其他东西。
显然,你可以将多个方法条目写入接口中吗?类型示例:Playground链接 - 我为一个项目演示了它。您可能还需要为各种返回对象创建接口,乍一看,我没有看到例如 "PerformanceElementTiming" 声明。我认为它们都继承自“PerformanceEntry”(因此继承也需要添加到每个新对象接口中),这已经定义过了。
估计的工作量:大约半个小时的纯打字和打开 MDN 页面的时间,以及检查,几乎不需要思考。我想是这样的。

rdrgkggo

rdrgkggo4#

暂时我只会做 entry as PerformanceNavigationTiming

相关问题