TypeScript — это бесплатный и открытый исходный код высокоуровневого языка программирования, разработанный Microsoft , который добавляет статическую типизацию с дополнительными аннотациями типов в JavaScript . Он предназначен для разработки больших приложений и транспилируется в JavaScript. [6] .
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 и macOS . [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] Visual Studio 2013 Update 2 предоставил встроенную поддержку TypeScript. [21] Дальнейшие улучшения были сделаны в июле 2014 года, когда команда разработчиков анонсировала новый компилятор TypeScript, который, как утверждалось, имеет пятикратное увеличение производительности. Одновременно исходный код, который изначально размещался на CodePlex , был перемещен на GitHub . [22]
22 сентября 2016 года был выпущен TypeScript 2.0, в котором появилось несколько функций, включая возможность для программистов опционально применять безопасность null [ 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]
Разработчики искали решение, которое не нарушало бы совместимость со стандартом ECMAScript и его экосистемой, поэтому был разработан компилятор для преобразования надмножества JavaScript с аннотациями типов и классами (файлами TypeScript) обратно в ванильный код ECMAScript 5. Классы TypeScript были основаны на предложенной тогда спецификации классов ECMAScript 6, чтобы сделать написание прототипного наследования менее многословным и подверженным ошибкам, а аннотации типов позволили использовать IntelliSense и улучшить инструментарий.
TypeScript добавляет следующие расширения синтаксиса в JavaScript:
Синтаксически TypeScript очень похож на JScript .NET , еще одну реализацию Microsoft языкового стандарта ECMA-262, которая добавила поддержку статической типизации и классических объектно-ориентированных языковых функций, таких как классы, наследование, интерфейсы и пространства имен. Другие источники вдохновения включают Java и C# .
TypeScript обеспечивает статическую типизацию с помощью аннотаций типов, что позволяет выполнять проверку типов во время компиляции .
функция add ( слева : число , справа : число ) : число { return слева + справа ; }
Примитивные типы аннотируются с использованием типов, состоящих только из строчных букв, таких как number
, boolean
, bigint
, и string
. Эти типы отличаются от своих коробочных аналогов ( Number
, Boolean
, и т. д.), которые не могут иметь операции, выполняемые непосредственно из значений ( Number
и number
не могут быть добавлены). Существуют также типы undefined
и null
для их соответствующих значений.
Все остальные непримитивные типы аннотируются с использованием имени класса, например Error
. Массивы могут быть записаны двумя разными способами, которые синтаксически одинаковы: обобщенный синтаксис Array<T>
и сокращение с T[]
.
Дополнительные встроенные типы данных — это кортежи, объединения never
и any
:
[type1, type2, ..., typeN]
.|
символа ИЛИ ( string | number
).never
используется, когда заданный тип невозможно создать, что полезно для фильтрации сопоставленных типов.any
поддерживает те же операции, что и значение в JavaScript, и выполняется минимальная статическая проверка типа, [31] что делает его пригодным для слабо или динамически типизированных структур. Это, как правило, нежелательная практика, и ее следует избегать, когда это возможно. [32]Аннотации типов можно экспортировать в отдельный файл объявлений, чтобы сделать информацию о типах доступной для скриптов TypeScript, использующих типы, уже скомпилированные в JavaScript. Аннотации можно объявлять для существующей библиотеки JavaScript, как это было сделано для Node.js и jQuery .
Компилятор TypeScript использует вывод типов , когда типы не указаны. Например, add
метод в коде выше будет выведен как возвращающий a, number
даже если не была указана аннотация возвращаемого типа. Это основано на статических типах left
и right
s number
, а также на знании компилятора, что результатом сложения двух number
s всегда будет a number
.
Если тип не может быть выведен из-за отсутствия объявлений (например, в модуле JavaScript без типов), то по умолчанию используется динамический any
тип. Дополнительные типы модулей могут быть предоставлены с помощью файла объявлений .d.ts с использованием declare module "moduleName"
синтаксиса.
При компиляции скрипта TypeScript есть возможность сгенерировать файл объявления (с расширением .d.ts
), который функционирует как интерфейс для компонентов в скомпилированном JavaScript. В процессе компилятор удаляет все тела функций и методов и сохраняет только сигнатуры экспортируемых типов. Полученный файл объявления затем можно использовать для описания экспортируемых виртуальных типов TypeScript библиотеки или модуля JavaScript, когда сторонний разработчик использует его из TypeScript.
Концепция файлов объявлений аналогична концепции заголовочных файлов в C/C++ .
объявить пространство имен Арифметика { сложить ( слева : число , справа : число ) : число ; вычесть ( слева : число , справа : число ) : число ; умножить ( слева : число , справа : число ) : число ; разделить ( слева : число , справа : число ) : число ; }
Файлы объявления типов можно написать вручную для существующих библиотек JavaScript, как это было сделано для jQuery и Node.js.
Большие коллекции файлов объявлений для популярных библиотек JavaScript размещены на GitHub в DefinitelyTyped.
TypeScript поддерживает универсальное программирование, используя синтаксис, похожий на Java . [33] Ниже приведен пример функции идентификации . [34]
идентификатор функции < T > ( x : T ) : T { return x ; }
TypeScript использует тот же стиль аннотации для методов и полей класса, что и для функций и переменных соответственно. По сравнению с классами vanilla JavaScript, класс TypeScript также может реализовывать интерфейс через implements
ключевое слово, использовать общие параметры, как в Java , и указывать публичные и приватные поля.
класс Person { публичное имя : строка ; частный возраст : число ; частная зарплата : число ; конструктор ( имя : строка , возраст : число , зарплата : число ) { this.name = имя ; this.age = возраст ; this.salard = зарплата ; } toString ( ) : string { return ` $ { this.name } ( $ { this.age } ) ( $ { this.salrage } ) ` ; } }
Типы объединений поддерживаются в TypeScript. [35] Значения неявно «помечены» типом языком и могут быть извлечены с помощью typeof
вызова примитивных значений и instanceof
сравнения для сложных типов данных. Типы с перекрывающимся использованием (например, метод среза существует как для строк, так и для массивов, оператор плюс работает как для строк, так и для чисел) не нуждаются в дополнительном сужении для использования этих функций.
function successor ( n : number | bigint ) : number | bigint { // типы, поддерживающие те же операции, не нуждаются в сужении return ++ n ; } function dependsOnParameter ( v : string | Array < string > | number ) { // отдельные типы требуют сужения if ( v instanceof Array ) { // сделать что-то } else if ( typeof ( v ) === "string" ) { // сделать что-то еще } else { // должно быть числом } }
TypeScript добавляет тип данных «enum» в JavaScript.
enum Cardsuit { Трефы , Бубны , Червы , Пики } ; var c : Cardsuit = Cardsuit.Bubns ;
По умолчанию перечисления нумеруют элементы, начиная с 0; это можно переопределить, задав значение первого:
enum Cardsuit { Трефы = 1 , Бубны , Червы , Пики }; var c : Cardsuit = Карточная масть . Бубны ;
Все значения могут быть установлены:
enum Cardsuit { Трефы = 1 , Бубны = 2 , Червы = 4 , Пики = 8 }; var c : Cardsuit = Карточная масть . Бубны ;
TypeScript поддерживает сопоставление числового значения с его именем. Например, это находит имя значения 2:
enum Cardsuit { Трефы = 1 , Бубны , Червы , Пики }; var suitName : string = Cardsuit [ 2 ]; оповещение ( suitName );
TypeScript различает модули и пространства имен. Обе функции TypeScript поддерживают инкапсуляцию классов, интерфейсов, функций и переменных в контейнеры. Пространства имен (ранее внутренние модули) используют выражения функций JavaScript, немедленно вызываемых для инкапсуляции кода, тогда как модули (ранее внешние модули) используют существующие шаблоны библиотеки JavaScript ( CommonJS или ES Modules). [36]
Поскольку TypeScript — это просто надмножество JavaScript, существующий JavaScript можно быстро адаптировать к TypeScript, а программа TypeScript может беспрепятственно потреблять JavaScript. Компилятор может работать со всеми версиями ECMAScript версии 5 и выше, перенося современные функции, такие как классы и стрелочные функции, в их старые аналоги.
С помощью TypeScript можно использовать существующий код JavaScript, включать популярные библиотеки JavaScript и вызывать код, сгенерированный TypeScript, из другого JavaScript. [37] Объявления типов для этих библиотек обычно предоставляются вместе с исходным кодом, но при необходимости их можно объявить или установить отдельно.
Компилятор TypeScript, названный tsc
, написан на TypeScript . В результате его можно скомпилировать в обычный JavaScript и затем выполнить в любом движке JavaScript (например, браузере). Пакет компилятора поставляется в комплекте с хостом скрипта, который может выполнить компилятор. Он также доступен как пакет Node.js , который использует Node.js в качестве хоста.
Компилятор может «нацеливаться» на определенную редакцию ECMAScript (например, ES5 для совместимости с устаревшими браузерами), но по умолчанию компилирует в соответствии с новейшими стандартами.
Используя подключаемые модули , TypeScript можно интегрировать с инструментами автоматизации сборки , включая Grunt (grunt-ts [43] ), Apache Maven (плагин TypeScript Maven [44] ), Gulp (gulp-typescript [45] ) и Gradle (плагин TypeScript Gradle [46] ).
TSLint [47] сканирует код TypeScript на соответствие набору стандартов и рекомендаций. ESLint , стандартный JavaScript-линтер, также предоставил некоторую поддержку TypeScript через плагины сообщества. Однако неспособность ESLint использовать языковые сервисы TypeScript исключила определенные формы семантического линтинга и анализа в масштабах всей программы. [48] В начале 2019 года команда TSLint объявила об отказе от линтера в пользу typescript-eslint
, совместного усилия команд TSLint, ESLint и TypeScript по консолидации линтинга под эгидой ESLint для повышения производительности, единства сообщества и доступности для разработчиков. [49]
CodeDOM [50] предоставляет типы, представляющие общие типы элементов исходного кода, которые будут преобразованы в типы данных, классы и операторы и т. д. языка программирования через CodeDOMProvider. [51] Программисты используют CodeDOM и поставщика CodeDOM для создания генератора кода, который генерирует коды для домена приложения. Поставщик TypeScript CodeDOM [52] генерирует коды TypeScript в соответствии с CodeDOM.
был напрямую под влиянием 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. Вам нужен плагин Visual Studio, чтобы получить IntelliSense. Все, что вы получаете без Visual Studio, — это строгая типизация. Вы не получите преимуществ производительности, которые дает IntelliSense.
.