Typescript 扩展递归定义的接口成员

Typescript 扩展递归定义的接口成员,typescript,types,Typescript,Types,我在库TreeItem中定义了一个类型,我想用可选的onClick函数TreeItem2扩展这个类型 如何在不复制整个声明的情况下扩展类型 这是我目前的代码: //在库中定义的类型 接口树{ 文本?:字符串; 项目?:树项[]; // ... }; //扩展型 键入TreeItem2=TreeItem&{items?:TreeItem2[],onClick?:=>void}; //类型用法 let项:TreeItem2={ 案文:a, onClick:=>{}, 项目:[{ 案文:b, onCl

我在库TreeItem中定义了一个类型,我想用可选的onClick函数TreeItem2扩展这个类型

如何在不复制整个声明的情况下扩展类型

这是我目前的代码:

//在库中定义的类型 接口树{ 文本?:字符串; 项目?:树项[]; // ... }; //扩展型 键入TreeItem2=TreeItem&{items?:TreeItem2[],onClick?:=>void}; //类型用法 let项:TreeItem2={ 案文:a, onClick:=>{}, 项目:[{ 案文:b, onClick:=>{},//错误 }] }; 错误消息:

Type '{ text: string; onClick: () => void; }[]' is not assignable to type 'TreeItem[] & TreeItem2[]'.
  Type '{ text: string; onClick: () => void; }[]' is not assignable to type 'TreeItem[]'.
    Type '{ text: string; onClick: () => void; }' is not assignable to type 'TreeItem'.
      Object literal may only specify known properties, and 'onClick' does not exist in type 'TreeItem'.
使用多态性是实现这一点的最简单的方法,但它需要编辑基类型,这是我们无法做到的,因为它位于库中。为完整起见,本版本为:

interface TreeItem {
    text?: string;
    items?: this[];
};

interface TreeItem2 extends TreeItem {
    onClick: ()=> void
}

let item: TreeItem2 = {
    text: "a",
    onClick: () => {},
    items: [{
        text: "b",
        onClick: () => {}, // ok 
    }]
};
由于无法编辑库类型,因此可以忽略原始接口中的项,并定义包含更新项属性的自定义接口:

// type defined in library
interface TreeItem {
    text?: string;
    items?: TreeItem[];
};

interface TreeItem2 extends Omit<TreeItem, 'items'> {
    onClick: ()=> void
    items?: TreeItem2[]
}

let item: TreeItem2 = {
    text: "a",
    onClick: () => {},
    items: [{
        text: "b",
        onClick: () => {}, // ok 
    }]
};