Получить тип параметра родного брата - PullRequest
1 голос
/ 17 апреля 2020

Я пишу компонент 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>), однако я могу добавить более двух осей и / или динамически много других осей.

1 Ответ

1 голос
/ 17 апреля 2020

Определите AxisType<T> и GraphProps<T>, например:

type AxisType<T> = {
  [K in keyof T]: {
    dataKey: K;
    formatText: (point: T[K]) => string;
  };
}[keyof T];

type GraphProps<T> = {
  [axis: string]: AxisType<T>;
};
...