JSDoc:来自文字的 Typedef

JHH*_*JHH 2 javascript intellij-idea jsdoc webstorm

让我们考虑以下代码,一个返回具有两个函数的对象的函数:

/**
 * Create a something
 * @returns {object} Something
 */
function createSomething() {
  return {
    /**
     * Foo!
     * @returns {string}
     */
    foo() { return 'foo';},

    /**
     * Bar!
     * @returns {string}
     */
    bar() { return 'bar';}
  };
}
Run Code Online (Sandbox Code Playgroud)

调用此方法时,即使返回类型很简单object,WebStorm 等 IDE 也会从返回的文字推断出类型,因此输入时createSomething().会建议成员foobar

但是,假设我需要将此对象传递给其他函数。为了让这些函数理解这是一个“东西”,我希望@typedef它,所以我执行以下操作:

/**
 * @typedef {object} Something
 */

/**
 * Create a something
 * @returns {Something} Something
 */
function createSomething() {
  return {
    /**
     * Foo!
     * @returns {string}
     */
    foo() { return 'foo';},

    /**
     * Bar!
     * @returns {string}
     */
    bar() { return 'bar';}
  };
}
Run Code Online (Sandbox Code Playgroud)

现在我们有了从 返回的对象的类型createSomething()。但是,由于显式声明了返回类型,IDE 不会自动从返回值推断任何成员,因此我们现在拥有一个没有任何已知成员的定义类型。

我当然可以@property在 中手动输入每个成员作为 a @typedef,如下所示:

/**
 * @typedef {object} Something
 * @property {function} foo
 * @property {function} bar
 */
Run Code Online (Sandbox Code Playgroud)

但是,这意味着每当我从对象中添加或删除任何成员时,都必须手动保持 typedef 同步Something

我尝试将语句放在 中@typedef的正上方,希望它能向 JSDoc 和 IDE 提示 typedef 具有以下文字中定义的成员,但无济于事 - a似乎总是被视为除明确指出的。returncreateSomething()@typedef {object}@property

有没有办法让 IDE 自动从返回的文字推断成员,同时为返回的对象定义类型?基本上我想要与使用 ES6 类时发生的情况相同 - 它自动成为一种所有方法都作为成员的类型。

de1*_*mar 5

您可以在对象初始值设定项之前使用@lends标记,如下所示:

function createSomething() {
  return /** @lends Something# */ {
    // properties
  }
}

/** @param {Something} s */
function f(s) {}
Run Code Online (Sandbox Code Playgroud)

WebStorm 明白这一点。请注意#在姓名后签名@lends