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