I want to create generic interface for table column
And I want typescript infer type of 'value' inside 'render' by using 'field' (that uses "dotted path")
But it inferred that 'value' has type of all values of RowData What I do wrong ?
type Paths<T, K extends keyof T = keyof T> = K extends string
? T[K] extends Record<string, any>
? T[K] extends ArrayLike<any>
? `${K}.${Paths<T[K], Exclude<keyof T[K], keyof any[]>>}`
: `${K}.${Paths<T[K], keyof T[K]>}`
: K
: never;
type FieldValue<T, Path extends string> = string extends Path
? unknown
: Path extends keyof T
? T[Path]
: Path extends `${infer K}.${infer R}`
? K extends keyof T
? FieldValue<T[K], R>
: unknown
: unknown;
type Flat<T> = { [k in Paths<T>]: FieldValue<T, k> };
export interface TableColumn<D, K extends keyof Flat<D> = keyof Flat<D>> {
title: string;
readonly field?: K;
render?: (options: { row: D; value: Flat<D>[K] }) => string;
}
interface RowData {
a: number;
b: {
c: string
}
}
const d: TableColumn<RowData> = {
title: 'Title',
field: 'b.c',
render: ({ value }) => value // value type is string | number but expected string because RowData['b.c'] is string
};
Via Active questions tagged javascript - Stack Overflow https://ift.tt/LOBHu5m
Comments
Post a Comment