Отчет об исследовании системы TypeScript

JavaScript TypeScript
Отчет об исследовании системы TypeScript

Об авторе: aoto Ant Financial Data Experience Technology Team

Вопрос: Почему вы написали эту статью? Что эта статья пытается донести?

A: Мы рассматриваем возможность использования TS в качестве языка разработки в SPA-приложениях.Нам нужна статья, систематически знакомящая с самим TS и его окружением, чтобы продемонстрировать, что использование TS в качестве языка разработки в проектах является научным и разумным, и это соответствует тенденции.

гид

  • что такое ТС
  • Зачем использовать ТС
  • Что может ТС
  • Стоимость использования ТС
  • Сообщество по вопросам развития
  • окружающая экология
  • Углубленная интерпретация ТС
  • принять ТС
  • компромисс

что такое ТС

TypeScript

TypeScript = Type + Script (стандартный JS). Мы можем увидеть определение с официального сайта TS:TypeScript is a typed superset of JavaScript that compiles to plain JavaScript. TypeScript — это определяемый типом надмножество JS, скомпилированное в чистый JS.

Зачем использовать ТС

Цель: Комплексные SPA-приложения с длительным жизненным циклом (часто несколько лет), обеспечивающие эффективность разработки при одновременном улучшении сопровождения кода и качества онлайн-среды выполнения.

  • С точки зрения эффективности разработки, хотя необходимо написать больше кода определения типа, TS может реализовать интеллектуальные подсказки и ошибки intellisense в средах разработки, таких как VSCode и WebStorm. В то же время некоторые сторонние библиотеки классов, обычно используемые в наших проектах, имеют объявления типов TS. Эти стабильные модули без объявлений типа TS также могут записывать файлы объявлений, такие как наша интерфейсная структура KOP (в настоящее время все еще внутренняя структура ant, аналогичная dva), что может повысить общую эффективность разработки в проектах совместной работы.
  • С точки зрения ремонтопригодности, в разработке и обслуживании проекта долгосрочного итеративного обслуживания будет много участников, уровень членов команды будет разным, а программное обеспечениеэнтропияХарактеристики долгосрочного итеративного обслуживания всегда будут сталкиваться с проблемой постепенного снижения ремонтопригодности.С помощью строгих ограничений типов и статической проверки, а также с помощью интеллектуальной IDE можно снизить скорость повреждения программного обеспечения, улучшить ремонтопригодность, И врефакторингСтрогая типизация и статическая проверка типов очень помогут, и даже наличие определений типов непреднамеренно увеличит частоту рефакторинга (более безопасного и надежного).
  • С точки зрения качества работы онлайн, Многие ошибки в нашем текущем проекте SPA вызваны несоответствием формата данных некоторых вызывающих и вызываемых (таких как взаимодействие между компонентными модулями, интерфейсом или вызовами функций), потому что TS имеет статические проверки во время компиляции, пусть наши ошибки будут устранены как можно больше в компиляторе, а IDE имеет интеллектуальную коррекцию ошибок, так что наличие ошибок можно обнаружить заранее при кодировании, а качество нашей онлайн-среды выполнения будет более стабильной и управляемой.

Рутинный процесс разработки сложного программного обеспечения можно условно разделить на определение проблемы, анализ требований, планирование и построение, архитектуру программного обеспечения, детальное проектирование, кодирование и отладку, модульное тестирование, интеграционное тестирование, интеграцию, системное тестирование, а также обеспечение и обслуживание. Строительные работы (в основном кодирование и отладка) составляют более 50% рабочей нагрузки в средних и крупных проектах. В то же время в среднем и крупном проекте доля ошибок, вызванных этапом строительства, составляет от 50% до 75%.Для успешного проекта строительные работы необходимы и более контролируемы инженерами. 【Энциклопедия кода】

TS подходит для крупномасштабных приложений JavaScript, так как его официальный слоганJavaScript that scales. Из следующих пунктов мы видим, что TS имеет очевидные преимущества с точки зрения командной работы, удобства сопровождения, удобочитаемости, стабильности (ошибки выявляются заранее во время компиляции) и т. д.:

  • С добавлением системы типов он удобен как для читателя, так и для компилятора. Для читателя определение типа плюс интеллектуальные подсказки IDE повышают удобочитаемость кода, а для компилятора определение типа позволяет компилятору находить скрытые ошибки.
  • Введите system + проверка статического анализа + intellisense/hint, чтобы качество кода крупномасштабного приложения было выше, ошибок во время выполнения было меньше, а обслуживание было более удобным.
  • С поддержкой IDE, такой как VSCode, удобно просматривать вывод типа и связь ссылок, что может быть более удобным и безопасным для рефакторинга, больше не нужно искать глобально и изменять одно за другим.
  • Определите типы для конфигурации приложения, состояния приложения, внешнего и внутреннего интерфейсов и различных модулей.Все приложение определяется по одному, что делает совместную работу более удобной, эффективной и безопасной.

Что может ТС

статическая проверка

Такие проблемы не обнаруживаются такими инструментами, как ESLint.

ошибка низкого уровня

const peoples = [{
  name: 'tim',
  age: 20
}, {
  name: 'alex',
  age: 22
}];
const sortedPeoples = peoples.sort((a, b) => a.name.localCompare(b.name));

Выполните команду компиляции TStsc, была обнаружена ошибка:

error TS2339: Property 'localCompare' does not exist on type 'string'.

Если вы используете IDE, поддерживающую TS (VS Code, WebStorm и т. д.), вам не нужно ждать компиляции, и вы, очевидно, можете вывести сообщение об ошибке в расположении localCompare в IDE.

Ошибки при вводе localCompare (или случайное удаление или добавление символов) случаются время от времени.Если нет статической проверки компилятором, это может быть кровавый случай, вызванный символом: закопанный隐藏的Ошибка времени выполнения. Если в приложении SPA эта проблема требует обнаружения длинного рабочего пути, то как только пользователь активирует мину, она взорвется: приложение немедленно выйдет из строя (особенно в SPA без обновления страницы).

непустое суждение

let data = {
  list: null,
  success: true
};
const value = data.list.length;

воплощать в жизньtscСкомпилировать:

error TS2532: Object is possibly 'null'.

data.list.lengthЭта строка напрямую ссылается на свойства data.list, но формат данных data.list может не быть массивом.Этот сценарий часто возникает, когда клиент обрабатывает возврат интерфейса бэкенда, а уровень данных возвращает интерфейс может быть очень глубоким.Отсутствие непустой логики суждения на определенном уровне означает, что заложена бомба, которая взорвется в неизвестное время.

вывод типа

const arr = [];
arr.toUpperCase();

class Cat {
  miao() {}
}

class Dog {
  wang() {}
}
const cat = new Cat();
cat.wang();

воплощать в жизньtscСкомпилировать:

error TS2339: Property 'toUpperCase' does not exist on type 'any[]'.
error TS2339: Property 'wang' does not exist on type 'Cat'.

TS имеет вывод типа, и вызов неправильного метода для разных типов объектов выполнения будет проверен.

Усовершенствования объектно-ориентированного программирования

контроль доступа

class Person {
  protected name: string;
  public age: number;
  constructor(name: string) { this.name = name; }
}

class Employee extends Person {
  static someAttr = 1;
  private department: string;

  constructor(name: string, department: string) {
    super(name);
    this.department = department;
  }
}
let howard = new Employee("Howard", "Sales");
console.log(howard.name);

воплощать в жизньtscСкомпилировать:

error TS2445: Property 'name' is protected and only accessible within class 'Person' and its subclasses.

Атрибут имени в Person является защищенным типом и может использоваться только в своем собственном классе или подклассах. Контроль доступа очень полезен в объектно-ориентированном программировании. Он может помочь нам скрыть информацию. Большая проблема объектно-ориентированного программирования JS заключается в том, что оно не обеспечивает встроенной поддержки сокрытия информации (во многих случаях это делается с помощью кодирования по соглашению). Сокрытие информации помогает лучше управлять сложностью системы, что особенно важно в разработке программного обеспечения.

интерфейс

interface Machine {
  move(): void
}

interface Human {
  run(): void
}

class Base {
}

class Robot extends Base implements Machine, Human {
  run() {
    console.log('run');
  }
  move() {
    console.log('move');
  }
}

Класс Robot может наследовать класс Base и реализовывать интерфейсы Machine и Human.Такой способ объединения унаследованных классов и реализации интерфейсов делает объектно-ориентированное программирование более гибким и расширяемым.

Дженерики

class GenericNumber<T> {
    zeroValue: T;
    add: (x: T, y: T) => T;
}

let myGenericNumber = new GenericNumber<number>();
myGenericNumber.zeroValue = 0;
myGenericNumber.add = function(x, y) { return x + y; };

Тип шаблона T определен, и встроенный тип или пользовательский тип может быть передан при создании экземпляра класса GenericNumber. Обобщения (шаблоны) — очень распространенная концепция в традиционных объектно-ориентированных языках программирования.Они полезны в сценариях, где логика кода схематизирована в общих чертах, а параметры могут быть динамически типизированы.

система типов

interface SystemConfig {
  attr1: number;
  attr2: string;
  func1(): string;
}

interface ModuleType {
  data: {
    attr1?: string,
    attr2?: number
  },
  visible: boolean
}

const config: SystemConfig = {
  attr1: 1,
  attr2: 'str',
  func1: () => ''
};

const mod: ModuleType = {
  data: {
    attr1: '1'
  },
  visible: true
};

Определяем тип конфигурации системыSystemConfigи тип модуляModuleType, мы не можем случайно изменить его при использовании этих типовconfigа такжеmodданные.Каждый вызываемый объект отвечает за отображение своего внешнего типа, вызывающему объекту нужно заботиться только о типе вызываемого объекта, а не о внутренних деталях., что является преимуществом ограничений типов, которые очень полезны для совместных командных проектов с несколькими людьми.

Усовершенствования модульной системы

namespace N {
  export namespace NN {
    export function a() {
      console.log('N.a');
    }
  }
}

N.NN.a();

TS поддерживает пространства имен в дополнение к модульной системе ES6. Это полезно при управлении внутренними компонентами сложных модулей.

Стоимость использования ТС

стоимость обучения

Теоретически изучение и применение нового языка требует больших затрат, но, к счастью, сам TS является надмножеством JS, а это также означает, что он сам может поддерживать существующий код JS, по крайней мере, теоретически. Изучите соответствующие знания системы типов и базовые знания объектно-ориентированного, вы должны быть в состоянии провести TS, и стоимость не будет очень высокой.официальная документацияявляется лучшим учебным материалом.

Стоимость заявки

Старые проекты

Для старых проектов, поскольку TS совместим со спецификациями ES, удобнее обновлять существующий код JS (здесь имеется в виду ES6 и выше), постепенно добавлять аннотации типов и постепенно повышать надежность кода. Процесс миграции:

  1. npm глобально установите пакет машинописного текста и запустите его в корневом каталоге проекта.tsc --init, автоматически генерируетсяtsconfig.jsonдокумент. По умолчанию 3 элемента конфигурации:Подробнее описание элемента конфигурации

    • "target":"es5": ES версия скомпилированного кода, а так же варианты типа es3, es2105.
    • "module":"commonjs": модульная организация скомпилированного кода и такие опции, как amd, umd, es2015 и т. д.
    • "strict":true: Строгая верификация, включая такие опции, как отсутствие бессмысленности, нулевая верификация и т.д.
  2. инициализированtsconfig.jsonНе нужно изменять, добавлять"allowJs": trueопции.

  3. Настройте конфигурацию веб-пакета и добавьте загрузчик ts, например awesome-typescript-loader. (Если это проект, построенный на основе atool-build, он имеет встроенную компиляцию ts, этот шаг пропускается)

    loaders: [
    	// All files with a '.ts' or '.tsx' extension will be handled by 'awesome-typescript-loader'.
    	{ test: /\.tsx?$/, loader: "awesome-typescript-loader" }
    ]
    
  4. На этом этапе вы можете писать код с суффиксами имен файлов ts и tsx (React), который может сосуществовать с существующим кодом ES6, VSCode автоматически проверит эту часть кода, и упаковка веб-пакета не составит труда.

  5. Постепенно я начал планировать рефакторинг предыдущего кода ES6 в код TS.Просто измените суффикс файла на ts(x), и тогда вы сможете пользоваться преимуществами TS и IDE intellisense/исправления ошибок.

Дополнительные руководства по миграции:Официальное руководство по миграции,Официальное руководство по миграции проекта React,Учебник сообщества 1,Учебник сообщества 2.

новый проект

  • Для новых проектов у Microsoft есть довольно крутые штукиСтартовый проект, в котором подробно описано, как использовать TS с другими фреймворками и библиотеками. Если это проект React, вы можете обратиться к этому Starter:TypeScript-React-Starter

сравнение стоимости

Звезды доминируют

точка затрат ES TS иллюстрировать
Стоимость обучения и степпинга ※※※※※ ※※※ Несмотря на то, что это надмножество JS, все же необходимо изучить базовые знания самого TS и объектно-ориентированного.Проблемы и ямки в построении и использовании среды разработки также необходимо решать самостоятельно.К счастью, сообщество TS является относительно зрелым, и в Интернете хранится много информации.
общий размер кода ※※※※※ ※※※※ Если код TS добавляет более полное определение типа, общий объем кода примерно на 5–10 % больше, чем у собственного ES.
Нативный JS (стандартный ES, на стороне браузера, на стороне сервера) ※※※ ※※※※※ Среда IDE имеет встроенные подробные объявления типов, которые могут интеллектуально подсказывать описания методов и параметров, повышая эффективность.
Зависит от внешних библиотек (React, Lodash, Antd) ※※※ ※※※※※ Имеются библиотеки объявлений типов TS, интеллектуальные подсказки и анализ IDE, повышена эффективность.
Внутренние публичные библиотеки, модули ※※※ ※※※※ Файл определения типа пишется самой командой, что требует определенного объема работы, но эффективность разработки может быть до некоторой степени повышена.После постепенного улучшения определения типа эффективность будет повышаться еще больше.
Эффективность командной работы ※※ ※※※※※ После того, как конфигурация системы, внешний интерфейс и внутренние модули типизированы, атрибуты экземпляра объекта не могут быть изменены произвольно, каждый вызываемый объект отвечает за свое собственное отображение внешнего типа (которое можно понимать как форму), а вызывающему нужно заботиться только о Тип вызываемого абонента, не заботьтесь о внутренних деталях
ремонтопригодность кода ※※ ※※※※ Из-за различий в уровне членов команды и программного обеспеченияэнтропияХарактеристики долгосрочного итеративного обслуживания всегда будут сталкиваться с проблемами ремонтопригодности.С помощью жестких ограничений типов и статических проверок, а также с помощью интеллектуальной IDE можно снизить скорость повреждения программного обеспечения, улучшить ремонтопригодность и врефакторингстрогая типизация и статическая проверка типов могут очень помочь, и даже наличие определений типов может непреднамеренно увеличить частоту рефакторинга.
стабильность во время выполнения ※※ ※※※※ Поскольку TS имеет статическую проверку типов, многие ошибки будут устранены до запуска.

резюме

Как видно из приведенного выше сравнения, использование ES в качестве языка разработки, с которым все знакомы, выгодно только с точки зрения затрат на обучение и степпинг и общего размера кода.Если это только краткосрочный проект, понятно использовать ES, но жизненный цикл нашего проекта продолжается. Он многократно обновлялся в течение нескольких лет. В настоящее время сообщество TS относительно зрело, и есть много учебных материалов. Кроме того, TS обеспечивает повышение эффективности внутренней совместной разработки, ремонтопригодности и стабильности. , так что в долгосрочной перспективе эта цена того стоит. Кроме того, наличие различных файлов определений объявлений типов может повысить эффективность разработки, а статическая проверка типов может уменьшить количество ошибок и сложность устранения ошибок, повысить скрытую эффективность и сделать весь проект относительно более стабильным и управляемым.

Сообщество по вопросам развития

из StackoverflowОтчет об опросе разработчиков за 2017 г.,Google Тренды,тенденции загрузки npmКак видите, сообщество TypeScript быстро росло, особенно в последние годы. Особенно с рождением VS Code (написанного TS, который очень дружелюбен к поддержке TS), комбинация VS Code + TypeScript создала четкий поток во внешнем круге, а производительность и стандартизация были быстро улучшены. Из поддержки Google для TS (версии выше Angular 2 написаны TS), международные производители также поддерживают его.

Изнутри Ант Групп, Ант Дизайн, Подвал и другие продукты тоже написаны на основе ТС (по крайней мере, они широко используются).Хотя есть некоторые возражения, но в целом настроены оптимистично.Если будет подходящая почва, то они будут быстро развиваться Например, Муравей Дизайн.

окружающая экология

пакет объявления типа

React и различные другие известные фреймворки и библиотеки имеют объявления типа TS, которые мы можем передать в проекте.npm install @types/reactустановлен вэтот сайтНайдите пакет объявления библиотеки, который вы хотите установить. После установки написание кода, связанного с этими фреймворками и библиотеками, станет очень интересным занятием.Определения функций и комментарии будут предлагаться автоматически, а эффективность разработки повысится.

IDE

VS Code, WebStorm и другие популярные IDE во внешнем окружении имеют очень дружественную поддержку TS, а сам VS Code даже написан TS.

Углубленная интерпретация ТС

Цели разработки языка TS

Цель

Статическая проверка может выполняться во время компиляции, предоставляя структурированное устройство для крупномасштабного кода, компилируя код JS, который соответствует идиоматичному и удобочитаемому, и выравнивая стандарт ECMAScript, используя согласованную, удаляемую и структурированную систему типов для защиты скомпилированной среды выполнения. поведение JS-кода и т. д.

нецелевых

Имитирует существующие языки, оптимизирует производительность скомпилированного кода, применяет «правильную» систему типов, добавляет информацию о типах во время выполнения и многое другое.

Исходный текст цели дизайна TS

Краткая история ТС

В последние годы, с развитием платформы V8 и основных современных браузеров, операционная платформа JS постоянно совершенствовалась.Однако на JS очень сложно разрабатывать крупномасштабные приложения.Цель разработки языка JS не для крупномасштабных приложений. Масштабные приложения.Это язык сценариев, у него нет статической проверки типов, но, что более важно, он не предоставляет структурированных устройств, таких как классы, модули/пространства имен, интерфейсы и т. д., необходимые для крупномасштабных приложений, а также GWT и т. д. также были разработаны для других языков.Эти проекты позволяют использовать объектно-ориентированные языки, такие как Java, для разработки крупномасштабных веб-приложений, и вы также можете использовать простые в использовании IDE, такие как Eclipse, но эти проекты не не использовать JS для написания кода, поэтому, если вы хотите использовать JS Некоторые вещи в нем, вам, возможно, придется реализовать его на других языках, поэтому мы рассмотрим, какусиливатьЯзык JS предоставляет крупномасштабные устройства приложений, такие как проверка статического типа, классы, модули/пространства имен, интерфейсы и т. д. Это язык TS: **TS — это язык для разработки крупномасштабных приложений JS. имеет тип надмножества JS, скомпилированного в чистый JS. ** В общем, код JS также является кодом TS. Сам компилятор TS также написан TS и работает в среде Node.js. 【Anders Hejlsberg: Introducing TypeScript 2012

Фотография, предоставленная автором TS на недавней конференции Microsoft Build:

JS feature间隔

Как показано на рисунке, JS на веб-платформах и платформах Node всегда находится на расстоянии от последних спецификаций JS, а веб-платформа еще дальше.TS может заполнить этот пробел, позволяя пользователям использовать новейшие функции как в Интернете, так и Платформы Node и их элегантное использование JS повышают производительность. 【Anders Hejlsberg: What's new in TypeScript? 2017

Сравнение с Flow и Babel

vs Flow

отэта статьяВидно, что разработка базовой функции проверки типов не сильно изменилась, но TS лучше Flow с точки зрения окружающей экологии, целостности документов и ресурсов сообщества.

vs Babel

Babel также является очень хорошим инструментом компиляции ES6 в 5. Он имеет хороший механизм подключаемых модулей, и разработка сообщества также хороша.Однако в коде JS, скомпилированном из того же фрагмента кода, вы можете видеть, что код, скомпилированный TS является более привычным, лаконичным и легко читаемым, некоторые (все используют инструмент Playground с официального сайта). Я сохранил код JS, скомпилированный TS (исходный код TS отсутствует), и все в порядке.

После компиляции Babel:

Babel编译

После составления ТС:

TS编译

Базовые знания и основные концепции TS

базовый тип

let isDone: boolean = false;

let decimal: number = 6;

let color: string = "blue";

// 数组,有两种写法
let list: number[] = [1, 2, 3];
let list: Array<number> = [1, 2, 3];

// 元组(Tuple)
let x: [string, number] = ["hello", 10];

// 枚举
enum Color {Red = 1, Green = 2, Blue = 4}
let c: Color = Color.Green;

// 不确定的可以先声明为any
let notSure: any = 4;

// 声明没有返回值
function warnUser(): void {
    alert("This is my warning message");
}

let u: undefined = undefined;

let n: null = null;

// 类型永远没返回
function error(message: string): never {
    throw new Error(message);
}

// 类型主张,就是知道的比编译器多,主动告诉编译器更多信息,有两种写法
let someValue: any = "this is a string";
let strLength: number = (<string>someValue).length;
let strLength: number = (someValue as string).length;

Для более подробного ознакомления вы можете напрямую увидетьофициальная документация.

interface

Один из основных принципов TS заключается в том, что проверка типов связана с формой значения, что иногда называют «утиной типизацией» или «структурным подтипом». Интерфейс в TS берет на себя такую ​​роль, определяя формы и ограничения и используя их внутри или сотрудничая с внешними системами. один пример:

interface SystemConfig {
  	attr1: string;
  	attr2: number;
    func1(): string;
    func2(): void;
}

Мы устанавливаем программное обеспечение для настройки параметров интерфейса системы, он определяет форму конфигурации системы, есть два свойстваattr1а такжеattr2, два методаfunc1а такжеfunc2, так что если вы определитеconst systemConfig: SystemConfig = {}, что systemConfig нельзя модифицировать по своему желанию, у него есть форма.

В Java мы выступаем за интерфейсно-ориентированное программирование. Интерфейсы лучше, чем абстрактные классы [Effective Java]. В системе классов TS интерфейсы также могут играть такую ​​роль. Мы можем использоватьimplementsДля реализации интерфейса можно добиться аналогичного более гибкого наследования, например:

class A extends BaseClass implements BaseInterface1, BaseInterface2 {}

Класс A наследует BaseClass и два интерфейса, BaseInterface1 и BaseInterface2.

module/namespace

Модули, экспортируемые наружу, пишутся так же, как ES6, а для внутренних модулей теперь рекомендуются пространства имен, такие как:

namespace Module1 {
  export interface SubModule1 {}
  
  export interface SubModule2 {}
}
const module: Module1.SubModule = {}

Пространства имен также могут быть реализованы в JS с использованием литералов объектов.Многие библиотеки JS в первые годы использовали этот шаблон, но очевидно, что с этим явным объявлением пространства имен код становится более читабельным и не может быть произвольным Изменения не так легко переопределяются, как при использовании собственных объектов JS .

контроль доступа

TS имеет общедоступные, защищенные, частные и другие права доступа, аналогичные традиционным объектно-ориентированным языкам, что очень удобно для крупномасштабных приложений и не будет здесь подробно останавливаться.

разное

За исключением того, что дженерики относительно сложны в освоении, другие классы, декораторы, async/await и т. д. написаны аналогично ES6 и ES7.

Тип и система типов

TypeScript = Type + Script, так как же Type определяется в языках программирования?

In computer science and computer programming, a data type or simply typeэто классификация данных, которая сообщает компилятору или интерпретатору, как программист намерен использовать данные.【Википедия

В информатике типы данных или просто типы — это категории данных, которые сообщают компилятору/интерпретатору, как программист хочет использовать данные. Основные типы данных, такие как целые числа, логические значения, символы и т. д., составные типы данных, такие как массивы, объекты и т. д., и абстрактные типы данных, такие как очереди, стеки, наборы, словари и т. д. Типы данных используются в системе типов, которая обеспечивает способ определения, реализации и использования типов, и каждый язык программирования имеет свою собственную реализацию системы типов (если таковая имеется).

Давайте посмотрим на определение системы типов:

In programming languages, a type system is a set of rules that assigns a property called type to the various constructs of a computer program, such as variables, expressions, functions or modules.[1] These types formalize and enforce the (otherwise implicit) categories the programmer uses for data structures and components (ex: "string", "array of float", "function returning boolean"). The main purpose of a type system is to reduce possibilities for bugs in computer programs[2]определяя интерфейсы между различными частями компьютерной программы, а затем проверяя, что части были соединены согласованным образом.Википедия

В языках программирования система типов представляет собой набор правил, которые назначают атрибуты, называемые типами, элементам построения программы, таким как переменные, выражения, функции, модули и т. д. в программе. Эти типы являются явными и определяют (и, возможно, неявно) то, как программист использует структуру данных. **Основная цель системы типов — уменьшить вероятность ошибок в программе, определяя интерфейс, через который взаимодействуют различные части программы, и проверяя, чтобы различные части взаимодействовали согласованным образом. ** Эта проверка может быть статической (время компиляции), динамической (время выполнения) или и той, и другой.

Преимущества системы типов

обнаружение ошибок

Наиболее очевидным преимуществом статической проверки типов является то, что она позволяет обнаруживать некоторые ошибки программирования на ранней стадии.Ошибки, обнаруженные на ранней стадии, могут быть исправлены немедленно, вместо того, чтобы скрываться в коде и обнаруживаться гораздо позже, когда программист занят чем-то другим. — или даже после того, как программа была развернута.Более того, ошибки часто могут быть более точно определены во время проверки типов, чем во время выполнения, когда их последствия могут быть видны только через некоторое время после того, как что-то пойдет не так.【Types and Programming Languages

По мере роста вашего приложения вы можете обнаружить множество ошибок при проверке типов. 【React typechecking

Наиболее очевидным преимуществом статической проверки типов является то, что она позволяет обнаруживать ошибки в программе как можно раньше. Ошибки, обнаруженные на ранней стадии, позволяют быстро их исправить, а не прятаться в коде и обнаруживаться в середине или даже после запуска развертывания. Кроме того, ошибки могут быть более точно обнаружены во время компиляции, в то время как во время выполнения последствия ошибок могут быть трудно обнаружены до тех пор, пока в программе не возникнет проблема.

Программы будут иметь различные структуры данных.Если тип данных изменен, интерфейс часто решает эту проблему рефакторинга через глобальный поиск. А статическая проверка типов может обнаружить все возможные ошибки после перекомпиляции, плюс интеллектуальные подсказки об ошибках IDE делают рефакторинг более надежным и удобным.

Аннотация

Другим важным способом, которым системы типов поддерживают процесс программирования, является обеспечение дисциплинированного программирования, В частности, в контексте крупномасштабной композиции программного обеспечения системы типов составляют основу модульных языков, используемых для упаковки и связывания компонентов программного обеспечения. большие системы Типы отображаются в интерфейсах модулей (и родственных структурах, таких как классы); действительно, сам интерфейс можно рассматривать как «тип модуля», предоставляя сводку возможностей, предоставляемых модулем — своего рода частичного договора между разработчиками и пользователями.

Структурирование больших систем в виде модулей с понятными интерфейсами приводит к более абстрактному стилю дизайна, когда интерфейсы разрабатываются и обсуждаются независимо от их возможной реализации.Более абстрактное мышление об интерфейсах обычно приводит к лучшему дизайну.【Types and Programming Languages

Еще один важный способ, с помощью которого системы типов поддерживают фазу программирования, — это соблюдение дисциплины в программировании. В крупномасштабных программных системах система типов образует основу системы совместной работы компонентов. Типы отображаются в интерфейсах модулей (или связанных структур, таких как классы). Интерфейс можно рассматривать как «тип модуля», который показывает функции, которые может предоставить модуль, и представляет собой контракт между разработчиком и пользователем.

Четкие интерфейсы в крупномасштабной структурированной программной системе, состоящей из большого количества модулей, взаимодействуют друг с другом, чтобы сделать дизайн более абстрактным, а дизайн и обсуждение интерфейсов не зависят от их реализации. В общем, более абстрактное мышление об интерфейсах приводит к лучшему дизайну.

Types enable programmers to think at a higher level than the bit or byte, not bothering with low-level implementation. For example, programmers can begin to think of a string as a set of character values instead of as a mere array of bytes. Higher still, types enable programmers to think about and express interfaces between two of any-размер подсистем. Это обеспечивает больше уровней локализации, так что определения, необходимые для взаимодействия подсистем, остаются согласованными, когда эти две подсистемы взаимодействуют.【Википедия

Типы позволяют программистам мыслить в более высоком измерении, а не запутываться в деталях базовой компьютерной реализации. Например, мы можем думать о строках как о наборах символов, а не только как о массивах битов. В более высоком измерении система типов позволяет нам мыслить и выражать взаимодействие между произвольными подсистемами/подпрограммами с интерфейсами, а определения интерфейсов обеспечивают согласованность связи между подсистемами/подпрограммами.

Задокументировано

Типы также полезны при чтении программ. Объявления типов в заголовках процедур и интерфейсах модулей представляют собой форму документации, дающую полезные подсказки о поведении. Более того, в отличие от описаний, встроенных в комментарии, эта форма документации не может устареть, поскольку она проверяется при каждом запуске компилятора.Эта роль типов особенно важна в сигнатурах модулей.【Types and Programming Languages

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

In more expressive type systems, types can serve as a form of documentationразъяснение намерений программиста. Например, если программист объявляет функцию как возвращающую тип временной метки, это документирует функцию, когда тип временной метки может быть явно объявлен глубже в коде как целочисленный тип.【Википедия

В системе типов, повторно использующей выразительность, тип можно рассматривать как представление намерения программиста. Например, мы объявляем функцию для возврата метки времени, что эквивалентно явному заявлению о том, что функция будет возвращать целочисленный тип в более глубоком вызове кода.

языковая безопасность

Термин «безопасный язык», к сожалению, вызывает еще больше споров, чем «система типов». .Неофициально, однако, безопасный языки можно определить как те, которые делают невозможным выстрелить себе в ногу при программировании.【Types and Programming Languages

Термин безопасный язык является спорным. под сильным влиянием языкового сообщества. Неформально безопасный язык можно определить как программирование, которое невозможно убить с нуля.

A type system enables the compiler to detect meaningless or probably invalid code. For example, we can identify an expression 3 / "Hello, World" as invalid, when the rules do not specify how to divide an integer by a string. Strong typing offers more safety, but cannot guarantee complete type safety.【Википедия

Система типов позволит компилятору проверять бессмысленный или, возможно, незаконный код. Например, мы знаем3/'hello world'Незаконная, строгая типизация обеспечивает большую безопасность, но не полную безопасность типов.

эффективность

Статическая проверка типов может предоставить полезную информацию во время компиляции. Например, если тип требует, чтобы значение выравнивалось в памяти по кратному четырем байтам, компилятор может использовать более эффективные машинные инструкции.【Википедия

Статическая проверка типов предоставляет полезную информацию во время компиляции. Например, если тип должен занимать в памяти четыре байта, компилятор может использовать более эффективные машинные инструкции.

Статическая типизация, динамическая типизация и слабая типизация, сильная типизация

  • Статический тип: тип каждой переменной известен во время компиляции. Ошибка компиляции TypeError связана с синтаксисом. Например, Java, C++.
  • Динамическая типизация: тип не известен во время компиляции, а только во время выполнения. TypeError генерирует исключение во время выполнения. Например, JS, Python.
  • Слабая типизация: допускает неявные преобразования типов. такие как JS,1+'1'='11', числовой тип преобразуется в символьный.
  • Строгая типизация: неявные преобразования типов не допускаются. такие как питон,1+'1'броситTypeError.

принять ТС

Когда TS только вышла, я был немного противоречив, или мои чувства к ней были такими же, какCoffeeScript,DartПосле компиляции на язык JS я чувствую, что это продукт проникновения других языков в JS.В последние год-два голос TS в сообществе становился все сильнее и сильнее, и я также начал для создания крупномасштабных приложений JavaScript.Надежная поддержка IDE, таких как система типов TS, статическая проверка TSC и VS Code, важна для разработки крупномасштабных приложений JavaScript с хорошей ремонтопригодностью и высокой стабильностью.

компромисс

Как лучше использовать динамическую природу JS и статические характеристики TS, нам необходимо сделать всестороннее суждение, основанное на реальной ситуации проекта. несколько советов:

  • Если это небольшой и средний проект, и жизненный цикл не очень длинный, то используйте JS напрямую, не ограничивайтесь TS.
  • Если это большое приложение с длительным жизненным циклом, рекомендуется попробовать TS. проекты с открытым исходным кодом, такие какVS Code,Рабочий стол GitHub, не с открытым исходным кодом, напримерСлабый рабочий стол,Asana,Palantir.
  • Если это общедоступный модуль, такой как фреймворк и библиотека, рекомендуется использовать TS. Такие какAnt Design,Angular,Ionic.

Что касается того, использовать ли TS, это все еще зависит от фактического масштаба проекта, жизненного цикла проекта, размера команды, членов команды и других реальных условий.

Оригинальный адрес:GitHub.com/proto team/no…