我有以下
LinkedList
类定义,使用 JSDoc 和 jsconfig.json
在 VSCode 中进行类型检查。在其中,它应该将 value
和 next
的类型显示为未定义的联合类型,但事实并非如此,只显示它们的默认类型。
class LinkedListNode {
/**
* @param {number | undefined} value
* @param {LinkedListNode | undefined} next
*/
constructor(value, next) {
/** @type {number} */
this.value = value ?? 0;
/** @type {LinkedListNode | null} */
this.next = next ?? null;
}
}
以下行为例,认为它适用于所有工会。
/** @type {LinkedListNode | null} */
this.next = next ?? null;
this.next
上的悬停消息当前未正确显示:
(property) LinkedListNode.next: LinkedListNode
我希望看到的:
(property) LinkedListNode.next: LinkedListNode | null
我尝试了以下方法,但都不起作用:
/** @type {LinkedListNode | null} */
/** @type {?LinkedListNode} */
/** @type {(LinkedListNode|null)} */
事实证明,我忘记了一些重要的事情。
在我的
jsconfig.json
中我忘记放入"strict": true
。在这种情况下,结果会禁用 nullish
联合。
因此,将其放入我的
jsconfig.json
并重新加载 VSCode 后,它现在可以在工具提示上正确显示联合。
这个问题的提问者已经给出了一种正确的答案,即您可以使用 strict
属性
在jsconfig.json 的编译器选项中更改此行为。
但是他们错过了两件重要的事情:
strict
财产并不直接是感兴趣的财产。真正感兴趣的配置属性是 strictNullChecks
,如果 true
设置为 strict
,则 defaults为
true
,否则默认为 false
。
jsconfig.json 实际上具有可在 VS Code 设置中配置的隐式默认值 - 特别是那些以“
js/ts.implicitProjectConfig.
”开头的默认值(有点晦涩难懂,但有记录)。这里感兴趣的特定设置是 js/ts.implicitProjectConfig.strictNullChecks
,默认为 true
。
因此,如果您将其与问题中的问题描述结合在一起,首先要检查的是您是否意外地将
js/ts.implicitProjectConfig.strictNullChecks
VS Code 设置设置为 false
。