首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何记录javascript高级函数?

问如何记录javascript高级函数?
EN

Stack Overflow用户
提问于 2017-04-11 03:48:15
回答 1查看 2.9K关注 0票数 5

我有以下用于包装结构的高阶函数:

代码语言:javascript
复制
/**
 * 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,我可以执行以下操作:

代码语言:javascript
复制
exports.MyClass = MyClass;
exports.myClass = constructorWrapper(MyClass);

现在,在导入之后,可以通过以下两种方式实例化该类:

代码语言:javascript
复制
const instance1 = new MyClass(param1, param2);
const instance2 = myClass(param1, param2);

在vscode中,instance1将支持intellisense,但instance2不支持。我如何记录函数/导出,以便将使用包装器创建的对象识别为类的实例?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-13 13:39:38

您可以通过强制使用IntelliSense的类型来使myClass可用。

代码语言:javascript
复制
/** @type {function(T1, T2): MyClass} */
exports.myClass = constructorWrapper(MyClass);

但是,如果您希望注释constructorWrapper本身,则不可能在VSCode 1.11.1 (使用TypeScript 2.2)时进行注释。而JSDoc支持泛型

代码语言:javascript
复制
/**
 * 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的类型以获得完美的信息。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43336416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档