为什么我的 JSDoc 类型定义与 VS Code 中的 null 联合的悬停不显示 null 作为联合的一部分?

Why does the hover for my JSDoc type definition unioning with null in VS Code not show null as part of the union?

提问人: 提问时间:11/12/2023 最后编辑:starball 更新时间:11/16/2023 访问量:40

问:

我使用 JSDoc 和 VSCode 中的类型检查进行了以下类定义。在其中,它应该显示 和 作为联合类型的类型,但未定义,但它没有,只显示它们的默认类型。LinkedListjsconfig.jsonvaluenext

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)} */
javascript typescript visual-studio-code jsdoc

评论

0赞 Xiduzo 11/13/2023
你的界面会错吗?如果你把它放到* @param {LinkedListNode | null | undefined} next

答:

0赞 user20668178 11/13/2023 #1

事实证明,我忘记了一些重要的事情。

在我的我忘了放.事实证明,在这种情况下禁用了工会。jsconfig.json"strict": truenullish

因此,在将它放入我的 中并重新加载 VSCode 后,它现在在工具提示上正确显示联合。jsconfig.json

0赞 starball 11/13/2023 #2

这个问题的提出者已经给出了一种正确的答案,那就是你可以使用 strict 属性jsconfig.json的编译器选项中更改这种行为。

但他们错过了两件重要的事情:

  1. 该属性不是直接感兴趣的属性。感兴趣的实际配置属性是 strictNullChecks,它默认为 if 设置为 ,否则默认为 。stricttruestricttruefalse

  2. jsconfig.json实际上具有可在 VS Code 设置中配置的隐式默认值 - 特别是那些以 “” 开头的默认值(这是一个有点晦涩的事实,尽管在相关文档中有它存在的痕迹/提示)。此处感兴趣的特定设置是 ,默认为 truejs/ts.implicitProjectConfig.js/ts.implicitProjectConfig.strictNullChecks

因此,如果将其与问题中的问题描述拼凑在一起,首先要检查的是,您没有意外地将 VS Code 设置设置为 。js/ts.implicitProjectConfig.strictNullChecksfalse