Understanding Generic Instantiation
type BaseTreeItem = {
id: string;
children: BaseTreeItem[];
};
type TreeItem<Children extends TreeItem = BaseTreeItem> = {
id: string;
children: Children[];
collapsed?: boolean;
};
function attachToRoot<T extends TreeItem>(children: T[]): TreeItem<T> {
return {
id: "root",
children,
};
}
const root = attachToRoot([
{
id: "child",
children: [],
collapsed: false,
marked: true,
},
]);
/*
root is TreeItem<{
id: string;
children: never[];
collapsed: false;
marked: boolean;
}>
*/