TypeScript JSDoc : 为 @method (和 @property) 添加支持,

vaqhlq81  于 4个月前  发布在  TypeScript
关注(0)|答案(5)|浏览(47)

搜索词

  • JSDoc
  • @method
  • @property
  • 支持

建议

现在注解功能即将推出,很希望能为 @method@property (也许还有 @memberof)添加支持。
我发现了一个 bug ,它只讨论了 #15715 支持,但我认为将它们放在一起看会更有意义,因为它们应该有非常常见的实现方式,而且它们满足整体的目标。至少我认为是这样,我在下面解释了我的理由!

用例

我现在有一些函数,它们可以在类上添加方法和/或获取器,等待 JS/TS 的注解功能。但是假设:当注解功能出现时,这两个标志支持总是需要的(或者至少我认为是这样:我不知道如何在没有这些的情况下让 IntelliSense 工作)!

/**
* Some class
* @class
*/
class Test {
  /* whatever */
}

// this adds a #foo() method on the class prototype as well as a #bar getter(/setter)
someMethodAddingABehavior(Test, ...params);

明天有了注解:

/**
* Some class
* @class
*/
@someAnnotationAddingABehavior(...params)
class Test {
  /* whatever */
}

示例

我希望能够像这样记录它们:

/**
* What foo is doing is great!
* @method foo
* @param {string} testParam some testing parameter
* @returns {string} some random string
* @memberof Test.prototype
*/
/**
* Bar is awesome too!
* @property {number} bar
* @memberof Test.prototype
*/
someMethodAddingABehavior(Test, ...params);

或者至少能够在类本身中记录它们:

/**
* Some class
* @class
*/
class Test {
  /* whatever */

  /**
* What foo is doing is great!
* @method foo
* @param {string} testParam some testing parameter
* @returns {string} some random string
*/
  /**
* Bar is awesome too!
* @property {number} bar
*/
}

有了这些支持,我希望在完成类型为 Test 的值的属性时,vscode 能够建议给我 foo 方法和 bar 属性。

检查清单

我的建议符合以下准则:

  • 这不会对现有的 TypeScript/JavaScript 代码造成破坏性的更改
  • 这不会改变现有 JavaScript 代码的运行时行为
  • 这可以在不根据表达式的类型生成不同的 JS 的情况下实现
  • 这不是一个运行时特性(例如库功能、JavaScript 输出的非 ECMAScript 语法等)
  • 这个特性将与 TypeScript's Design Goals 的其他部分保持一致。
ih99xse1

ih99xse11#

我将支持这个观点。我们的用例是大量的以下形式的类:

import { extendObservable } from 'mobx';

class Foo {
  constructor() {
    extendObservable(this, {
      bar: 123,
      // ...
    });
  }
}

extendObservable 的行为与 Object.assign 非常相似。然而,我们不能使用以下解决方法,因为它与 extendObservable 不向后兼容(我们处于 v3 版本,v4 或更高版本不会覆盖现有属性):

class Foo {
  /** @type {number} */
  bar;

  constructor () { /* ... */ }
}
yshpjwxd

yshpjwxd2#

目前是否有解决方法?我正在尝试从一个JS库中构建类型定义(使用tsc --allowJs),该库在构造函数函数之外添加了getter/setter属性。

function Foo() { ... }

Object.defineProperties(Foo.prototype, {
  /**
* @memberof Foo
* @type {number}
*/
  bar: { get: function() {...} },
  /**
* @memberof Foo
* @type {string}
*/
  baz: { get: function() {...} }, 
});

我不方便将其转换为更简单的模式(例如,ES6 class),所以我只能尝试描述它现在是如何工作的,以便生成的类型定义包含添加的属性。

thtygnil

thtygnil3#

看起来我们已经等了一段时间了:#7237

mccptt67

mccptt674#

这个问题可以通过接口和/或明确赋值Assert来解决,这些方法也适用于类属性(请参阅此部分)。

e7arh2l6

e7arh2l65#

哦,酷,这就是为什么JavaScript中的JSDoc不起作用的原因。真糟糕。这也意味着解决方法不起作用。

相关问题