我有 Tree 组件,它呈现绘制 TreeItem 的 TreeItemsRenderer。它们中的每一个都是独立的组件。
我需要接受替换默认 TreeItem 的动态组件,并且我需要拥有所有默认 TreeItem 道具。(例如:const CustomComponent 扩展 TreeItem)。树在代码中的许多地方使用。所以它必须是通用的。
- 我试图通过创建泛型类型从默认 TreeItem 获取所有属性
D extends ITreeItemProps<T>
。 T
generic 用于项目类型。- 所有的自动完成都是从外部工作的。只有错误出现在渲染 SelectedRowComponent 的 TreeItemRenderer 组件上。
这是我的组件(有时可能不合逻辑,因为我删除了不必要的东西并简化了逻辑):
树 :
import { ITreeItemProps, ITreeItem } from "./types";
import TreeItemRenderer from "./TreeItemRenderer";
export interface ITreeProps<T, D extends ITreeItemProps<T>> {
items: ITreeItem<T>[];
getItemKey: (item: T) => string | number;
SelectedRowComponent?: React.ComponentType<D>;
SelectedRowProps?: Partial<React.ComponentProps<ITreeProps<T, D>['SelectedRowComponent'] & {}>>;
selected?: string | number;
}
export default function Tree<T, D extends ITreeItemProps<T>>(props: ITreeProps<T, D>){
const {
items,
SelectedRowComponent,
SelectedRowProps,
getItemKey,
selected,
} = props;
return <>
<TreeItemRenderer
getItemKey={getItemKey}
items={items}
SelectedRowComponent={SelectedRowComponent}
SelectedRowProps={SelectedRowProps}
selected={selected}
/>
</>
}
树项渲染器:
import { ITreeItemProps, ITreeItem } from "./types";
import TreeItem from './TreeItem';
export interface ITreeItemRenderer<T, D extends ITreeItemProps<T>>{
getItemKey: (item: T) => string | number;
SelectedRowComponent?: React.ComponentType<D>
SelectedRowProps?: Partial<React.ComponentProps<ITreeItemRenderer<T, D>['SelectedRowComponent'] & {}>>;
items: ITreeItem<T>[];
selected?: string | number;
}
export default function TreeItemRenderer<T, D extends ITreeItemProps<T>>(props: ITreeItemRenderer<T, D>){
const {
SelectedRowComponent,
SelectedRowProps,
items,
selected,
getItemKey,
} = props;
return <>
{items.map((item) => {
const key = getItemKey(item);
const isSelected = key === selected;
return <>
{
isSelected ?
<SelectedRowComponent
{...SelectedRowProps}
item={item}
getItemKey={getItemKey}
isSelected
/>
: <TreeItem
item={item}
getItemKey={getItemKey}
isSelected
/>
}
</>
})}
</>
}
类型组件:
export interface ITreeItemProps<T> {
getItemKey: (item: T) => string | number;
isSelected: boolean;
item: ITreeItem<T>;
}
export type ITreeItem<T> = T & {
children: ITreeItem<T>[];
};
我的问题是在第 28 行的 TreeItemRenderer
Type '(Partial<D> & { item: ITreeItem<T>; getItemKey: (item: T) => string | number; isSelected: true; }) | (Partial<D & { children?: ReactNode; }> & { ...; })' is not assignable to type 'IntrinsicAttributes & D & { children?: ReactNode; }'.
Type 'Partial<D> & { item: ITreeItem<T>; getItemKey: (item: T) => string | number; isSelected: true; }' is not assignable to type 'IntrinsicAttributes & D & { children?: ReactNode; }'.
Type 'Partial<D> & { item: ITreeItem<T>; getItemKey: (item: T) => string | number; isSelected: true; }' is not assignable to type 'D'.
'Partial<D> & { item: ITreeItem<T>; getItemKey: (item: T) => string | number; isSelected: true; }' is assignable to the constraint of type 'D', but 'D' could be instantiated with a different subtype of constraint 'ITreeItemProps<T>'.ts(2322)