TypeScript JSDoc @类型未附加到for循环变量声明

xmjla07d  于 2022-10-29  发布在  TypeScript
关注(0)|答案(9)|浏览(250)

错误报告

据我所知,这是JSDoc用于正确记录循环变量类型的常见模式,但在VSCode中似乎不起作用。

🔎检索词

jsdoc for循环类型

🕗版本和回归信息

  • 这是我尝试的每个版本中的行为,我查看了关于JSDoc条目的FAQ。

Playground链接

https://www.typescriptlang.org/play?#code/GYewTgBAFA9AVHCABALgTwA4FMIG8ASAKgLIAyAogDZYC2WAdigL4RwwQDGI9AzihDhDAIAExAcArnUYA6AEYgRaGQEcJWMGgDKWahxTgAgpUpQA5DJRY+ZgJS28AKAguBMvmmoyRASx4ZKAEM0CABeCDN6biwzAG5HJiA

💻代码

for (/**@type {HTMLElement} */ const e of document.body.querySelectorAll('.test')) {
    e.style.display = 'none';
}

🙁实际行为

e被键入为元素

🙂预期行为

e应该被输入为HTMLElement,因为我已经通过@类型覆盖了它。
例如,如果我将代码更改为:

/**@type {HTMLElement} */ const e = document.body.querySelectorAll('.test');

VSCode正确地选择了我希望作为HTMLElement覆盖e(并抱怨缺少接口实现,但是,这不是这里的问题-事实上这是预期的!)

hs1rzwqc

hs1rzwqc1#

此外,对于那些需要变通方法的人,可以使用TypeScript的JS“cast”特性,但我发现使用它要困难得多:

for (const e of /**@type {NodeListOf<HTMLElement>} */ (document.body.querySelectorAll('.test')))
qzlgjiam

qzlgjiam2#

@Paril你知道这有多普遍吗?
这是一个重要的特性(尽管可能比较简单),因为Typescript在这里明确地禁止类型注解。所有的类型检查都必须从头开始添加。

3df52oht

3df52oht3#

在我通常使用的代码库中,来自Detailly Typed dependencies和我们的user tests + dependencies,我用grepped了for.+@type,没有发现任何现有的使用。
我确实在chrome-devtools-frontend中发现了3种cast语法的用法,在webpack中发现了1种,但是这些项目使用的是Closure或Typescript。
严格地说,这是一个新特性,我倾向于引用Closure和Typescript作为先例,并说在这里允许注解并没有多大用处。

xu3bshqb

xu3bshqb4#

我不确定它有多普遍,我不应该在最初的帖子中使用“通用模式”这个词,因为我实际上不确定它的用法,但它是我看到的一个模式,作为如何用JSDoc做这类事情的一个可接受的答案。否则,没有其他方法可以在for/foreach语句中注解变量,这似乎是一个奇怪的缺失特性。
这里明确禁止类型注解的原因是什么?我很好奇为什么其他上下文中的变量声明可以注解,而循环声明却不行,除非你把声明移到语句本身之外。我猜这只是感觉它应该“只是工作”,因为它紧挨在声明之前。
这两种变通方法要冗长得多,我认为在尝试在JS内部使用类型检查的上下文中,这种情况并不少见,因为querySelector和朋友们倾向于使用ElementChildNode和所有这些非特定的接口。

w1e3prcc

w1e3prcc5#

实际上,我想我找到了与此等价的TypeScript,并且我理解它不被接受的原因:
#25605的最大值
#3500
考虑到如何注解这个内联本质上是这个问题的JS版本,我看到了关闭这个问题的先例。
不过,后一个问题仍有待讨论;也许这应该只是移动到那个讨论?

fnatzsnv

fnatzsnv6#

@Paril我们读到了同样的东西!这仍然是一个独立于#3500的问题,但我想说这取决于那个问题。让我们把这个问题留着,一旦#3500被修复,这将是一个小工作量,以确保它在JS中也能工作。

46qrfjad

46qrfjad8#

另外,我刚刚意识到这个语法在VSCode中是完全有效的:

const substring = (/**@type {string} */ str, /**@type {number} */ start, end = str.length) => str.substring(start, end);

这不是一个很大的东西,但是,我认为这是一个很好的现有代码的例子,它与我所希望的类似(虽然这是一个参数,而不是一个局部变量,但是嘿,相同的区别)

jyztefdp

jyztefdp9#

已更改标签以匹配#3500

相关问题