История изменений
Исправление Princesska, (текущая версия) :
Тебе нужно использовать юнион с типом-параметром и { [field]: number }
:
const findRow = <F extends string, T extends Record<string, any>>(
table: (T & Record<F, number>)[], /* T здесь -- всё остальное кроме field */
value: number,
field: F
) => table.find(row => Math.abs(row[field] - value) < 0.01); /* за использование for в таком простом примере тебя закопают на любом ревью, укажи явно, что ты хочешь сделать */
findRow(
[
{ a: 1, b: 'first' },
{ a: 2, b: 'second' },
{ a: 't3', b: 'third' }, /* => Type 'string' is not assignable to type 'number'.(2322) */
],
2.005,
'a'
);
А возвращаемый тип выведется сам.
Исходная версия Princesska, :
Тебе нужно использовать юнион с типом-параметром и { [field]: number }
:
const findRow = <F extends string, T extends Record<string, any>>(
table: (T & Record<F, number>)[], /* T здесь -- всё остальное кроме field */
value: number,
field: F
): T | undefined => table.find(row => Math.abs(row[field] - value) < 0.01); /* за использование for в таком простом примере тебя закопают на любом ревью, укажи явно, что ты хочешь сделать */
findRow(
[
{ a: 1, b: 'first' },
{ a: 2, b: 'second' },
{ a: 't3', b: 'third' }, /* => Type 'string' is not assignable to type 'number'.(2322) */
],
2.005,
'a'
);