Typescript 如何更正泛型接口的类型声明

Typescript 如何更正泛型接口的类型声明,typescript,Typescript,简单的函数,用于构建树结构 接口公共项{ id:字符串 父项:字符串| null } 接口CommonTreeItem{ 儿童:CommonTreeItem[] } 导出常量buildTree=( 数据:项目[] ):TreeItem[]=>{ 常量根:TreeItem[]=[] const dataMap=新映射() 用于(常量数据项){ set(item.id,{…item,子项:[]}) // ~~~~~~~~~~~~~~~~~~~~~~~~ //TS2

简单的函数,用于构建树结构

接口公共项{
id:字符串
父项:字符串| null
}
接口CommonTreeItem{
儿童:CommonTreeItem[]
}
导出常量buildTree=(
数据:项目[]
):TreeItem[]=>{
常量根:TreeItem[]=[]
const dataMap=新映射()
用于(常量数据项){
set(item.id,{…item,子项:[]})
//                   ~~~~~~~~~~~~~~~~~~~~~~~~
//TS2345:类型为“Item&{children:never[];}”的参数不能分配给类型为“TreeItem”的参数。
}
for(数据的常量原件){
如果(原始项父项){
const parentItem=dataMap.get(originalItem.parent)
const item=dataMap.get(originalItem.id)
如果(父项){
parentItem.children.push(项目)
}
}否则{
根推(
获取(originalItem.id)
)
}
}
返回根
}
我不明白为什么林特失败了。 我尝试创建将项作为泛型的类型,但失败了。
可能需要以不同的方式构建TreeItem

我看到的完整错误消息是:

Argument of type 'Item & { children: never[]; }' is not assignable to parameter of type 'TreeItem'.
  'Item & { children: never[]; }' is assignable to the constraint of type 'TreeItem', but 'TreeItem' could be instantiated with a different subtype of constraint 'CommonTreeItem & CommonItem'.ts(2345)
这与
TreeItem扩展CommonTreeItem的方式有关&Item
只表示结果类型应该包含
id
父项和
子项,但可以包含更多字段。对
Map#set
的类型检查更严格,并检查要设置的项目是否与类型完全匹配(不能包含其他字段)

您可以通过更具体地定义
TreeItem
而不是使用
extends
来绕过此错误,如下所示:

const buildTree=(数据:Item[])=>{
类型TreeItem=CommonTreeItem&Item
常量根:TreeItem[]=[]
const dataMap=新映射()
用于(常量数据项){
set(item.id,{…item,子项:[]})
}
for(数据的常量原件){
如果(原始项父项){
const parentItem=dataMap.get(originalItem.parent)
const item=dataMap.get(originalItem.id)
如果(父项){
parentItem.children.push(项目)
}
}否则{
root.push(dataMap.get(originalItem.id))
}
}
返回根
}
您将看到,我们已经删除了返回类型注释,但是函数的类型应该正确推断为

const buildTree:(数据:Item[])=>TreeItem[]
另见