I tried to make strictly typed column builder and ran into union type issue. I think the solution is to infer builder return type as (ColumnDef<Model, "Key1"> | ColumnDef<Model, "Key2>)[]
, but don't know how to achieve this
...
type EnhancedCellRenderer<
Model extends AnyObject,
Field extends keyof Model = keyof Model & string
> = (props: EnhancedCellRenderProps<Model, Field>) => ReactNode
type CellRenderer<
Model extends AnyObject,
Field extends keyof Model = keyof Model & string
> = BasicCellRenderer<Model[Field]> | EnhancedCellRenderer<Model, Field>
interface ColumnDef<
Model extends AnyObject,
Field extends keyof Model = keyof Model & string
> {
width?: number | string
field: Field
renderer?: CellRenderer<Model, Field>
}
type ColumnBuilder<Model extends AnyObject> = <Field extends keyof Model>(
field: Field,
config?: Omit<ColumnDef<Model, Field>, 'field'>
) => ColumnDef<Model, Field>
declare function buildColumns<Model extends AnyObject>(
cb: (builder: ColumnBuilder<Model>) => ColumnDef<Model>[]
): ColumnDef<Model>[]
type Model = {
'01.20': number
'02.05': number
'02.20': number
'03.05': number
'03.20': number
'04.05': number
'04.20': number
}
buildColumns<Model>((builder) => [builder('01.20'), builder('02.05')])
I've got this error
Type 'ColumnDef<Model, "01.20">' is not assignable to type 'ColumnDef<Model, "01.20" | "02.05" | "02.20" | "03.05" | "03.20" | "04.05" | "04.20">'.
Types of property 'renderer' are incompatible.
Type 'CellRenderer<Model, "01.20"> | undefined' is not assignable to type 'CellRenderer<Model, "01.20" | "02.05" | "02.20" | "03.05" | "03.20" | "04.05" | "04.20"> | undefined'.
Type 'EnhancedCellRenderer<Model, "01.20">' is not assignable to type 'CellRenderer<Model, "01.20" | "02.05" | "02.20" | "03.05" | "03.20" | "04.05" | "04.20"> | undefined'.
Type 'EnhancedCellRenderer<Model, "01.20">' is not assignable to type 'EnhancedCellRenderer<Model, "01.20" | "02.05" | "02.20" | "03.05" | "03.20" | "04.05" | "04.20">'.
Type '"01.20" | "02.05" | "02.20" | "03.05" | "03.20" | "04.05" | "04.20"' is not assignable to type '"01.20"'.