Nivo построена вокруг строго типизированных React-компонентов, где каждый график представляет собой отдельный модуль с собственным набором пропсов. В TypeScript-экосистеме библиотека предоставляет детализированные интерфейсы, которые позволяют контролировать структуру данных, внешний вид, поведение анимаций и взаимодействие с пользователем.
Базовый принцип организации типов в Nivo заключается в разделении на три уровня:
Каждый компонент, например Bar, Line,
Pie, имеет собственный набор generic-типов, где ключевую
роль играет параметризация данных.
Каждый график требует строго определённого формата данных, который задаётся через generics.
Для столбчатых диаграмм используется структура, где каждая запись содержит категорию и числовые значения:
indexBy)keys)Типизация обычно выражается через:
BarDatumКлючевая особенность — динамическое количество метрик, определяемое
массивом keys.
Линейные графики используют структуру серии:
id — идентификатор линииdata — массив точек { x, y }Типизация:
SerieLineSvgProps generic-параметрыОсобенность: поддержка как числовой, так и категориальной оси X, что
отражается в union-типах string | number | Date.
Круговые диаграммы используют плоскую структуру:
idvalueТип:
PieDatumВ отличие от Bar и Line, Pie требует минимальной структуры, но усиливает требования к числовой целостности данных.
Компонент ResponsiveBar является одним из наиболее
типизированных модулей, поскольку сочетает визуализацию, оси, анимации и
взаимодействие.
Основной интерфейс:
ResponsiveBarProps<Datum>Ключевые группы пропсов:
data: Datum[]keys: string[]indexBy: keyof DatumТипизация здесь критична: indexBy должен ссылаться на
существующее поле объекта данных, иначе TypeScript выдаёт ошибку
несоответствия.
margin: { top, right, bottom, left }padding: numberinnerPadding: numberТипы строго числовые, но допускают partial-конфигурации через
Partial<>.
colors: string | string[] | FunctioncolorBy: 'id' | 'indexValue'Типизация поддерживает функции вида
(datum) => string, что позволяет реализовать
динамическое раскрашивание.
axisBottom, axisLeft,
axisTop, axisRightКаждая ось имеет тип:
AxisPropsВключает:
tickSizetickPaddingtickRotationformat: string | FunctionTypeScript позволяет переопределять форматирование через функцию,
возвращающую string | number.
animate: booleanmotionConfig: 'default' | 'gentle' | 'wobbly' | objectТипизация motion основана на конфигурации Framer Motion, где допускаются как строковые пресеты, так и объектные определения переходов.
Линейные графики имеют более сложную типизацию из-за многосерийной структуры.
Основной интерфейс:
ResponsiveLineProps<Serie>data: Serie[]Где Serie включает:
id: string | numberdata: { x: X; y: Y }[]Типы X и Y параметризуются отдельно, что
позволяет строить графики на датах, строках или числах.
Line chart использует дополнительные параметры:
xScale: ScaleSpecyScale: ScaleSpecТип ScaleSpec может включать:
type: 'linear' | 'time' | 'point'min, maxТипизация шкал тесно связана с d3-scale моделями.
useMesh: booleanenableSlices: 'x' | 'y' | falseТипизация событий:
onMouseMoveonClickonLegendClickКаждый обработчик получает строго типизированный datum:
SeriePointPointTooltipPie chart использует компактную модель, но с богатой конфигурацией визуализации.
ResponsivePieProps<PieDatum>data: PieDatum[]Где:
id: string | numbervalue: numberlabel?: stringTypeScript строго ограничивает value числом, поскольку
вся геометрия строится на долях суммы.
innerRadius: numberouterRadius: numberpadAngle: numberТипы float-значений в диапазоне 0–1 или радианных значений зависят от параметра.
arcLabelsSkipAngle: numberarcLabelsTextColor: string | FunctionТипизация функций позволяет динамически определять цвет текста на основе контраста сегмента.
data: { id: string; dat a: { x: number; y: number }[] }[]Типы:
ScatterPointScatterSeriesОсобенность: строгая числовая система координат, без категориальных осей.
data: HeatMapDatum[][]Типизация:
HeatMapDatumHeatMapValueКаждая ячейка содержит:
xyvalue: numberДопускается расширение через generic
T extends HeatMapDatum.
Тип:
ThemeВключает:
backgroundtextColorfontSizeaxisgridВсе поля допускают глубокое частичное переопределение через
Partial<Theme>.
Тип:
LegendPropsСодержит:
anchordirectiontranslateX, translateYitemsSpacingТипизация ориентации строго ограничена union-типами:
'horizontal' | 'vertical'Тип:
TooltipComponentМожет быть:
(datum) => ReactNodeЭто обеспечивает расширяемость без нарушения базовой типизации компонента.
Типовая структура компонентов построена вокруг:
Responsive<ComponentName><Datum, ExtraProps>Ключевая идея — перенос максимальной ответственности за типы данных на уровень пользователя, при сохранении строгой внутренней типизации библиотеки.
Такой подход позволяет: