#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
sStandardLongnameProperties
. Мне нужно добавить свою собственную короткую версию для каждого свойства, что было бы немного кошмаром для добавления вручную.2. Не могли бы вы добавить больше контекста к вопросу? По крайней мере, пример с одним добавленным вами свойством