【发布时间】:2016-01-14 01:15:20
【问题描述】:
我正在尝试使用 JsDoc 来记录 es6 类。不敢相信不能将类作为参数传递(类类型,而不是实例类型)。
我一直在尝试,但无法让这个简单的代码工作,因此 JsDoc 不会向我抛出一些警告。
除非我为我的每个类创建一个@typedef,然后手动添加所有自己的和继承的成员,否则我无法让它工作。连mixin都做不了!
有没有人成功传递了构造函数/类参数?让 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);
【问题讨论】:
-
您已将这些方法声明为
static- 在实例上调用它们会起作用,但 imo 对关键字的使用有点奇怪。 -
什么意思? ES6 有 static 关键字,允许你在构造函数而不是原型上声明方法。这些是静态方法。而且我不是在尝试在实例上调用它们,而是在调用构造函数。这里的问题是 JsDoc 不允许您将参数声明为构造函数(类型),它只允许您将参数声明为实例。
-
我明白了。我错误地认为 val 是一个实例而不是对函数的引用
-
是的,我是这么想的,所以我更新了代码。
标签: javascript ecmascript-6 webstorm jsdoc