TypeScript - TypeScript

Машинопись
Машинопись логотип 2020.svg
Парадигма Мультипарадигма : функциональная , общая , императивная , объектно-ориентированная
Разработано Microsoft
Разработчик Microsoft
Впервые появился 1 октября 2012 г . ; 8 лет назад ( 2012-10-01 )
Стабильный выпуск
4.2.4  Отредактируйте это в Викиданных / 9 апреля 2021 г . ; 4 месяца назад ( 9 апреля 2021 г. )
Предварительный выпуск
4.3 Beta  Отредактируйте это в Викиданных / 9 апреля 2021 г . ; 4 месяца назад ( 9 апреля 2021 г. )
Печатная дисциплина Утка , постепенная , структурная
Лицензия Лицензия Apache 2.0
Расширения имени файла .ts, .tsx
Веб-сайт www .typescriptlang .org
Под влиянием
C # , Java , JavaScript
Под влиянием
AtScript , AssemblyScript

TypeScript - это язык программирования, разработанный и поддерживаемый Microsoft . Это строгая синтаксическая надстройка из JavaScript и добавляет дополнительный статический набор текста на язык. TypeScript предназначен для разработки больших приложений и транскомпилируется в JavaScript. Поскольку TypeScript является надмножеством JavaScript, существующие программы JavaScript также являются допустимыми программами TypeScript.

Машинопись может быть использована для разработки приложений JavaScript как для клиентской стороны и на стороне сервера исполнения (как с Node.js или Дино ). Есть несколько вариантов транскомпиляции. Можно использовать либо средство проверки TypeScript по умолчанию, либо компилятор Babel для преобразования TypeScript в JavaScript.

TypeScript поддерживает файлы определений, которые могут содержать информацию о типах существующих библиотек JavaScript, так же как файлы заголовков C ++ могут описывать структуру существующих объектных файлов . Это позволяет другим программам использовать значения, определенные в файлах, как если бы они были статически типизированными объектами TypeScript. Есть файлы заголовков сторонних для популярных библиотек , таких как JQuery , MongoDB и D3.js . Заголовки TypeScript для базовых модулей Node.js также доступны, что позволяет разрабатывать программы Node.js в рамках TypeScript.

Компилятор TypeScript сам написан на TypeScript и скомпилирован в JavaScript. Он находится под лицензией Apache License 2.0 . TypeScript включен как первоклассный язык программирования в Microsoft Visual Studio 2013 с обновлением 2 и более поздних версий, наряду с C # и другими языками Microsoft. Официальное расширение позволяет Visual Studio 2012 также поддерживать TypeScript. Андерс Хейлсберг , ведущий архитектор C # и создатель Delphi и Turbo Pascal , работал над разработкой TypeScript.

История

TypeScript был впервые обнародован в октябре 2012 года (в версии 0.8), после двух лет внутренней разработки в Microsoft. Вскоре после объявления Мигель де Икаса похвалил сам язык, но раскритиковал отсутствие полноценной поддержки IDE, кроме Microsoft Visual Studio , которая в то время не была доступна в Linux и OS X. По состоянию на апрель 2021 года есть поддержка в других IDE и текстовых редакторах, включая Emacs , Vim , Webstorm , Atom и собственный код Visual Studio от Microsoft .

В TypeScript 0.9, выпущенном в 2013 году, добавлена ​​поддержка дженериков. TypeScript 1.0 был выпущен на конференции разработчиков Microsoft Build в 2014 году. Visual Studio 2013 Update 2 обеспечивает встроенную поддержку TypeScript.

В июле 2014 года команда разработчиков анонсировала новый компилятор TypeScript, заявив о приросте производительности в 5 раз. Одновременно исходный код, который изначально размещался на CodePlex , был перемещен на GitHub .

22 сентября 2016 года был выпущен TypeScript 2.0; он представил несколько функций, в том числе возможность для программистов опционально предотвращать присвоение nullзначений переменным , что иногда называют ошибкой на миллиард долларов .

TypeScript 3.0 был выпущен 30 июля 2018 года, в него было внесено множество языковых дополнений, таких как кортежи в параметрах отдыха и выражениях распространения, параметры отдыха с типами кортежей, общие параметры отдыха и т. Д.

TypeScript 4.0 был выпущен 20 августа 2020 года. Хотя 4.0 не внес никаких критических изменений, он добавил языковые функции, такие как Custom JSX Factories и Variadic Tuple Types.

Дизайн

TypeScript возник из-за недостатков JavaScript для разработки крупномасштабных приложений как в Microsoft, так и среди внешних клиентов. Проблемы, связанные со сложным кодом JavaScript, привели к спросу на специальные инструменты, упрощающие разработку компонентов на этом языке.

Разработчики TypeScript искали решение, которое не нарушало бы совместимость со стандартом и его кроссплатформенную поддержку. Зная, что текущее предложение стандарта ECMAScript обещает в будущем поддержку программирования на основе классов , TypeScript был основан на этом предложении. Это привело к созданию компилятора JavaScript с набором расширений синтаксического языка, надмножеством, основанным на предложении, которое преобразует расширения в обычный JavaScript. В этом смысле TypeScript был предварительным просмотром того, чего ожидать от ECMAScript 2015. Уникальным аспектом, не содержащимся в предложении, но добавленным в TypeScript, является необязательная статическая типизация, которая обеспечивает статический анализ языка, что облегчает поддержку инструментов и IDE.

Поддержка ECMAScript 2015

TypeScript добавляет поддержку таких функций, как классы, модули и синтаксис стрелочных функций, как определено в стандарте ECMAScript 2015.

Функции

TypeScript - это языковое расширение, которое добавляет функции в ECMAScript 6. Дополнительные функции включают:

Следующие функции перенесены из ECMAScript 2015:

Синтаксически TypeScript очень похож на JScript .NET , другую реализацию Microsoft языкового стандарта ECMA-262, которая добавила поддержку статической типизации и классических объектно-ориентированных языковых функций, таких как классы, наследование, интерфейсы и пространства имен.

Совместимость с JavaScript

TypeScript - это строгий надмножество ECMAScript 2015, который сам по себе является надмножеством ECMAScript 5, обычно называемого JavaScript. Таким образом, программа JavaScript также является допустимой программой TypeScript, а программа TypeScript может легко использовать JavaScript. По умолчанию компилятор нацелен на ECMAScript 5, текущий преобладающий стандарт, но также может генерировать конструкции, используемые в ECMAScript 3 или 2015.

С TypeScript можно использовать существующий код JavaScript, включать популярные библиотеки JavaScript и вызывать код, сгенерированный TypeScript, из другого JavaScript. Объявления типов для этих библиотек предоставляются с исходным кодом.

Аннотации типов

TypeScript обеспечивает статическую типизацию с помощью аннотаций типов, чтобы включить проверку типа во время компиляции . Это необязательно, и его можно игнорировать, чтобы использовать обычную динамическую типизацию JavaScript.

function add(left: number, right: number): number {
	return left + right;
}

Аннотации для примитивных типов number, booleanи string. Машинопись также поддерживает типы данных со следующими примечаниями Array, Enums, void.

Вновь введенные типы данных: Tuple, Union, neverи any. TupleТипом является массив с предопределенными типами данных для каждого индекса . Переменная, которая содержит более одного типа данных, называется Unionтипом. Когда вы уверены, что что-то никогда не произойдет, вы используете neverшрифт. Слабо- или динамически типизированные структуры относятся к anyтипу.

Аннотации типов можно экспортировать в отдельный файл объявлений, чтобы сделать информацию о типах доступной для сценариев TypeScript, использующих типы, уже скомпилированные в JavaScript. Аннотации могут быть объявлены для существующей библиотеки JavaScript, как это было сделано для Node.js и jQuery .

Компилятор TypeScript использует вывод типа для вывода типов, когда типы не указаны. Например, addметод в приведенном выше коде будет считаться возвращающим, numberдаже если не была предоставлена ​​аннотация типа возвращаемого значения. Это основано на статических типах leftи rightсуществовании numbers, а также на знании компилятором того, что результатом сложения двух numbersвсегда является number. Однако явное объявление типа возвращаемого значения позволяет компилятору проверить правильность.

Если из-за отсутствия объявлений тип не может быть определен, по умолчанию используется динамический anyтип. Значение anyтипа поддерживает те же операции, что и значение в JavaScript, и для операций со anyзначениями выполняется минимальная проверка статического типа .

Файлы декларации

Когда сценарий TypeScript компилируется, есть возможность сгенерировать файл объявления (с расширением .d.ts), который функционирует как интерфейс для компонентов в скомпилированном JavaScript. В процессе компилятор удаляет все тела функций и методов и сохраняет только сигнатуры экспортируемых типов. Полученный файл объявления затем можно использовать для описания экспортированных виртуальных типов TypeScript библиотеки или модуля JavaScript, когда сторонний разработчик использует его из TypeScript.

Концепция файлов объявлений аналогична концепции файла заголовка в C / C ++ .

declare namespace arithmetics {
    add(left: number, right: number): number;
    subtract(left: number, right: number): number;
    multiply(left: number, right: number): number;
    divide(left: number, right: number): number;
}

Файлы объявления типов могут быть написаны вручную для существующих библиотек JavaScript, как это было сделано для jQuery и Node.js.

Большие коллекции файлов объявлений для популярных библиотек JavaScript размещены на GitHub в DefinentyTyped .

Классы

TypeScript поддерживает классы ECMAScript 2015, которые интегрируют дополнительную поддержку аннотаций типов.

class Person {
    private name: string;
    private age: number;
    private salary: number;

    constructor(name: string, age: number, salary: number) {
        this.name = name;
        this.age = age;
        this.salary = salary;
    }

    toString(): string {
        return `${this.name} (${this.age}) (${this.salary})`; // As of version 1.4
    }
}

Дженерики

TypeScript поддерживает универсальное программирование . Ниже приведен пример функции идентификации .

function id<T>(x: T): T {
    return x;
}

Модули и пространства имен

TypeScript различает модули и пространства имен. Обе функции TypeScript поддерживают инкапсуляцию классов, интерфейсов, функций и переменных в контейнеры. Пространства имен (ранее внутренние модули) используют немедленно вызываемое функциональное выражение JavaScript для инкапсуляции кода, тогда как модули (ранее внешние модули) используют для этого шаблоны библиотеки JavaScript ( AMD или CommonJS ).

Инструменты разработки

Компилятор

Машинописи компилятор, названный tsc, как написано в машинопись . В результате его можно скомпилировать в обычный JavaScript, а затем выполнить в любом движке JavaScript (например, в браузере). Пакет компилятора поставляется вместе с хостом сценария, который может выполнять компилятор. Он также доступен в виде пакета Node.js , который использует Node.js в качестве хоста.

Текущая версия компилятора по умолчанию поддерживает ECMAScript 5. Можно настроить таргетинг на ECMAScript 2015, чтобы использовать языковые функции, эксклюзивные для этой версии (например, генераторы). Классы, несмотря на то, что они являются частью стандарта ECMAScript 2015, доступны в обоих режимах.

Поддержка IDE и редактора

  • Microsoft предоставляет подключаемый модуль для Visual Studio 2012 и WebMatrix , полную интегрированную поддержку в Visual Studio 2013 , Visual Studio 2015 и базовую поддержку текстового редактора для Emacs и Vim .
  • Visual Studio Code - это кроссплатформенный редактор исходного кода (в основном) с открытым исходным кодом, разработанный Microsoft на основе Electron . Он поддерживает TypeScript в дополнение к нескольким другим языкам и предлагает такие функции, как отладка и интеллектуальное завершение кода .
  • alm.tools - это облачная IDE с открытым исходным кодом для TypeScript, созданная с использованием TypeScript, ReactJS и TypeStyle.
  • JetBrains поддерживает TypeScript с автозавершением кода, рефакторингом и отладкой в ​​своих IDE, построенных на платформе IntelliJ, таких как PhpStorm 6, WebStorm 6 и IntelliJ IDEA , а также в их надстройке и расширении Visual Studio ReSharper 8.1.
  • Atom имеет подключаемый модуль TypeScript от Basarat с поддержкой автозавершения кода, навигации, форматирования и быстрой компиляции.
  • Онлайн- среда Cloud9 IDE и Codenvy поддерживают TypeScript.
  • Подключаемый модуль доступен для IDE NetBeans .
  • Доступен плагин для Eclipse IDE (версия Kepler)
  • TypEcs доступен для Eclipse IDE .
  • Кросс-платформенная облачная IDE Codeanywhere поддерживает TypeScript.
  • Webclipse Плагин Eclipse, предназначенный для разработки TypeScript и Angular 2 .
  • Angular IDE Автономная IDE, доступная через npm для разработки приложений TypeScript и Angular 2, со встроенной поддержкой терминала.
  • Tide - интерактивная среда разработки TypeScript для Emacs .

Интеграция со средствами автоматизации сборки

Используя подключаемые модули , TypeScript можно интегрировать со средствами автоматизации сборки, включая Grunt (grunt-ts), Apache Maven ( подключаемый модуль TypeScript Maven), Gulp (gulp-typescript) и Gradle ( подключаемый модуль TypeScript Gradle).

Инструменты для линтинга

TSLint сканирует код TypeScript на соответствие набору стандартов и руководств. ESLint , стандартный линтер JavaScript, также предоставил некоторую поддержку TypeScript через плагины сообщества. Однако неспособность ESLint использовать языковые сервисы TypeScript препятствовала определенным формам семантического линтинга и анализа в масштабе всей программы. В начале 2019 года команда TSLint объявила об отказе от линтера в пользу typescript-eslintсовместных усилий команд TSLint, ESLint и TypeScript по консолидации линтинга под эгидой ESLint для повышения производительности, единства сообщества и доступности для разработчиков. Для использования TypeScript с ESLint вам необходимо добавить @typescript-eslint/eslint-pluginи @typescript-eslint/parser.

История выпуска

Номер версии Дата выхода Существенные изменения
0,8 1 октября 2012 г. ( 2012-10-01 )
0,9 18 июня 2013 г. ( 2013-06-18 )
1.0 12 апреля 2014 г. ( 2014-04-12 )
1.1 6 октября 2014 г. ( 2014-10-06 ) улучшения производительности
1.3 12 ноября 2014 г. ( 2014-11-12 ) protected модификатор, типы кортежей
1.4 20 января 2015 г. ( 2015-01-20 ) Типы профсоюзов , letи constдекларация, строки шаблона, типа охранники, типа псевдонимы
1.5 20 июля 2015 г. ( 2015-07-20 ) Модули ES6, namespaceключевое слово, for..ofподдержка, декораторы
1.6 16 сентября 2015 г. ( 2015-09-16 ) Поддержка JSX, типы пересечений , объявления локальных типов, абстрактные классы и методы, функции защиты типов, определяемые пользователем
1,7 30 ноября 2015 г. ( 2015-11-30 ) asyncи awaitподдержка,
1,8 22 февраля 2016 г. ( 22.02.2016 ) обобщения ограничений, ошибки анализа потока управления, типы строковых литералов, allowJs
2.0 22 сентября 2016 г. ( 2016-09-22 ) типы с нулевым и неопределенным значением, анализ типов на основе потока управления, типы размеченных объединений, neverтип, readonlyключевое слово, тип thisдля функций
2.1 8 ноября 2016 г. ( 2016-11-08 ) keyof и типы поиска, сопоставленные типы, распространение и отдых объектов,
2.2 22 февраля 2017 г. ( 2017-02-22 ) смешанные классы, objectтип,
2.3 27 апреля 2017 г. ( 2017-04-27 ) async итерация, стандартные значения параметров по умолчанию, строгая опция
2,4 27 июн 2017 ( 2017-06-27 ) выражения динамического импорта, строковые перечисления, улучшенный вывод для обобщений, строгая контравариантность для параметров обратного вызова
2,5 31 августа 2017 г. ( 2017-08-31 ) необязательные переменные предложения catch
2,6 31 октября 2017 г. ( 2017-10-31 ) строгие типы функций
2,7 31 января 2018 г. ( 2018-01-31 ) свойства с постоянными именами, кортежи фиксированной длины
2,8 27 марта 2018 г. ( 2018-03-27 ) условные типы, улучшенные keyofс помощью типов пересечений
2,9 14 мая 2018 ( 2018-05-14 ) поддержка символов и числовых литералов в типах keyof и сопоставленных объектов
3.0 30 июля 2018 г. ( 2018-07-30 ) ссылки на проекты, извлечение и распространение списков параметров с кортежами
3.1 27 сентября 2018 г. ( 2018-09-27 ) отображаемые типы кортежей и массивов
3,2 30 ноября 2018 г. ( 2018-11-30 ) более строгая проверка привязки, вызова и применения
3.3 31 января 2019 г. ( 2019-01-31 ) смягченные правила для методов типов объединения, инкрементальные сборки для составных проектов
3,4 29 марта 2019 г. ( 2019-03-29 ) более быстрые инкрементные сборки, вывод типа из общих функций, модификатор только для чтения для массивов, константные утверждения, глобальная проверка типов this
3.5 29 мая 2019 ( 2019-05-29 ) более быстрые инкрементные сборки, опускание вспомогательного типа, улучшенная проверка лишних свойств в типах объединений, более умная проверка типов объединений
3,6 28 августа 2019 г. ( 2019-08-28 ) Более строгие генераторы, более точное распределение массивов, лучшая поддержка Unicode для идентификаторов
3,7 5 ноября 2019 г. ( 2019-11-05 ) Необязательная цепочка, нулевое слияние
3.8 20 февраля 2020 г. ( 2020-02-20 ) Импорт и экспорт только типа, частные поля ECMAScript, ожидание верхнего уровня
3.9 12 мая 2020 ( 2020-05-12 ) Улучшения в выводе, улучшения скорости
4.0 20 августа 2020 г. ( 2020-08-20 ) Типы кортежей с переменным числом аргументов, помеченные элементы кортежа
4.1 19 ноября 2020 г. ( 2020-11-19 ) Типы шаблонных литералов, перераспределение клавиш в сопоставленных типах, рекурсивные условные типы
4.2 25 февраля 2021 г. ( 2021-02-25 ) Более разумное сохранение псевдонимов типов, ведущие / средние элементы в типах кортежей, более строгие проверки для inоператора, abstractсоздание подписей
4.3 26 мая 2021 г. Раздельные типы записи в свойствах, overrideа также --noImplicitOverrideулучшения флагов и типов строк в шаблоне
4.4 26 августа 2021 г. Анализ потока управления псевдонимов условий и дискриминантов, подписей индексов шаблонов строк символов и шаблонов

Смотрите также

использованная литература

Цитаты

Источники

внешние ссылки