Явно на первом родовом, но подразумевает второе в TS?

Возможно ли быть явным для первого общего, но неявно (предполагать) второе?

например, функция выбора:

function pick<T extends { [K: string]: any }, U extends keyof T>(obj: T, key: U): T[U] {
    return obj[key];
}

interface Obj {
    foo: string;
    bar: string;
}

const obj = {
    foo: 'foo',
    bar: 'bar',
};

// works, available keys are inferred
pick(obj, 'bar');

// error: Expected 2 type arguments, but got 1.
// Is there a way I can tell to TS to infer the 2nd generic instead of expecting it explicitly?
pick<Obj>(obj, '');

person Istvan Orban    schedule 11.08.2019    source источник


Ответы (1)


const pick = <T extends { [K: string]: any }>(obj: T) => <U extends keyof T>(key: U): T[U] => {
    return obj[key];
}

interface Obj {
    foo: string;
    bar: string;
}

const obj = {
    foo: 'foo',
    bar: 'bar',
};

// works, available keys are inferred
pick(obj)(bar)

// error: Expected 2 type arguments, but got 1.
// Is there a way I can tell to TS to infer the 2nd generic instead of expecting it explicitly?
pick<Obj>(obj)('foo');

Вы можете выполнить каррирование функции; Позвольте мне знать, если это помогает

person Shanon Jackson    schedule 11.08.2019
comment
Да, тот, с которым я ходил. К сожалению, пока я читал, правильного решения для частичного вывода пока нет: /. Спасибо за Ваш ответ! - person Istvan Orban; 11.08.2019