Я пытался документировать свой JS-код с помощью типов, но у меня возникли проблемы с этой функцией. Я пытаюсь отфильтровать массив, используя его свойство type, однако при попытке сопоставить предоставленный строковый параметр с типом с помощью объекта с заданным типом Filter тип возвращаемого значения является типом объединения (CardItem | StickyNoteItem)[], тогда как я ожидал, что это будет CardItem[].
Когда я заменяю T в @returns строковым литералом «card», возвращается единственный тип CardItem[].
Я пытался использовать @template, но, похоже, параметр не соответствует типу объединения.
Как это исправить, чтобы тип @return соответствовал строковому параметру?
/**
*
* @typedef {{card: CardItem, sticky_note: StickyNoteItem}} Filters
* @typedef {keyof Filters} T
* @param {WidgetItem[]} items
* @param {T} widgetType
* @returns {Filters[T][]}
*/
export function filterItems(items, widgetType) {
return items.filter(({type}) => type === widgetType)
}



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Две вещи: во-первых, вам действительно нужно использовать тег @template при определении дженериков; и во-вторых, определение @typedef внутри того же блока, что и блок, документирующий функцию, похоже, не поддерживается.
Вы можете получить ожидаемый тип возвращаемого значения следующим образом:
/**
* @typedef {{ card: CardItem, sticky_note: StickyNoteItem }} Filters
*/
/**
* @template {keyof Filters} T
* @param {WidgetItem[]} items
* @param {T} widgetType
* @returns {Filters[T][]}
*/
@Zachary К сожалению, я не могу найти никакой официальной информации по этому поводу. Я не знаю, указано ли это в документации JSDoc или является ли это особенностью VSCode. Я часто использую JSDoc, поэтому я и научился этому.
Огромное спасибо, это сработало! Просто любопытно, указано ли это где-нибудь в документации JSDoc? Можно мне ссылку на него?