#javascript #typescript #typescript-typings
#javascript #typescript #typescript-типизации
Вопрос:
function identity<String>(arg: String): String {
return arg;
}
let myIdentity = identity([2]);
console.log()
Привет, может кто-нибудь помочь мне понять, почему это не выдает никаких ошибок типа, даже если я передаю массив чисел?
- Это потому, что тип «String» вместо «string», который ищет объекты, а не примитивные?
- Если ответ «да», если я изменю все на 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
используете их имена в качестве своего общего параметра. Просто используйте имя параметра, которое не является встроенным, чтобы решить его:
function identity<T extends string>(value: T): T {
return value;
}
identity([2]); // error [2] doesn't extend string
identity('2'); // ok
Если вам нужна общая функция идентификации без каких-либо ограничений, вы можете использовать неограниченный параметр типа:
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
ключевом слове.