Пример:
Базовый тип:
/**
* @typedef {Object} LabelValue
* @template T
* @property {String} label
* @property {T} value
*/
Можно использовать как
/** @type {LabelValue<SomeType>} */
Я хочу расширить этот базовый типвот так (может быть, это просто неправильный синтаксис, я точно не знаю):
/**
* @typedef {LabelValue<T>} LabelValueExtended
* @template T
* @property {String} extensionProp
*/
Я использую веб-шторм, и он не показывает никаких предложений, основанных на используемом типе:
/** @type {LabelValueExtended<SomeType>} */
Этот вариант также не вызывает никаких предложений от веб-шторма:
/**
* @typedef {LabelValue} LabelValueExtended
* @template T
* @property {String} label
* @property {T} value
* @property {String} extensionProp
*/
Но только если я заменю свой пользовательский тип на общий тип, такой как Object
, шаблоны работаютхорошо.Например, это работает:
/**
* @typedef {Object} LabelValueExtended
* @template T
* @property {String} label
* @property {T} value
* @property {String} extensionProp
*/
И мой первый пример базового типа также работает нормально, поскольку он расширяет общий тип Object
.Но если я сделаю что-то глупое, например
/**
* @typedef {Object} Dummy
* @property {String} dummy
*/
/**
* @typedef {Dummy} LabelValue
* @template T
* @property {String} label
* @property {T} value
*/
, это также нарушит любые предложения свойств из веб-шторма.
Типы без шаблонов работают нормально.Например / ** * @typedef {Object} Dummy * @property {String} dummy * /
/**
* @typedef {Dummy} LabelValue
* @property {String} label
* @property {*} value
*/
Если использовать это так: /** @type {LabelValue} */
, то веб-буря предлагает корректные реквизиты обоих типов, но, очевидно, яне получит никаких предложений по value
свойству.
Вопрос: я использую неверный синтаксис для jsdoc с шаблонами (пожалуйста, предложите правильный) или веб-шторм просто обрабатывает его неправильно?