#typescript #generics
#typescript #обобщения
Вопрос:
В настоящее время я прохожу курс по TypeScript, и мне было интересно следующее. Почему extends T
ограничение для функции ниже? Я думал, что ограничение будет return param.length
, поскольку длина является свойством string .
function genericInferred<T extends string>(param: T) {
return param.length;
}
console.log(genericInferred("Four"));
type UUID = string;
let id: UUID = "123-456";
console.log(genericInferred(id));
Ответ №1:
Честно говоря, нет смысла использовать обобщенный в этом конкретном сценарии, поскольку вы возвращаете a number
.
Использование T extends string
имеет смысл, если вы хотите вернуть тип, который зависит от типа T
, поскольку использование универсального означает, что строковые литералы и объединения строковых литералов будут сохранять свои конкретные значения, а не расширяться до string
.
function genericInferred<T extends string>(param: T): { someKey: T } {
return {
someKey: param
};
}
Здесь мы можем возвращать { someKey: T }
вместо { someKey: string }
. Проверьте разницу в типе возвращаемого значения по этой ссылке на игровую площадку .
Ответ №2:
В TypeScript общим ограничением по определению является то, с какими типами может вызываться функция. Что функция делает в своем теле или что возвращает функция, не имеет значения.
Вы всегда можете определить ограничения, просто просмотрев список параметров (включая обобщения). Здесь это:
<T extends string>(param: T)
Таким образом, «ограничение» — это просто то, что param
является a T
, и это T
строка.