Неявные типы с обобщениями

#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 строка.