JSDoc: Typedef из буквального - PullRequest
       18

JSDoc: Typedef из буквального

2 голосов
/ 20 марта 2019

Давайте рассмотрим следующий код, функцию, которая возвращает объект с двумя функциями:

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

    /**
     * Bar!
     * @returns {string}
     */
    bar() { return 'bar';}
  };
}

При вызове этого метода, даже если тип возвращаемого значения просто object, IDE: как WebStormвыведите тип из возвращенного литерала, так что при наборе createSomething(). будут предложены члены foo и bar.100

Однако, скажем, мне нужно передать этот объект другим функциям.Чтобы эти функции могли понять, что это «что-то», я бы хотел @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';}
  };
}

Теперь у нас есть тип для объекта, возвращаемого из createSomething().Однако, поскольку тип возвращаемого значения указан явно, среда IDE NOT автоматически выведет любые члены из возвращаемого значения, поэтому теперь у нас есть определенный тип без каких-либо известных членов.101

Конечно, я могу вручную ввести каждый элемент как @property в @typedef, например:

/**
 * @typedef {object} Something
 * @property {function} foo
 * @property {function} bar
 */

Однако это означает необходимость синхронизации typedef вручнуювсякий раз, когда я добавляю или удаляю какие-либо элементы из объекта Something.

я пытался поместить @typedef чуть выше оператора return в createSomething(), надеясь, что это намекает JSDoc и IDE, чтоВ typedef члены определены в следующем литерале, но безрезультатно - @typedef {object}, кажется, всегда трактуется как не имеющее других членов, кроме явно указанных @property.

Есть ли способпозволить IDE автоматически выводить элементы из возвращенного литерала, одновременно определяя тип для возвращаемого объекта?По сути, я хочу того же, что и при использовании классов ES6 - он автоматически становится типом со всеми методами в качестве членов.

1 Ответ

4 голосов
/ 20 марта 2019

Вы можете использовать тег @ lends для этого до инициализации объекта, например:

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

/** @param {Something} s */
function f(s) {}

WebStorm это понимает. Пожалуйста, обратите внимание # знак после имени в @lends.

...