【问题标题】:How to document javascript higher order function?如何记录javascript高阶函数?
【发布时间】:2017-09-06 06:42:09
【问题描述】:

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

/**
 * 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 将支持智能感知,但 instance2 不会。如何记录函数/导出,以便将使用包装器创建的对象识别为类的实例?

【问题讨论】:

  • Javascript 有时在 vscode 上的记录不是很好,请改用 Typescript :(

标签: javascript documentation visual-studio-code higher-order-functions jsdoc3


【解决方案1】:

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

/** @type {function(T1, T2): MyClass} */
exports.myClass = constructorWrapper(MyClass);

但是,如果您希望注释 constructorWrapper 本身,那么从 VSCode 1.11.1(使用 TypeScript 2.2)开始这是不可能的。而JSDoc supports generics:

/**
 * 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,然后没有智能感知。

VSCode 基于 JSDoc 的 IntelliSense 基于 TypeScript,I think this is a bug in TypeScript's handling of @template 从 2.2 开始。

如果您不受限于仅 ES6 开发,我建议您完全用 TypeScript 重写它。然后,您将获得预期的 IntelliSense,以及类型安全和许多其他好处。

请注意,由于TypeScript 2.2 does not support variadic generics yet 的参数无法完美转发,因此无法对myClass 的输入进行类型检查。这意味着您仍然需要手动注释 myClass 的类型才能获得完美的信息。

【讨论】:

  • 感谢您抽出宝贵时间回答这个问题。但是,手动注释 myClass 的类型在 vscode 中不起作用。但是,我怀疑这是一个错误/缺失的功能,没有更好的解决方案。无论如何,我都赞成这个答案。
  • @SuhasK 在带有 TypeScript 2.2.2 的 VSCode 1.11.1 上手动添加 @type 对我有用。也许您的import 声明中有问题?
  • 如果类定义存在于它被导出的同一个文件中,它确实有效。如果它被导入然后导出(就像我的情况),即使使用手动类型注释,智能感知也不起作用。 ibb.co/m5qW0k
  • @SuhasK 也许尝试(a)使用语法import * as exp from './base'? (b) 重启 VSCode?如果这些仍然不起作用,我没有其他想法:)。
  • 不.. 这没有帮助。但我会保留手动类型注释,希望它们将来可以工作。
猜你喜欢
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-09
  • 1970-01-01
相关资源
最近更新 更多