Автор оригинала: FreeCodeCamp Community Member.
Preethi Kasireddy
В качестве разработчика JavaScript вы можете задержать весь день, не обнаруживая какие-либо статические типы. Так зачем беспокоить о них?
Ну, оказывается, типы обучения – это не просто упражнение в разуме. Если вы готовы инвестировать некоторое время в изучении преимуществ, недостатков статических типов, недостатков и использование случаев использования, он может помочь вашему программированию чрезвычайно.
Заинтересован? Ну, вам повезло – это то, что остальная часть этой четверки серии о.
Во-первых, определение
Самый быстрый способ понять статические типы – это противопоставить их динамическими типами. Язык со статическими типами называется Статически напечатанный язык Отказ С другой стороны, язык с динамическими типами называется динамически набран язык.
Разница в основном в том, что статически набран Языки выполняют тип проверки на Время компиляции , пока динамически набран Языки выполняют тип проверки на Во время выполнения Отказ
Это оставляет еще одну концепцию для вас, чтобы справиться: что делает « проверка типа» иметь в виду?
Объяснить, давайте посмотрим на типы в Java против JavaScript.
«Типы» относится к типу определенных данных.
Например, в Java, если вы определите логический
Как: логический;
Это имеет правильный тип, потому что логический
Аннотация соответствует ценности, указанному на Результат
в отличие от целого числа или что-то еще.
С другой стороны, если вы пытались заявить: логический;
… Это не будет компилировать, потому что он имеет неверный тип. Это явно оценивает Результат
как логический
, но затем определяет это как целое число 123
Отказ
JavaScript и другие языки для динамически набирающихся языки имеют другой подход, позволяющий контексту установить, какие данные определены данные:
var;
Долгое время короткие: статически напечатанные языки требуют, чтобы вы объявили типы данных ваших конструкций, прежде чем вы сможете их использовать. Динамически напечатанные языки нет. JavaScript подразумевает тип данных, в то время как Java заявляет, что это прямо.
Так как вы можете видеть, типы позволяют указать программу Инварианты или логические утверждения и условия, при которых программа выполнится.
Тип проверки Проверяет и обеспечивает, чтобы тип конструкции (постоянный, логический, номер, переменную, массив, объект) соответствует инвариантному указанному вами. Вы можете, например, указать, что «эта функция всегда возвращает строку». Когда программа запускается, вы можете смело предположить, что она вернет строку.
Различия между проверкой статической проверки и динамическим типом, проверяющим веществом, когда происходит ошибка типа. В статически наплевом языке введите ошибки на этапе компиляции, то есть при компиляции времени. На динамически наведенных языках ошибки возникают только после выполнения программы. То есть в Во время выполнения Отказ
Это означает, что программа, написанная на динамически наведенном языке (например, JavaScript или Python), может компилировать, даже если она содержит ошибки типа, которые в противном случае не позволят правильному включению сценария.
С другой стороны, если программа, написанная на статически набранном языке (как SCALA или C ++), содержит ошибки типа, он не сможет скомпилировать, пока ошибки не будут исправлены.
Новая эра JavaScript
Поскольку JavaScript – это динамически напечатанный язык, вы можете пройти объявление переменных, функций, объектов и чего-либо, не объявляя тип.
Удобно, но не всегда идеально. Вот почему инструменты, такие как Поток и Tymdercript Недавно вошла, чтобы дать разработчики JavaScript * опцию *, чтобы использовать статические типы.
Поток Разработана ли библиотека проверки статического типа с открытым исходным кодом, разработанная и выпущенная на Facebook, что позволяет постепенно добавлять типы в ваш код JavaScript.
Tymdercript С другой стороны, является суперсетом, который компилирует до JavaScript – хотя он чувствует себя почти как новый язык, напечатанный сам по себе. Это сказано, это выглядит и чувствует себя очень похожим на JavaScript и не сложно забрать.
В любом случае, когда вы хотите использовать типы, вы явно сообщите инструмент, о котором файлы (ы) для проверки. Для Teadercript вы делаете это, написав файлы с .ts
Расширение вместо .js
Отказ Для потока вы включаете комментарий на вершину файла с @поток
После того, как вы заявили, что вы хотите выбрать «Проверьте файл», вы получаете использование их соответствующего синтаксиса для определения типов. Одним из различий между двумя инструментами является то, что поток представляет собой тип «Checker», а не компилятор. Типприпсор, с другой стороны, является компилятором.
Я искренне верю, что инструменты, такие как поток и Teadercript, предлагая A Сдвиг по генерации и продвижение для JavaScript.
Лично я узнал так много, используя типы в мой день в день. Вот почему я надеюсь, что вы присоедините меня к этому короткому и сладкому путешествию в статические типы.
Остальная часть этого 4-частей будет покрываться:
Часть I. Быстрый введение в синтаксис потока и языка
Части II & III. Преимущества и недостатки статических типов (с подробными примерами прогулки)
Часть IV. Если вы используете статические типы в JavaScript или нет?
Обратите внимание, что я выбрал Flow Over Typescript в примерах в этом посте из-за моего знакомства с ним. Для ваших собственных целей, пожалуйста, сделайте исследование и выберите нужный инструмент для вас. Tymdercript также фантастически.
Без дальнейших Ado, давайте начнем!
Часть 1: быстрый введение в синтаксис и язык потока
Чтобы понять преимущества и недостатки статических типов, вы должны сначала получить базовое понимание синтаксиса для статических типов с использованием потока. Если вы никогда не работали в статически наплетенном языке раньше, синтаксис может занять некоторое время, чтобы привыкнуть.
Давайте начнем с того, как добавить типы в примитивы JavaScript, а также конструирует, как массивы, объект, функции и т. Д.
логический
Это описывает логический
(True или False) значение в JavaScript.
Обратите внимание, что, когда вы хотите указать тип, используемый вами синтаксис:
номер
Это описывает номер с плавающей точкой IEEE 754. В отличие от многих других языков программирования, JavaScript не определяет различные типы чисел (например, целые числа, короткие, длинные и плавающие точки). Вместо этого номера всегда хранятся как номера с плавающей точкой двойной точности. Следовательно, вам нужен только один тип номера, чтобы определить любое число.
Номер
включает в себя Бесконечность
и Нан
Отказ
нить
Это описывает строку.
ноль
Это описывает null
Тип данных в JavaScript.
пустота
Это описывает undefined
Тип данных в JavaScript.
Обратите внимание, что null
и undefined
обрабатываются по-разному. Если вы пытались сделать:
Поток будет бросать ошибку, потому что тип пустота
Предполагается иметь тип undefined
что не то же самое, что тип null
Отказ
Множество
Описывает массив JavaScript. Вы используете синтаксис Массив <
. ; T> Чтобы описать массив, элементы которых имеют некоторые Тип Т.
Обратите внимание, как я заменил T
с строка
, что означает, что я объявляю Сообщения
как массив строк.
Объект
Это описывает объект JavaScript. Существует несколько разных способов добавления типов на объекты.
Вы можете добавить типы для описания формы объекта:
Вы можете определить объекты в качестве отображений, где вы отображаете строку к некоторому значению:
Вы также можете определить объект как Объект
тип:
Этот последний подход позволяет нам установить какую-либо клавишу и значение на свой объект без ограничений, поэтому он на самом деле не добавляет большое значение, насколько касается проверки типа.
любой
Это может представлять буквально любой тип. любой
Тип эффективно не проверяется, поэтому вы должны попытаться избежать его использования, если не обязательно не нужно (вроде бы, когда вам нужно отказаться от проверки типа или нуждаться в выпуске).
Одна ситуация, которую вы можете найти любой
Полезно для использования внешней библиотеки, которая расширяет прототипы другой системы (например, объект. Прототип).
Например, если вы используете библиотеку, которая расширяет объект. Прототип с Досметочное
имущество:
Вы можете получить ошибку:
Чтобы обойти это, вы можете использовать любой
:
Функции
Наиболее распространенным способом добавления типов в функции – добавить типы к его входным аргументам и (при необходимости) Возвращаемое значение:
Вы даже можете добавить типы в Async Functions (см. Ниже) и генераторы:
Обратите внимание, как наш второй параметр getpurchaselimit
Аннотируется как функция, которая возвращает Обещание
Отказ И Объединенный намерсетушёнсилимит
Аннотируется как и возвращение Обещание
Отказ
Тип псевдонима
Псевдоним типа – один из моих любимых способов использования статических типов. Они позволяют вам использовать существующие типы (номер, строку и т. Д.) Для создания новых типов:
Выше я создал новый тип под названием Срок оплаты Method
который имеет свойства, которые состоят из Номер
и строка
Типы.
Теперь, если вы хотите использовать Срок оплаты Method
Тип, вы можете сделать:
Вы также можете создавать псевдонимы типа для любого примитива, путем упаковки базового типа внутри другого типа. Например, если вы хотите набрать псевдоним A Имя
и EmailAddress
:
Делая это, вы указываете на то, что Имя
и Email
разные вещи, а не только строки. Поскольку имя и электронное письмо не совсем взаимозаменяемы, делая это, предотвращает их случайное смешивание.
Универсал
Дженерики – это способ аренды на самих типов. Что это значит?
Давайте взглянем:
Я создал абстракцию для типа T
Отказ Теперь вы можете использовать любой тип, который вы хотите представлять T
Отказ Для Numbert
, T
был типа Номер
Отказ Между тем, для Arrayt
, Т был типа Массив
Да, я знаю. Это головокружение, если это первый раз, когда вы смотрите на типы. Я обещаю, что «нежное» вступление почти закончено!
Может быть
Может быть, тип позволяет нам ввести аннотировать потенциально null
или undefined
значение. У них есть тип Т | пустота | нулевая
Для некоторого типа T
, что означает, что это либо тип T
или это undefined
или null
Отказ Определить Может быть
Введите, вы положите знак вопроса перед определением типа:
Здесь я говорю, что сообщение является либо строка
или это null
или undefined
Отказ
Вы также можете использовать, может быть, указать, что свойство объекта будет одним из некоторых типов T
или undefined
:
Положив ?
Рядом с именем свойства для Добратициальные
, вы можете указать, что это поле является необязательным.
Непересекающиеся союзы
Это еще один мощный способ моделирования данных. Недоступные профсоюзы полезны, когда у вас есть программа, которая должна иметь дело с различными видами данных. Другими словами, форма данных может отличаться в зависимости от ситуации.
Расширение на Срок оплаты Method
Напечатайте из наших предыдущих общих ресурсов, давайте скажем, что у вас есть приложение, в котором пользователи могут иметь один из трех типов способов оплаты. В этом случае вы можете сделать что-то вроде:
Затем вы можете определить тип PaymentMethody в качестве непересекающегося союза с тремя случаями.
Способ оплаты теперь может быть только одной из этих трех форм. Недвижимость Тип
это свойство, которое делает тип профсоюза «нерешено».
Вы увидите более практичные примеры типов непересекающихся профсоюзах, а также части II.
Хорошо, почти сделано. Есть пара других особенностей потока, которую стоит упомянуть, прежде чем заключить это вступление:
1) Тип вывода : Flow использует тип вывода, где это возможно. Введите вынос ударов, когда проверяют тип типа автоматически вывести тип данных выражения. Это помогает избежать чрезмерной аннотации.
Например, вы можете написать:
Несмотря на то, что этот класс не имеет типов, поток может адекватно найти его:
Здесь я пытался определить область
как строка
, но в Прямоугольник
Определение класса, которое мы определили ширина
и Высота
как цифры. Так основано на определении функции для область
это должно быть возвращение Номер
Отказ Хотя я не явно определил типы для область
Функция, поток поймал ошибку.
Одно следует отметить, что сопровождающие потоку рекомендуют, чтобы вы экспортировали определение этого класса, вы хотите добавить явные определения типа, чтобы облегчить найти причину ошибок, когда класс не используется в локальном контексте.
2) Тесты динамического типа : Что это в основном означает, что поток имеет логику для определения того, какой тип значения будет во время выполнения, и поэтому способен использовать это знание при выполнении статического анализа. Они становятся полезными в таких ситуациях, как когда поток бросает ошибку, но вам нужно убедить течь, что вы делаете правильно.
Я не буду идти в слишком много подробно, потому что это больше продвинутая функция, которую я надеюсь написать отдельно, но если вы хотите узнать больше, стоит прочитать через Документы Отказ
Мы закончили с синтаксисом
Мы покрывали много земли в одном разделе! Я надеюсь, что этот обзор высокого уровня был полезным и управляемым. Если вам интересно пойти глубже, я призываю вас погрузиться в Хорошо написанные документы и исследовать.
С синтаксисом, давайте, наконец, доберемся до удовольствия: Изучение преимуществ и недостатков использования типов !
Далее: Часть 2 и 3 Отказ