Я пишу компонент Graph, который имеет конфигурацию для оси x
и y
. Я хочу, чтобы GraphProps
использовался следующим образом:
type Stock = {
timestamp: string;
value: number;
company: 'REDHAT' | 'APPLE' | ... ;
}
const props: GraphProps<Stock> = {
x: {
dataKey: 'timestamp',
// type-checks that timestamp is a string
formatText: timestamp => new Date(timestamp).toDateString()
},
y: {
dataKey: 'company',
// type-checks that company is 'APPLE' | 'REDHAT' | ...
formatText: company => company === 'APPLE' ? 'Apple' : company
}
}
У меня есть следующий код Typescript:
type AxisType<T> = {
dataKey: keyof T;
// i want point to be:
// T[dataKey]
// how can I access dataKey from within the formatText
// type definition?
formatText: (point: T[keyof T]) => string;
}
type GraphProps<T> = {
x: AxisType<T>;
y: AxisType<T>;
}
, однако с текущим определением тип formatText
равен Stock[keyof Stock]
который равен Stock['timestamp' | 'value' | 'company']
, когда то, что я хочу, если предоставленный dataKey
равен company
, я бы хотел, чтобы тип formatText
был Stock['company']
.
Я думал о расширении GraphProps
generi c type с еще двумя параметрами типа (GraphProps<T, XDataKey, YDataKey>
), однако я могу добавить более двух осей и / или динамически много других осей.