full example here
type NumericKeysOnly<T> = {
[K in keyof T]: T[K] extends number | undefined ? K : never;
}[keyof T];
type MetricFieldKey<T> = Exclude<NumericKeysOnly<T>, undefined>;
export type TestType = {
id: number;
name?: number;
description: string;
createdAt: Date;
updatedAt: Date;
};
export type TestType2 = TestType & {
extraParam?: number;
};
export type TestType3 = TestType & {
megaParam?: number;
};
type RowConfig<T> = {
label: string;
fieldName: MetricFieldKey<T>;
order: number;
};
function TestControl<T extends TestType>({
data,
showRows,
}: {
data: T;
showRows?: RowConfig<T>[];
}) {
return (
showRows &&
showRows.map((row) => {
return <div key={row.label}>{data[row.fieldName]}</div>;
})
);
}
usage :
<TestControl
data={testData3}
showRows={[
{ label: 'ID', fieldName: 'id', order: 1 },
{ label: 'Name', fieldName: 'name', order: 2 },
{ label: 'Mega Param', fieldName: 'megaParam', order: 6 },
]}
/>
It works as expected, showRows allow only specific keys of provided object even if it extends base type.
but in case of array:
export function ArrayTestContainer() {
return (
<ComposedTestControl
datas={[
{
label: 'Test Tab 1',
data: testData,
showRows: [
{ label: 'ID', fieldName: 'id', order: 1 },
{ label: 'Name', fieldName: 'name', order: 2 },
],
},
{
label: 'Test Tab 2',
data: testData2,
showRows: [
{ label: 'ID', fieldName: 'id', order: 1 },
{ label: 'Name', fieldName: 'name', order: 2 },
{ label: 'Extra Param', fieldName: 'extraParam', order: 6 },
],
},
{
label: 'Test Tab 3',
data: testData3,
showRows: [
{ label: 'ID', fieldName: 'id', order: 1 },
{ label: 'Name', fieldName: 'name', order: 2 },
{ label: 'Mega Param', fieldName: 'megaParam', order: 6 },
],
},
]}
/>
);
}
information about exact type lost, and all types threaten as base TestType
is it possible to restore per element data information ? I also not want use "any" tried to use "as const" to make snapshot type, but get even more compile errros with readonly problems. For example cast it to something or use explicit classes instead of types?
Type 'T[Exclude<NumericKeysOnly<T>, undefined>]' is not assignable to type 'ReactNode'.matter? If not, it should not be in the example.