我正在尝试使用JsDoc来记录es6类。无法相信您不能将类作为参数传递(类类型,而不是实例类型)。
我一直在尝试,但无法使用这个简单的代码,以便JsDoc不会给我一些警告。
除非我为每个类创建一个@typedef,然后手动添加所有自己和继承的成员,否则我无法使其工作。甚至不能做混合!
有没有人成功传递构造函数/类参数?那么JsDoc是在静态上下文中,而不是实例上下文?
/**
* @class A
*/
class A {
/**
* @static
*/
static helloFromClassA(){
}
}
/**
* @class B
* @extends A
*/
class B extends A{
/**
* @static
*/
static helloFromClassB(){
}
}
/**
* Class as object
* @param {A} ClassArgument
*/
function fn1(ClassArgument){
ClassArgument.helloFromClassA(); // Unresolved function or method helloFromClassA
// Does not work because ClassArgument is interpreted as an
// instance of A, not A's constructor
}
/**
* // Class as function
* @param {Function} ClassArgument
*/
function fn2(ClassArgument){
ClassArgument.helloFromClassA(); // Unresolved function or method helloFromClassA
// Does not work because ClassArgument is interpreted as an
// empty function, not A's constructor
}
/**
* // Type definition
* @typedef {Object} AClass
* @property {Function} helloFromClassA
* @property {Function} super
*/
/**
* // Trying to mixin the AClass
* @typedef {Object} BClass
* @property {Function} helloFromClassB
* @mixes {AClass}
* @mixes {A}
*/
/**
* // Adding manually all members
* @typedef {Object} BClass2
* @property {Function} helloFromClassB
* @property {Function} helloFromClassA
*/
/**
* @param {BClass} ClassArgument
*/
function fn3(ClassArgument){
ClassArgument.helloFromClassA(); // Unresolved function or method helloFromClassA
// Does not work because the BClass typedef does not take
// into account the mixin from AClass, nor from A
ClassArgument.helloFromClassB(); // No warming
}
/**
* @param {BClass2} ClassArgument
*/
function fn4(ClassArgument){
ClassArgument.helloFromClassA(); // No Warning
ClassArgument.helloFromClassB(); // No warming
// Works because we manually defined the typedef with all own
// and inherited properties. It's a drag.
}
fn1(B);
fn2(B);
fn3(B);
fn4(B);
答案 0 :(得分:2)
我多次在WebStorm中遇到同样的自动完成问题。虽然看起来目前在jsdoc中没有直接的方式来说该参数是对构造函数的引用(而不是对实例),但JetBrains团队建议实现类似@param {typeof Constructor}(其中) typeof来自typescript)或@param {Constructor。},由闭包编译团队提供suggested。您可以投票支持以下问题,以解决您对WebStorm自动填充问题的主要关注 - https://youtrack.jetbrains.com/issue/WEB-17325
答案 1 :(得分:2)
在Visual Studio代码中,您可以指定
@param {function(new:MyClass, SomeArgType, SecondArgType, etc...)}
我不确定该语法来自哪个规范或者其他人支持它,但它适用于我。
答案 2 :(得分:1)
typescript和google closure都支持{typeof SomeClass}
将类引用为类型(不是类实例)。不幸的是,jsdoc不支持该语法,并且无法编译它(https://github.com/jsdoc3/jsdoc/issues/1349)。
因为我想使用typescript对我的JavaScript进行类型检查并且还想生成文档,所以我创建了这个jsdoc插件,将{typeof SomeClass}
之类的表达式转换为{Class<SomeClass>}
,这样我就可以拥有这两样东西:{{3 }}