169 похожих чатов

Привет! А как в TS принято делать следующее? Допустим, есть массив

данных:

const items = [
{
id: '1',
joined: new Date('2021-03-15'),
revenue: 42_000,
revenueRate: 0.95,
username: 'Alice777',
},
{
id: '2',
joined: new Date('2020-08-26'),
revenue: 31_500,
revenueRate: 0.13,
username: 'Bob98',
},
//…
];

На их основе можно описать тип элемента:

type Item = {
id: string;
joined: Date;
revenue: number;
revenueRate: number;
username: string;
};

Но эти данные нужно выводить в HTML-таблицу. При этом, некоторые колонки нужно выравнивать по правому краю, а некоторые — кастомно форматировать (например, колонки с процентами или датами), и т.п.

Эти метаданные я решил описать в константе:

export const fields = [
{
align: 'right',
format: undefined,
key: 'id',
name: 'ID',
type: 'string',
},
{
align: undefined,
format: (date: unknown) => formatDate(date as Date),
key: 'joined',
name: 'Join Date',
type: 'date',
},
{
align: 'right',
format: undefined,
key: 'revenue',
name: 'Revenue',
type: 'number',
},
{
align: 'right',
format: (num: unknown) => formatNumber(num as number, 'percent'),
key: 'revenueRate',
name: 'Revenue Rate',
type: 'number',
},
{
align: undefined,
format: undefined,
key: 'username',
name: 'Username',
type: 'string',
},
] as const;

Константа соответствует типу:

type Field = {
align?: string;
format?: (val: FieldTypesDict[Field['type']]) => string;
key: string;
name: string;
type: keyof FieldTypesDict;
};

где FieldTypesDict — просто словарик со всеми возможными типами данных для таблицы:

type FieldTypesDict = {
date: Date;
number: number;
string: string;
//…
};

Но у константы проблема — в функцию форматирования прилетает значение с потерянным типом, хотя должен быть тип конкретного поля. Подскажите, плз, как получше это дело разрулить?

https://codesandbox.io/s/weathered-butterfly-y3ukm

3 ответов

21 просмотр

https://codesandbox.io/s/dependable-table-30zjx

Артур-Байбулатов Автор вопроса

Я так понял, ключевой фрагмент это: type ColumnMap<T> = { [K in keyof T]: { label: string; name: K; renderer: (value: T[K]) => Renderable; }; }; ? Круто. Буду дальше курить твой пример. Благодарю!

🤘🏿

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Карта сайта