You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 07:14:56