如何让filterItems函数的返回类型与传入字符串参数匹配?
解决JSDoc泛型返回类型匹配问题
你的问题出在T被定义为keyof Filters的联合类型,而非针对每个调用的具体字面量类型。要让返回类型和传入的字符串参数精准匹配,需用@template将T声明为受约束的泛型参数,而非全局typedef。
修改后的代码:
/** * @typedef {{card: CardItem, sticky_note: StickyNoteItem}} Filters * @template {keyof Filters} T * @param {WidgetItem[]} items * @param {T} widgetType * @returns {Filters[T][]} */ export function filterItems(items, widgetType) { return items.filter(({type}) => type === widgetType) }
关键修改点:
- 替换
@typedef {keyof Filters} T为@template {keyof Filters} T:将T转为泛型参数,约束它只能是Filters的键("card"或"sticky_note"),且每次调用函数时,T会被推断为传入的具体字面量类型。 - 保留
@returns {Filters[T][]}:此时T是具体的单个键,返回类型会对应Filters中该键关联的数组类型——比如传入"card"时返回CardItem[],传入"sticky_note"时返回StickyNoteItem[]。
原写法失效原因:
原@typedef {keyof Filters} T把T定义为"card" | "sticky_note"的联合类型,因此Filters[T]的结果也是联合类型,最终返回类型被解析为(CardItem | StickyNoteItem)[]。而泛型@template会让T在每个调用场景下被窄化为单个具体键,从而得到精准的返回类型。
内容的提问来源于stack exchange,提问作者Zachary
相关产品推荐
相关产品推荐

