TypeScript — это бесплатный язык программирования высокого уровня с открытым исходным кодом , разработанный Microsoft , который добавляет в JavaScript статическую типизацию с необязательными аннотациями типов . Он предназначен для разработки больших приложений и транслируется в JavaScript. [6] Поскольку TypeScript является надмножеством JavaScript, все программы JavaScript являются синтаксически допустимыми TypeScript, но они могут не выполнять проверку типов по соображениям безопасности .
TypeScript можно использовать для разработки приложений JavaScript для выполнения как на стороне клиента , так и на стороне сервера (как в случае с Node.js , Deno или Bun ). Для транспиляции доступно несколько вариантов. Можно использовать компилятор TypeScript по умолчанию [7] или вызвать компилятор Babel для преобразования TypeScript в JavaScript.
TypeScript поддерживает файлы определений, которые могут содержать информацию о типах существующих библиотек JavaScript , подобно тому, как файлы заголовков C++ могут описывать структуру существующих объектных файлов . Это позволяет другим программам использовать значения, определенные в файлах, как если бы они были статически типизированными объектами TypeScript. Существуют сторонние заголовочные файлы для популярных библиотек, таких как jQuery , MongoDB и D3.js. Также доступны заголовки TypeScript для модулей библиотеки Node.js , что позволяет разрабатывать программы Node.js внутри TypeScript. [8]
Компилятор TypeScript сам написан на TypeScript и скомпилирован в JavaScript. Он распространяется по лицензии Apache License 2.0 . Андерс Хейлсберг , ведущий архитектор C# и создатель Delphi и Turbo Pascal , работал над разработкой TypeScript. [9] [10] [11] [12]
TypeScript был выпущен для широкой публики в октябре 2012 года в версии 0.8 после двух лет внутренней разработки в Microsoft. [13] [14] Вскоре после первого публичного выпуска Мигель де Икаса похвалил сам язык, но раскритиковал отсутствие зрелой поддержки IDE, за исключением Microsoft Visual Studio , которая в то время не была доступна в Linux и OS X. [15] [16] По состоянию на апрель 2021 года имеется поддержка в других IDE и текстовых редакторах, включая Emacs , Vim , WebStorm , Atom [17] и собственный Visual Studio Code от Microsoft . [18] В TypeScript 0.9, выпущенном в 2013 году, добавлена поддержка дженериков . [19]
TypeScript 1.0 был выпущен на конференции разработчиков Microsoft Build в 2014 году . [20] Обновление 2 для Visual Studio 2013 обеспечивает встроенную поддержку TypeScript. [21] Дальнейшие улучшения были внесены в июле 2014 года, когда команда разработчиков анонсировала новый компилятор TypeScript, производительность которого, как утверждается, увеличилась в пять раз. Одновременно с этим исходный код, который изначально размещался на CodePlex , был перенесен на GitHub . [22]
22 сентября 2016 года был выпущен TypeScript 2.0, в котором появилось несколько функций, в том числе возможность для программистов дополнительно обеспечивать нулевую безопасность , [23] чтобы смягчить то, что иногда называют ошибкой на миллиард долларов .
TypeScript 3.0 был выпущен 30 июля 2018 года [24] и содержит множество языковых дополнений, таких как кортежи в остаточных параметрах и выражениях распространения, остальные параметры с типами кортежей, общие остаточные параметры и т. д. [25]
TypeScript 4.0 был выпущен 20 августа 2020 года. [26] Хотя версия 4.0 не внесла каких-либо критических изменений, в нее были добавлены такие языковые функции, как пользовательские фабрики JSX и типы кортежей с переменным числом вариантов. [26]
TypeScript 5.0 был выпущен 16 марта 2023 года и включал поддержку декораторов. [27]
TypeScript возник из-за недостатков JavaScript для разработки крупномасштабных приложений как в Microsoft, так и среди их внешних клиентов. [28] Проблемы, связанные с работой со сложным кодом JavaScript, привели к появлению спроса на специальные инструменты, упрощающие разработку компонентов на языке. [29]
Разработчики TypeScript искали решение, которое не нарушило бы совместимость со стандартом и его кроссплатформенную поддержку. Зная, что текущее предложение стандарта ECMAScript обещает будущую поддержку программирования на основе классов , TypeScript был основан на этом предложении. Это привело к созданию компилятора JavaScript с набором синтаксических расширений языка, расширенного набора, основанного на предложении, который преобразует расширения в обычный JavaScript. В этом смысле функция класса TypeScript была предварительным просмотром того, чего ожидать от ECMAScript 2015. Уникальным аспектом, которого нет в предложении, но добавлен в TypeScript, является необязательная статическая типизация (также известная как постепенная типизация ), которая позволяет статическому анализу языка облегчить инструментарий и поддержку IDE.
TypeScript добавляет поддержку таких функций, как классы, модули и синтаксис стрелочных функций, как определено в стандарте ECMAScript 2015.
TypeScript — это расширение языка, которое добавляет функции в ECMAScript 6. Дополнительные функции включают в себя:
Следующие функции перенесены из ECMAScript 2015:
Синтаксически TypeScript очень похож на JScript .NET , еще одну реализацию Microsoft языкового стандарта ECMA-262, в которой добавлена поддержка статической типизации и классических функций объектно-ориентированного языка, таких как классы, наследование, интерфейсы и пространства имен.
TypeScript — это строгий расширенный набор ECMAScript 2015, который сам по себе является расширенным набором ECMAScript 5, обычно называемого JavaScript. [32] Таким образом, программа JavaScript также является допустимой программой TypeScript, и программа TypeScript может беспрепятственно использовать JavaScript. По умолчанию компилятор ориентирован на ECMAScript 5, текущий преобладающий стандарт, но также может генерировать конструкции, используемые в ECMAScript 3 или 2015.
С помощью TypeScript можно использовать существующий код JavaScript, включать популярные библиотеки JavaScript и вызывать код, сгенерированный TypeScript, из другого JavaScript. [33] Объявления типов для этих библиотек предоставляются вместе с исходным кодом.
TypeScript обеспечивает статическую типизацию посредством аннотаций типов, что позволяет осуществлять проверку типов во время компиляции . Это необязательно, и его можно игнорировать, чтобы использовать обычную динамическую типизацию JavaScript.
функция add ( слева : число , справа : число ) : число { возврат влево + вправо ; }
Примитивные типы аннотируются с помощью типов number
, boolean
и string
. Эти типы отличаются от своих аналогов класса ( Number
, Boolean
, и т. д.), которые не могут выполнять операции непосредственно над значениями. Например, нельзя сложить a Number
и a . number
Кроме того, существуют undefined
типы null
для соответствующих значений.
Все остальные типы аннотируются с использованием имени класса, а не примитивов, таких как Error
. Некоторые типы принимают общие параметры , такие как Promise
— обещание строки будет помечено как Promise<string>
. Массивы можно записать двумя разными способами, которые синтаксически одинаковы: общий синтаксис Array<T>
и сокращение с помощью T[]
. Универсальные типы могут быть дополнительно объединены в цепочки, поэтому одну Promise
из Array
строк можно записать как Promise<Array<string>>
(или Promise<string[]>
использовать сокращенный стиль массива).
Дополнительные встроенные типы данных : Tuple
, Union
и never
. any
Массив с предопределенными типами данных для каждого индекса — это файл Tuple
. Переменная, которая может содержать более одного типа данных, является типом Union
. Тип never
используется, когда создание данного типа невозможно. Структуры со слабой или динамической типизацией могут использовать этот any
тип, чтобы избежать ошибок, хотя обычно это не рекомендуется. [34]
Аннотации типов можно экспортировать в отдельный файл объявлений , чтобы сделать информацию о типе доступной для сценариев TypeScript, использующих типы, уже скомпилированные в JavaScript. Аннотации можно объявить для существующей библиотеки JavaScript, как это было сделано для Node.js и jQuery .
Компилятор TypeScript использует вывод типа для вывода типов, когда типы не заданы. Например, add
метод в приведенном выше коде будет рассматриваться как возвращающий, number
даже если не была предоставлена аннотация типа возвращаемого значения. Это основано на статических типах left
и right
be numbers
, а также на знаниях компилятора о том, что результатом добавления двух numbers
всегда является number
. Однако явное объявление возвращаемого типа позволяет компилятору проверить правильность.
Если ни один тип не может быть выведен из-за отсутствия объявлений, по умолчанию используется динамический any
тип. Значение типа any
поддерживает те же операции, что и значение в JavaScript, и для операций над значениями выполняется минимальная проверка статического типа any
. [35]
При компиляции сценария TypeScript есть возможность создать файл объявления (с расширением .d.ts
), который функционирует как интерфейс для компонентов скомпилированного JavaScript. При этом компилятор удаляет все тела функций и методов и сохраняет только сигнатуры экспортируемых типов. Полученный файл объявления затем можно использовать для описания экспортированных виртуальных типов TypeScript библиотеки или модуля JavaScript, когда сторонний разработчик использует его из TypeScript.
Концепция файлов объявлений аналогична концепции файлов заголовков в C/C++ .
объявить арифметику пространства имен { add ( слева : число , справа : число ) : число ; вычесть ( слева : число , справа : число ) : число ; умножить ( слева : число , справа : число ) : число ; разделить ( слева : число , справа : число ) : число ; }
Файлы объявлений типов можно написать вручную для существующих библиотек JavaScript, как это было сделано для jQuery и Node.js.
Большие коллекции файлов объявлений для популярных библиотек JavaScript размещены на GitHub в DefinitelyTyped.
TypeScript поддерживает классы ECMAScript 2015, которые интегрируют поддержку дополнительных аннотаций типов.
класс Person { частное имя : строка ; личный возраст : номер ; частная зарплата : число ; конструктор ( имя : строка , возраст : число , зарплата : число ) { this . имя = имя ; этот . возраст = возраст ; этот . зарплата = зарплата ; } toString () : строка { return ` $ { this . имя } ( ${ this . age } ) ( ${ this . зарплата } )` ; // Начиная с версии 1.4 } }
TypeScript поддерживает универсальное программирование . [36] Ниже приведен пример тождественной функции . [37]
идентификатор функции < Т > ( Икс : Т ) : Т { возврат х ; }
Типы объединения поддерживаются в TypeScript. [38] Значения неявно «помечены» типом языка и могут быть получены с помощью «typeof()».
преемник функции ( n : число | bigint ) : число | bigint { return ++ n }
TypeScript добавляет в JavaScript тип данных enum.
enum Cardsuit { Трефы , Бубны , Червы , Пики }; var c : Cardsuit = Cardsuit . Бриллианты ;
По умолчанию члены перечисления нумеруются, начиная с 0; это можно переопределить, установив значение первого:
enum Cardsuit { Трефы = 1 , Бубны , Червы , Пики }; var c : Cardsuit = Cardsuit . Бриллианты ;
Все значения могут быть установлены:
enum Cardsuit { Трефы = 1 , Бубны = 2 , Червы = 4 , Пики = 8 }; var c : Cardsuit = Cardsuit . Бриллианты ;
TypeScript поддерживает сопоставление числового значения с его именем. Например, это находит имя значения 2:
enum Cardsuit { Трефы = 1 , Бубны , Червы , Пики }; varsuitName : string = Cardsuit [ 2 ] ; оповещение ( имя костюма );
TypeScript различает модули и пространства имен. Обе функции TypeScript поддерживают инкапсуляцию классов, интерфейсов, функций и переменных в контейнеры. Пространства имен (ранее внутренние модули) используют немедленно вызываемые функциональные выражения JavaScript для инкапсуляции кода, тогда как модули (ранее внешние модули) используют для этого шаблоны библиотеки JavaScript ( AMD или CommonJS ). [39]
Компилятор TypeScript с именем tsc
написан на TypeScript . В результате его можно скомпилировать в обычный JavaScript и затем выполнить в любом движке JavaScript (например, в браузере). Пакет компилятора поставляется в комплекте с хостом сценариев, который может выполнять компилятор. Он также доступен в виде пакета Node.js , который использует Node.js в качестве хоста.
Текущая версия компилятора по умолчанию поддерживает ECMAScript 5. Разрешена опция для ECMAScript 2015, позволяющая использовать функции языка, эксклюзивные для этой версии (например, генераторы). Классы, несмотря на то, что они являются частью стандарта ECMAScript 2015, доступны в обоих режимах.
Используя плагины , TypeScript можно интегрировать со средствами автоматизации сборки , включая Grunt (grunt-ts [45] ), Apache Maven (TypeScript Maven Plugin [46] ), Gulp (gulp-typescript [47] ) и Gradle (TypeScript Gradle). Плагин [48] ).
TSLint [49] сканирует код TypeScript на предмет соответствия набору стандартов и рекомендаций. ESLint , стандартный линтер JavaScript, также обеспечивает некоторую поддержку TypeScript через плагины сообщества. Однако неспособность ESLint использовать языковые службы TypeScript препятствовала определенным формам семантического анализа и общепрограммного анализа. [50] В начале 2019 года команда TSLint объявила об отказе от использования линтера в пользу typescript-eslint
, совместного усилия команд TSLint, ESLint и TypeScript по объединению линтера под эгидой ESLint для повышения производительности, единства сообщества и доступности для разработчиков. [51]
CodeDOM [52] предоставляет типы, которые представляют общие типы элементов исходного кода, которые будут преобразованы в типы данных, классы, операторы и т. д. языка программирования через CodeDOMProvider. [53] Программисты используют CodeDOM и поставщик CodeDOM для создания генератора кода, который генерирует коды для домена приложения. Поставщик TypeScript CodeDOM [54] генерирует коды TypeScript в соответствии с CodeDOM.
TypeScript находился под прямым влиянием F#: одним из создателей TypeScript был Люк Хобан, который начал работу над TypeScript (тогда он назывался Strada) сразу после работы над F# 2.0.
Недавно он отметил влияние F# на ранние части дизайна TypeScript [Hoban 2017].
Но TypeScript приносит разработчикам Unix лишь половину пользы от использования строго типизированного языка: строгую типизацию.
Intellisense, автодополнение кода и рефакторинг — это инструменты, доступные только пользователям Visual Studio Professional в Windows.
Нет поддержки Eclipse, MonoDevelop или Emacs для каких-либо функций языка.
И я считаю, что это довольно большая ошибка.
Если вы создаете веб-приложения, которые работают не на Windows, вы, скорее всего, используете Mac и, скорее всего, не используете Visual Studio.
Чтобы получить IntelliSense, вам понадобится подключаемый модуль Visual Studio.
Все, что вы получаете без Visual Studio, — это строгая типизация.
Вы не получаете тех преимуществ производительности, которые дает IntelliSense.
.