Универсальный тип — это тип script

#javascript #typescript #typescript-typings

#javascript #typescript #typescript-типизации

Вопрос:

 function identity<String>(arg: String): String {
  return arg;
}
 
let myIdentity = identity([2]);
console.log()
 

Привет, может кто-нибудь помочь мне понять, почему это не выдает никаких ошибок типа, даже если я передаю массив чисел?

  1. Это потому, что тип «String» вместо «string», который ищет объекты, а не примитивные?
  2. Если ответ «да», если я изменю все на string, я получу сообщение об ошибке, в котором строка никогда не используется
 function identity<string>(arg: string): string {
  return arg;
}
 
let myIdentity = identity([2]);
console.log(myIdentity )

'string' is declared but its value is never read.
 

Ответ №1:

Вы затеняете встроенные типы String и string используете их имена в качестве своего общего параметра. Просто используйте имя параметра, которое не является встроенным, чтобы решить его:

Ссылка на игровую площадку TS

 function identity<T extends string>(value: T): T {
  return value;
}
 
identity([2]); // error [2] doesn't extend string
identity('2'); // ok
 

Если вам нужна общая функция идентификации без каких-либо ограничений, вы можете использовать неограниченный параметр типа:

Ссылка на игровую площадку TS

 function identity<T>(value: T): T {
  return value;
}
 
const numberArrayValue = identity([2]); // number[]
const objectValue = identity({b: 2}); // { b: number; }
const stringLiteralValue = identity('2'); // "2"
const numberLiteralValue = identity(2); // 2
 

Комментарии:

1. Спасибо, так что бы означало это утверждение? идентификатор функции<T расширяет строку>(значение: число): число { возвращаемое значение; }

2. он не выдает никаких ошибок, даже если я определяю общий тип как T extend string , но устанавливает параметр и возвращает значение number . Что логически означает эта декаляция

3. @PDHide » если я определяю общий тип как T extend string , но устанавливает param и возвращает значение number «: параметры типа работают аналогично обычным параметрам функции: если вы их не используете, они не имеют значения. T extends string означает, что любое значение, предоставляемое переменной типа T , должно быть присвоено string типу. Я предлагаю прочитать раздел generics в руководстве TypeScript, чтобы узнать об общих параметрах и extends ключевом слове.