Обзор
Last updated
Was this helpful?
Last updated
Was this helpful?
Обсуждая, , мы рассмотрели основные возможности системы типов TypeScript. Вот некоторые ключевые моменты, которые обсуждались:
Дизайн системы типов TypeScript не является обязательным, поэтому ваш JavaScript - это TypeScript;
TypeScript не препятствует запуску JavaScript, даже если есть ошибки типов, что позволит постепенно переходить с JavaScript на TypeScript.
Теперь давайте начнем изучать синтаксис системы типов TypeScript. В этой главе вы сможете добавить аннотации типов в свой код и увидеть его преимущества. Это проложит путь для нашего дальнейшего понимания системы типов.
Как упоминалось ранее, аннотации типов используют синтаксис :TypeAnnotation
. Все, что доступно в пространстве объявления типа, может использоваться как аннотация типа.
В следующем примере используются аннотации типов для переменных, параметров функции и возвращаемых значений функции.
Примитивные типы JavaScript также адаптированы к системе типов TypeScript, поэтому string
, number
, boolean
также могут использоваться в качестве аннотаций типов:
TypeScript предоставляет специальный синтаксис типов для массивов, поэтому вы можете легко описывать массивы. Он использует суффикс []
, и вы можете добавлять любые допустимые аннотации типов по мере необходимости (например, :boolean[]
). Он позволяет безопасно использовать любые связанные с массивами операции, а также предотвращает некоторые варианты поведения, аналогичные назначению неверных типов. Это выглядит так:
Интерфейс является основным инструментов в TypeScript, он может объединять множество типов в одно объявление типа:
Здесь мы объединяем аннотацию типа: first: string
+ second: string
в аннотацию нового типа Name
, которое может принудительно проверять тип для каждого члена. Интерфейсы обладают большой силой в TypeScript, и далее в этой главе мы будем использовать целые главы, чтобы объяснить, как их лучше использовать.
Вместо создания интерфейса вы можете аннотировать что-либо с помощью встроенного синтаксиса аннотации: :{ /Structure/ }
Встроенные типы могут быстро предоставить вам аннотацию типа. Это может помочь вам избежать проблем с именами (вы можете использовать плохое имя). Однако, если вы обнаружите, что вам нужно использовать одну и ту же встроенную аннотацию несколько раз, рекомендуется рассмотреть возможность ее рефакторинга в интерфейс (или добавьте type alias
, который будет упомянут в следующем разделе).
В дополнение к упомянутым примитивным типам в TypeScript есть несколько специальных типов. Это any
, null
, undefined
и void
.
any
тип занимает особое место в системе типов TypeScript. Он предоставляет вам «заднюю дверь» к системе типов, а TypeScript отключит проверку типов. any
совместим со всеми типами (включая себя) в системе типов. Следовательно, ему могут быть назначены все типы, и он может быть назначен любому другому типу. Вот пример доказательства:
Когда вы переходите с JavaScript на TypeScript, вы часто будете использовать any
. Но вы должны уменьшить свою зависимость от него, потому что вам нужно обеспечить безопасность типов. При использовании any
, вы в основном говорите редактору TypeScript не выполнять никакой проверки типов.
В системе типов null
и undefined
литералы в JavaScript могут быть назначены любому типу переменной, как и другим переменным, помеченным any
типом, как показано в следующем примере:
Используйте :void
, чтобы указать, что функция не имеет возвращаемого значения
В информатике многие алгоритмы и структуры данных не зависят от реального типа объекта. Тем не менее, вы все еще хотите применить ограничения к каждой переменной. Например: функция принимает список и возвращает список обратно. Ограничения относятся к параметрам, передаваемым в функцию, и возвращаемому значению функции:
В предыдущем примере функция reverse
принимает массив типа T
(обратите внимание на параметр типа reverse<T>
) (items: T[]
) и возвращает массив типа T
(: T[]
). У функция reverse
возвращаемое значение имеет тот же тип, что и принимаемых параметрах. Когда вы передаете const sample = [1, 2, 3]
, TypeScript может сделать вывод, что реверс имеет тотже типnumber[]
, обеспечивая вам безопасность типов. Точно так же, когда вы передаете массив типа string[]
, TypeScript может сделать вывод, что reverse
имеет тип string[]
, как показано в следующем примере:
Фактически, у массивов JavaScript уже есть метод reverse
, а TypeScript использует обобщенные значения для определения его структуры:
Это означает, что когда вы вызываете метод .reverse
для массива, вы получаете безопасность типов:
Как правило, в JavaScript вы хотите, чтобы свойство было одним из нескольких типов, например строка или число. Для этого пригодится объединенный тип (обозначенный |
в аннотации типа, например, string | number
). Обычный вариант использования - это функция, которая может принимать одну строку или массив строк, например:
В JavaScript extend
является очень распространенным шаблоном. В этом режиме вы можете создать новый объект из двух других, созданный объект будет содержать все атрибуты обоих объектов. Перекрестные типы позволяют безопасно использовать этот режим:
JavaScript не поддерживает кортежи из коробки. Разработчики обычно могут использовать массивы только для представления кортежей, но система типов TypeScript поддерживает их. Используйте :[typeofmember1, typeofmember2]
, чтобы добавить аннотацию типов для кортежа. Кортежи могут содержать любое количество членов. Следующий пример иллюстрирует кортежи:
Используйте его с деструктуризацией в TypeScript:
TypeScript предоставляет удобный синтаксис для использования аннотаций типов. Синтаксис type SomeName = someValidTypeAnnotation
можно использовать для создания псевдонимов:
В отличие от интерфейсов, вы можете предоставить псевдонимы типов для аннотаций произвольных типов (полезно для объединяемых типов и перекрестных типов). Вот несколько примеров, чтобы познакомить вас с синтаксисом.
Теперь, когда вы смогли добавить аннотации типов в большую часть кода JavaScript, давайте углубимся в систему типов TypeScript.
Мы обсудим больше об интерфейсе Array<T>
позже, когда представим lib.d.ts
в разделе .