it-swarm.xyz

Как указать разрешение и тип отклонения обещания в JSDoc?

У меня есть код, который возвращает объект обещания, например, используя Q библиотеку для NodeJS.

var Q = require('q');

/**
 * @returns ???
 */
function task(err) {
    return err? Q.reject(new Error('Some error')) : Q.resolve('Some result');
}

Как задокументировать такое возвращаемое значение с помощью JSDoc?

57
Arikon

Даже если они не существуют в Javascript, я обнаружил, что JSdoc понимает «универсальные типы».

Таким образом, вы можете определить свои собственные типы, а затем использовать /* @return Promise<MyType> */. Следующий результат в Nice TokenConsume (token) → {Promise. <Token>} со ссылкой на ваш пользовательский тип Token в документе.

/**
 * @typedef Token
 * @property {bool} valid True if the token is valid.
 * @property {string} id The user id bound to the token.
 */

/**
 * Consume a token
 * @param  {string} token [description]
 * @return {Promise<Token>} A promise to the token.
 */
TokenConsume = function (string) {
  // bla bla
}

Он даже работает с /* @return Promise<MyType|Error> */ или /* @return Promise<MyType, Error> */.

41
Guilro

Я склонен определять внешний тип для обещания:

/**
* A promise object provided by the q promise library.
* @external Promise
* @see {@link https://github.com/kriskowal/q/wiki/API-Reference}
*/

Теперь вы можете описать в инструкции @return вашей функциональной документации, что происходит с обещанием:

/**
* @return {external:Promise}  On success the promise will be resolved with 
* "some result".<br>
* On error the promise will be rejected with an {@link Error}.
*/
function task(err) {
    return err? Q.reject(new Error('Some error')) : Q.resolve('Some result');
}
7
miracula

С помощью JSDoc вы также можете создавать собственные типы, используя @typedef. Я использую это совсем немного, поэтому props/params, которые являются строками или массивами, ссылаются на описание типа (например, для string. Я создал typedef, который включает нативные элементы, доступные для строки (см. Пример JSDoc ниже). Вы можете определить пользовательский введите таким же образом. Это потому, что вы не можете использовать нотацию точки объекта для возвратов, как вы можете для @property обозначать то, что находится в возврате. Так что в случаях, когда вы возвращаете что-то вроде объекта, вы можете создать определение для этого типа ('@typedef MyObject) и затем @returns {myObject} Definition of myObject.

Я бы не стал сходить с ума от этого, потому что типы должны быть как можно более буквальными, и вы не хотите загрязнять ваши типы, но есть случаи, когда вы хотите явно определить тип, и поэтому вы можете задокументировать то, что в нем (хорошим примером является Modernizr ... он возвращает объект, но у вас нет документации по нему, поэтому создайте пользовательский typedef, который детализирует, что в этом возвращении).

Если вам не нужно идти по этому пути, то, как уже упоминалось, вы можете указать несколько типов для любого @param, @property или @return, используя канал |.

В вашем случае вы также должны задокументировать @throws, потому что вы бросаете new error: * @throws {error} Throws a true new error event when the property err is undefined or not available.

//saved in a file named typedefs.jsdoc, that is in your jsdoc crawl path
/**
    * @typedef string
    * @author me
    * @description A string literal takes form in a sequence of any valid characters. The `string` type is not the same as `string object`.
    * @property {number} length The length of the string
    * @property {number} indexOf The occurence (number of characters in from the start of the string) where a specifc character occurs
    * @property {number} lastIndexOf The last occurence (number of characters in from the end of the string) where a specifc character occurs
    * @property {string|number} charAt Gives the character that occurs in a specific part of the string
    * @property {array} split Allows a string to be split on characters, such as `myString.split(' ')` will split the string into an array on blank spaces
    * @property {string} toLowerCase Transfer a string to be all lower case
    * @property {string} toUpperCase Transfer a string to be all upper case
    * @property {string} substring Used to take a part of a string from a given range, such as `myString.substring(0,5)` will return the first 6 characters
    * @property {string} substr Simialr to `substring`, `substr` uses a starting point, and then the number of characters to continue the range. `mystring.substr(2,8)` will return the characters starting at character 2 and conitnuing on for 8 more characters
    * @example var myString = 'this is my string, there are many like it but this one is HOT!';
    * @example
    //This example uses the string object to create a string...this is almost never needed
    myString = new String('my string');
    myEasierString = 'my string';//exactly the same as what the line above is doing
*/
6
shadowstorm

Синтаксис, поддерживаемый в настоящее время Jsdoc3:

/**
 * Retrieve the user's favorite color.
 *
 * @returns {Promise<string>} A promise that contains the user's favorite color
 * when fulfilled.
 */
User.prototype.getFavoriteColor = function() {
     // ...
};

Поддерживается в будущем?

/**
 * A promise for the user's favorite color.
 *
 * @promise FavoriteColorPromise
 * @fulfill {string} The user's favorite color.
 * @reject {TypeError} The user's favorite color is an invalid type.
 * @reject {MissingColorError} The user has not specified a favorite color.
 */

/**
 * Retrieve the user's favorite color.
 *
 * @returns {FavoriteColorPromise} A promise for the user's favorite color.
 */
User.prototype.getFavoriteColor = function() {
    // ...
};

Смотрите обсуждение github по адресу: https://github.com/jsdoc3/jsdoc/issues/1197

2
holmberd

Есть также другой способ сделать это, даже если это может быть УСТАРЕЛО. Акцент на might, поскольку кто-то говорит, что он устарел (проверьте комментарии к этому ответу), в то время как другие говорят, что любой из них подойдет. Я все равно сообщаю об этом ради полноты.

Теперь возьмем Promise.all() например, который возвращает Promise, выполненный с массивом. При использовании стиля точечной нотации это будет выглядеть так, как показано ниже:

{Promise.<Array.<*>>}

Он работает с продуктами JetBrains (например, PhpStorm, WebStorm), а также используется в jsforce docs .

На момент написания статьи, когда я пытаюсь автоматически сгенерировать некоторые документы с помощью PHPStorm, по умолчанию используется этот стиль, хотя я нашел плохую ссылку на него.

В любом случае, если взять в качестве примера следующую функцию:

// NOTE: async functions always return a Promise
const test = async () => { 
    let array1 = [], array2 = [];

    return {array1, array2};
};

Когда я позволяю PhpStorm генерировать документы, я получаю это:

/**
 * @returns {Promise.<{array1: Array, array2: Array}>}
 */
const test = async () => {
    let array1 = [], array2 = [];

    return {array1, array2};
};
2
Francesco Casula

Вот что мне нравится делать (что может быть немного переусердствовало):

/**
 * @external Promise
 * @see {@link http://api.jquery.com/Types/#Promise Promise}
 */

/**
 * This callback is called when the result is loaded.
 *
 * @callback SuccessCallback
 * @param {string} result - The result is loaded.
 */

/**
 * This callback is called when the result fails to load.
 *
 * @callback ErrorCallback
 * @param {Error} error - The error that occurred while loading the result.
 */

/**
 * Resolves with a {@link SuccessCallback}, fails with a {@link ErrorCallback}
 *
 * @typedef {external:Promise} LoadResultPromise
 */

/**
 * Loads the result
 *
 * @returns {LoadResultPromise} The promise that the result will load.
 */
function loadResult() {
    // do something
    return promise;
}

По сути, определите базовое обещание со ссылкой на некоторую документацию (в данном случае я ссылаюсь на jQuery), определите ваши обратные вызовы, которые будут вызываться при разрешении или сбое обещания, затем определите ваше конкретное обещание, которое ссылается на документация обратного вызова.

Наконец, используйте ваш конкретный тип обещания в качестве типа возврата.

0
niltz