我想有Columns<T>
个类型,这将引用它自己的属性之一,但与不同的T
类型.
Columns<T>
是ColumnDefinitionType<T>
联合类型的array.
type Columns<T> = ColumnDefinition<T>[];
type ColumnDefinition<T> = SubgridColumn<T> | Column<T>;
Column<T>
是具有一个属性的对象类型
type Column<T> = {
render: (item: T, rowIndex: number) => React.ReactNode;
};
SubgridColumn<T>
有两个属性
type SubgridColumn<T> = {
subgridItems: ((item: T, rowIndex: number) => any[]) | any[];
subgridColumns: Columns<any>;
};
目前,subgridItems
可以是任何类型的数组,也可以是返回任何类型数组的函数,而subgridColumns
是Columns<any>
类型.
我想输入Subgrid<T, N>
,其中N
替换任何类型
type SubgridColumn<T, N> = {
subgridItems: ((item: T, rowIndex: number) => N[]) | N[];
subgridColumns: Columns<N>;
};
此类型的用法为
type Cargo = { locationFrom: string; models: Model[] };
type Model = { modelName: string; parts: Part[] };
type Part = { partName: string; partPrice: number };
type UsageCountry = { countryName: string; contintent: string };
const countries: UsageCountry[] = [
{ countryName: 'Ireland', contintent: 'Europe' },
{ countryName: 'USA', contintent: 'North America' },
];
const cargos: Cargo[] = [
{
locationFrom: 'London',
models: [
{
modelName: 'Audi',
parts: [
{ partName: 'Spoiler', partPrice: 599 },
{ partName: 'Wheel', partPrice: 199 },
],
},
{ modelName: 'Subaru', parts: [{ partName: 'Tint', partPrice: 99 }] },
],
},
{ locationFrom: 'Paris', models: [{ modelName: 'VW', parts: [{ partName: 'Muffler', partPrice: 159 }] }] },
];
波纹管是类型为Columns<Cargo>
的柱.它是一个由ColumnDefinition<Cargo>
组成的数组,可以是Column<Cargo>
或SubgridColumn<Cargo>
.当它是后一种类型时,我想让subgridColumns
从subgridItems类型推断类型.
因此,如果subgridItems
返回类型为Model[]
,则subgridColumns
应为Columns<Model>
类型
const columns: Columns<Cargo> = [
{ render: cargo => cargo.locationFrom },
{
subgridItems: cargo => cargo.models,
subgridColumns: [
{ render: model => model.modelName },
{
subgridItems: model => model.parts,
subgridColumns: [{ render: part => part.partName }, { render: part => part.partPrice }],
},
{
subgridItems: model => (model.modelName === 'Subaru' ? countries : []),
subgridColumns: [
{
render: country => country.countryName,
},
],
},
],
},
];
您还可以看到,当使用Columns<Model>
类型时,返回与Model
或Cargo
类型无关的UsageCountry
类型的国家/地区数组,因此基本上不应该将返回subgridItems
的类型(或subgridItems类型,如果它不是函数,而是数组)绑定到Columns<T>
中的类型T
的属性
如何实现这一点,因为当前设置问题是返回类型subgridItems
始终是Any,使用起来不安全.