it-swarm-eu.dev

Jak specifikovat rozlišení a odmítnutí typu slibu v JSDoc?

Mám nějaký kód, který vrací slibný objekt, např. pomocí Q library pro NodeJS.

var Q = require('q');

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

Jak dokumentovat takovou návratovou hodnotu pomocí JSDoc?

57
Arikon

I když neexistují ve Javascriptu, zjistil jsem, že JSdoc rozumí "druhovým typům".

Takže můžete definovat své vlastní typy a pak použít /* @return Promise<MyType> */. Následující výsledek v souboru Nice TokenConsume (token) → {Promise. <Token>} s odkazem na váš vlastní Token typ v dokumentu.

/**
 * @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
}

Pracuje dokonce s /* @return Promise<MyType|Error> */ nebo /* @return Promise<MyType, Error> */.

41
Guilro

Mám tendenci definovat externí typ pro slib:

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

Nyní můžete v příkazu @return popsat dokumentaci funkce, co se stane s příslibem:

/**
* @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

S JSDoc můžete také vytvářet vlastní typy pomocí @typedef. Používám to docela dost, takže props/params, které jsou řetězce nebo pole odkaz na popis typu (jako pro string jsem vytvořil typedef, který zahrnuje domorodce k dispozici řetězec (viz příklad JSDoc níže) .Můžete definovat vlastní Toto je způsobeno tím, že nemůžete použít notaci objektu tečky pro návraty, jako je tomu u příkazu @property, který označuje, co je v návratu, takže v případech, kdy se něco vracíte jako objekt, můžete vytvořit definici tohoto typu ('@typedef MyObject) a potom @returns {myObject} Definition of myObject.

S tím bych se však nechtěl zbláznit, protože typy by měly být co nej doslovnější a nechcete znečišťovat své typy, ale existují případy, kdy chcete typ definovat explicitně, a tak můžete dokumentovat, co je v ní (dobrý příklad je Modernizr ... vrátí objekt, ale nemáte žádnou dokumentaci, takže vytvořte vlastní typedef, který popisuje, co je v tomto návratu).

Pokud tuto trasu nepotřebujete, můžete jako někdo, kdo již byl zmíněn, zadat více typů pro libovolný @param, @property nebo @return pomocí kanálu |.

Ve vašem případě byste také měli dokumentovat @throws, protože házíte 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

Syntaxe aktuálně podporovaná 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() {
     // ...
};

Podporováno v budoucnu?

/**
 * 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() {
    // ...
};

Viz github diskuse na adrese: https://github.com/jsdoc3/jsdoc/issues/1197

2
holmberd

Zde je to, co se mi líbí (což může být trochu přehnané):

/**
 * @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;
}

V zásadě definujte základní slib s odkazem na nějakou dokumentaci (v tomto případě jsem odkaz na jQuery jeden), definujte zpětná volání, která budou volána, když slib buď vyřeší nebo selže, pak definujte svůj konkrétní slib, který odkazuje zpět na dokumentace zpětného volání.

Jako typ návratu použijte konečný typ slibu.

0
niltz