TypeScript 保留属性注解并插入@default值(如果提供)

cbeh67ev  于 6个月前  发布在  TypeScript
关注(0)|答案(4)|浏览(64)

搜索词

默认初始化值保留注解tsdoc类型选项选项包

建议

正如标题所暗示的,如果提供了初始化器,则在TSDoc AST中插入一个@default注解,保留原始注解。

用例

我有一个选项的默认值,我希望库的使用者知道这个默认值是什么。

示例

interface Options {
  /**
* The server host.
*/
  host?: string;
  port?: number;
}

function serve({ host = 'localhost', port }: Options) {
  return { host, port };
}

Playground
return语句中悬停显示以下内容:

不仅此属性的TSDoc注解丢失了,而且如果在此上下文中添加了@default "localhost",它还可以进一步改进,因为这些信息就在这里。
它应该像这样:

非常感谢TS团队!

检查清单

我的建议满足以下准则:

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

6mzjoqzu1#

我认为这是#32392的重复内容。

5f0d552i

5f0d552i2#

我认为这是一个重复的问题。
它与#32392有关,但不是相同的问题,因为该问题没有提到@default的评论。

xoefb8l8

xoefb8l83#

@RyanCavanaugh 我已经在下面提供了一个详细的例子,说明缺少工具提示信息的场景。

interface FooOptions {
  /**
* original bar
* @default 'original' original
*/
  bar?: string;
  /**
* original baz
* @default 'original' original
*/
  baz?: string;
}

{
  function foo({ bar = 'original' } = {}) {
    return bar;
  }

  foo({
    /**
* Actual Tooltip:
*   (property) bar?: string | undefined
* Expected Tooltip:
*   (property) bar?: string | undefined
*   _@default — 'original' original_
*/
    bar: 'x'
  });
}

{
  interface ExtendedFooOptions extends FooOptions {
    /**
* extended bar
* @default 'extended' extended
*/
    bar?: string;
  }

  function foo({
    /**
* Actual Tooltip:
*   var bar: string
* Expected Tooltip:
*   var bar: string
*   extended bar
*   _@default — 'overridden' extended_
*/
    bar = 'overridden',
    /**
* Actual Tooltip:
*   var baz: string
* Expected Tooltip:
*   var baz: string
*   original baz
*   _@default — 'overridden' original_
*/
    baz = 'overridden'
  }: ExtendedFooOptions = {}) {
    return [
      /**
* Actual Tooltip:
*   var bar: string
* Expected Tooltip:
*   var bar: string
*   extended bar
*   _@default — 'overridden' extended_
*/
      bar,
      /**
* Actual Tooltip:
*   var baz: string
* Expected Tooltip:
*   var baz: string
*   original baz
*   _@default — 'overridden' original_
*/
      baz
    ] as const;
  }

  foo({
    /**
* Actual Tooltip:
*   (property) ExtendedFooOptions.bar?: string | undefined
*   extended bar
*   @default — 'extended'
* Expected Tooltip:
*   var bar: string
*   extended bar
*   _@default — 'overridden' extended_
*/
    bar: 'x',
    /**
* Actual Tooltip:
*   var baz: string
* Expected Tooltip:
*   var baz: string
*   original baz
*   _@default — 'overridden' original_
*/
    baz: 'y'
  });
}

Playground

nfg76nw0

nfg76nw04#

我还想在我的TSdocs(d.ts)中提供默认值。我在设置类中有很广泛的选项,并希望让人们知道默认值(在IDE中,以及使用API文档生成网站时)。

我的输入:

class MySettings {
   /**
* Description of optionA.
*/
   public optionA:string = 'default string';
   /**
* Description of optionB.
*/
   public optionB:number = 1.2;
   /**
* Description of optionC.
*/
   public optionC:MyEnum = MyEnum.Value; 
}

在我期望的d.ts输出中,我希望有类似的东西:

declare class MySettings {
   /**
* Description of optionA.
* @default `'default string'`
*/
   public optionA:string;
   /**
* Description of optionB.
* @default `1.2`
*/
   public optionB:number;
   /**
* Description of optionC.
* @default `MyEnum.Value`
*/
   public optionC:MyEnum; 
}

鉴于这个问题的兴趣和持续时间,我担心它可能永远不会成为官方功能。所以我在想:是否有一个好的方法来自定义生成的输出并注入这样的标签?例如,通过TypeScript编译器API使用转换器?关于在哪里适应/扩展编译器的提示将非常有助于实现这一点。

相关问题