0

我有一个来自第 3 方库 (A) 的接口。我正在为我的项目bar中的属性创建别名。foo这很好用,但我也希望我的别名继承属性的 DocBlock 注释。

interface A {
  /**
   * It's a number
   */
  foo: number;
}

interface B extends A {
  bar: A["foo"];
}

const x: B = {
  foo: 1,
  bar: 2
};

在 Codesandbox 中,您可以使用CTRL+Hoverxonfoobar. foo会有意见,bar不要。我还想bar显示相同的 DocBlock 评论。

https://codesandbox.io/s/lucid-architecture-6ppe6?file=/src/index.ts

4

2 回答 2

1

这里唯一的答案是它不能那样工作。并且有充分的理由。使用类型来构造其他类型是完全有效的,但以同样的方式重用文档不一定有效。

假设您在文档中提到了此属性的名称。(这常见)

interface A {
  /**
   * The foo property is a count of the number of foos.
   */
  foo: number;
}

你会期待看到这个吗?

在此处输入图像描述

我认为这很令人困惑。当您在其他上下文中使用该类型时,它在这些上下文中的含义可能会发生变化,并且文档应该与该上下文相关。

相反,我会争辩说文档bar会有所不同。就像是:

interface B extends A {
  /**
   * bar is the same type as A.foo and is set during initialization.
   * It serves as a snapshot of the count of foos at the time this object was created.
   */
  bar: A["foo"];
}

由于这些原因,文档是通过接口或属性的声明方式而不是分配给它的类型来查找的。它可能具有相同的类型,但它存在的原因和使用方式很可能会有所不同。

于 2020-11-17T20:22:19.937 回答
0

我 90% 确定这个问题与打字稿编译器本身无关。由于 TypeScript 具有结构化类型系统,bar: A["foo"];因此将被视为bar: number. 因此,TS 无法A['foo']与 A 接口绑定。A['foo']在这里是一个别名,仅此而已,仅此而已。

您应该bar: A["foo"];直接添加评论。

我认为最好在 VSCode/Your favorite IDE repo 中提出问题

于 2020-11-17T20:26:43.913 回答