TypeScript报错Tag无法索引{}类型,getTagsByPost函数如何修复?
错误原因
你定义的allTags类型为Record<Tag, {title: string, slug: string}[]> | {},TS 无法识别{}类型可以被Tag类型的键索引,因此抛出索引非法的报错。同时你实际返回的聚合结果也不会包含所有Tag枚举值作为键,和你声明的完整Record类型也不匹配。
修复方案
将allTags的类型修改为Partial<Record<Tag, {title: string, slug: string}[]>>即可,Partial工具类型会将Record的所有键转为可选状态,既符合初始值{}的类型要求,也允许你用Tag类型的值作为键访问属性。
另外你代码里的const formattedTag = tag as Tag属于冗余断言,因为Meta的tags属性本身就是Tag[]类型,遍历拿到的tag天然就是Tag类型,不需要额外转换。
修复后的完整代码如下:
const getTagsByPost = (posts: Pick<Meta, 'title' | 'slug' | 'tags'>[]) => { let allTags: Partial<Record<Tag, {title: string, slug: string}[]>> = {} for (let { title, slug, tags } of posts) { for (let tag of tags) { const temp = { title, slug } if (tag in allTags) { allTags[tag].push(temp) } else { allTags[tag] = [temp] } } } return allTags }
后续访问返回结果里的某个标签对应的文章列表时,TS 会提示该值可能为undefined,如果能确定该标签一定存在,可以用非空断言allTags['mobx']!,或者提前做判空处理即可。
内容的提问来源于stack exchange,提问作者deadcoder0904
相关产品推荐
相关产品推荐

