我有以下用于包装结构的高阶函数:
/**
* Wrapper for calling constructor with given parameters
*
* @param {Class} Cls
* @returns {function} Wrapper on constructor which creates an instance of given Class
*/
function constructorWrapper(Cls) {
return (...args) => new Cls(...args);
}因此,如果我有一个类MyClass,我可以执行以下操作:
exports.MyClass = MyClass;
exports.myClass = constructorWrapper(MyClass);现在,在导入之后,可以通过以下两种方式实例化该类:
const instance1 = new MyClass(param1, param2);
const instance2 = myClass(param1, param2);在vscode中,instance1将支持intellisense,但instance2不支持。我如何记录函数/导出,以便将使用包装器创建的对象识别为类的实例?
发布于 2017-04-13 13:39:38
您可以通过强制使用IntelliSense的类型来使myClass可用。
/** @type {function(T1, T2): MyClass} */
exports.myClass = constructorWrapper(MyClass);但是,如果您希望注释constructorWrapper本身,则不可能在VSCode 1.11.1 (使用TypeScript 2.2)时进行注释。而JSDoc支持泛型
/**
* Wrapper for calling constructor with given parameters
*
* @param {function(new:T, ...*)} Cls The class constructor.
* @returns {function(...*): T} Wrapper of the class constructor
* @template T
*/
function constructorWrapper(Cls) {
return (...args) => new Cls(...args);
}推断的类型确实是正确的:

不知何故,两个"T“被断开,使得myClass = constructorWrapper(MyClass)采用了类型签名(...arg0: any[]) => T。什么T?嗯,我们不知道,把它当作any,而不是IntelliSense。

VSCode的基于JSDoc的IntelliSense是基于TypeScript的,而@template则是2.2岁的.
如果您不局限于ES6开发,我建议您完全用TypeScript重写它。然后,您将得到预期的IntelliSense,加上类型安全性和许多其他好处。
请注意,由于TypeScript 2.2还不支持可变的泛型不能完全转发参数,因此不能对输入到myClass进行类型检查。这意味着您仍然需要手动注释myClass的类型以获得完美的信息。
https://stackoverflow.com/questions/43336416
复制相似问题