如何在JSDoc中正确定义自己的类类型?

Fur*_*man 3 javascript jsdoc webstorm ecmascript-6

我有一个简单的ES6类,我想知道如何在JSDoc中正确地描述它。请注意,我想定义自己的类型,稍后WebStorm自动完成功能将识别出该类型。

以下示例有效吗?

/**
* @typedef {Object} View
* @class
*/
class View{...}
Run Code Online (Sandbox Code Playgroud)

Luc*_*iva 6

这是一个非常好的问题。我今天要做的方法是在其构造函数中声明我所有的类实例变量,并用预期的类型注释每个变量。这是一个很好的做法,并且可以与Webstorm一起很好地工作。例如:

class MyClass {

    constructor () {
        /** @type {Number} some number value */
        this.someNumber = 0;
        /** @type {String} some relevant string */
        this.someString = null;
        /** @type {Map<Number, Set<String>>} map numbers to sets of strings */
        this.strSetByNumber = new Map();
    }

    /**
     * Some sample function.
     * 
     * @param {Number} a - first value
     * @param {Number} b - second value
     * @return {Number} the resulting operation
     */
     someFunction(a, b) {
         return a + b;
     }
}
Run Code Online (Sandbox Code Playgroud)

现在,只需将一些变量声明为类型MyClass并享受自动补全功能即可:

自动完成

如果您尝试为某些属性分配错误的类型,请执行以下操作:

在此处输入图片说明


但是有时候,您甚至不需要声明一个类。说,出于种种考虑,您希望通过JSON接收对象,并且需要使用它。您可以使用纯JSDoc来帮助检查代码,而无需声明类。假设您期望这样的JSON:

{
    "foo": "bar",
    "fizz": 42
}
Run Code Online (Sandbox Code Playgroud)

而不是声明一个类,而是在代码中的某个位置执行此操作(我更喜欢始终将其放在将要使用它的脚本的顶部):

/**
 * @typedef {Object} MyType
 * @property {String} foo - this is some cool string
 * @property {Number} fizz - some number we also expect to receive
 * @property {Number} [bar] - an optional property
 */
Run Code Online (Sandbox Code Playgroud)

就是这样!自己尝试一下,看看Webstorm如何能够很好地理解这两种方法。