Как поддерживать комментарии DocBlock для псевдонимного свойства?

#typescript #docblocks

#typescript #docblocks

Вопрос:

У меня есть интерфейс из сторонней библиотеки (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 наведите курсор мыши x на foo и bar . foo будут комментарии, bar нет. Я bar также хочу показать тот же комментарий DocBlock.

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

Комментарии:

1. Возможно @see , директива, входящая в Typescript 4.1, может вам помочь? devblogs.microsoft.com/typescript /…

Ответ №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"];
}
  

По этим причинам документация просматривается по тому, как объявлен этот интерфейс или свойство, а не по назначенному ему типу. Он может иметь тот же тип, но почему он там и как он используется, скорее всего, будет другим.

Ответ №2:

Я на 90% уверен, что этот вопрос не связан с самим компилятором typescript. Поскольку TypeScript имеет структурный тип system, bar: A["foo"]; он будет обрабатываться как bar: number . Следовательно, TS не может связываться A['foo'] с интерфейсом. A['foo'] здесь псевдоним, ни больше, ни меньше.

Вы должны добавить комментарий bar: A["foo"]; напрямую.

Я думаю, что лучше поднять проблему в VSCode / вашем любимом репозитории IDE

Комментарии:

1. Проблема в том, что мне нужно расширить csstype s StandardLongnameProperties . Мне нужно добавить свою собственную короткую версию для каждого свойства, что было бы немного кошмаром для добавления вручную.

2. Не могли бы вы добавить больше контекста к вопросу? По крайней мере, пример с одним добавленным вами свойством