LINUX.ORG.RU

История изменений

Исправление 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'
);