Параметр универсальной функции TypeScript и вывод возвращаемого типа - PullRequest
3 голосов
/ 23 сентября 2019

В чем разница между этими двумя определениями функций?

С первым getProperty TypeScript может вывести тип return .Но второй провал.

function getProperty<T, K extends keyof T>(obj: T, key: K) {
    return obj[key];
}

function getProperty2<T>(obj: T, key: keyof T) {
    return obj[key];
}
let obj = {
    a: 1,
    name: 'test',
}

const name2 = getProperty(obj, 'name');
name2.length;   // This is OK, name2 is infered as string

const name3 = getProperty2(obj, 'name');
name3.length;  // This is ERROR! name3 is of type string | number

1 Ответ

2 голосов
/ 23 сентября 2019

На первом, K явно определено.Таким образом, когда вы передаете name, Typescript может вывести тип.Однако для второго функция getProperty2 ожидает любой keyof T.Таким образом, тип возвращаемого значения становится string | number (если вы добавите больше ключа к obj, это станет более сложным).Вот почему Typescript не уверен, какой из них вы получите.

Вы можете исправить это, используя as следующим образом, поскольку вы уверены, что получите string взамен.

const name3 = getProperty2(obj, 'name') as string;
name3.length;
...