Ближайшая цель — расширить возможности инструментов анализа кода за счет добавления информации о типах.

Не каждый день TypeScript становится популярной темой в Твиттере. Но предложение Microsoft добавить синтаксис типов в JavaScript, безусловно, заслуживает того, чтобы стать популярной темой в Твиттере. Типы появятся в JavaScript?

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

В мире происходят очень важные вещи. Теоретически блок «актуальные темы» в Твиттере должен отражать то, что важно. Но, как я сказал выше, не каждый день что-то вроде TypeScript достигает такого уровня значимости, так что давайте попробуем переварить, о чем идет речь.

Во-первых, конечно, JavaScript за все время своего существования имел минимально отсутствующую поддержку типов. Можно было использовать typeof или instanceof, чтобы различать вещи, и были небольшие различия в поведении между number и string, но в целом у нас была свобода для всех в JavaScript. Это представлено как повышение производительности, потому что программистам JavaScript меньше приходится иметь дело при написании кода. В отличие от Java-программистов, которые должны расставлять точки над каждой «i» и зачеркивать каждую «t», чтобы что-то сделать.

По мере того, как наши программы на JavaScript становятся все больше, теоретически важно, чтобы наш код был написан строго. Как я писал в своей книге

Краткое руководство по использованию Typescript и TypeORM на Node.js для CLI и веб-приложений:

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

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

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

Зачем привносить синтаксис в JavaScript только для того, чтобы игнорировать его? Очевидно, что инструменты JavaScript должны что-то делать с информацией о типе. Это может означать, что такие инструменты, как ESLint, IDE или что-то еще, могут иметь более богатую информацию. Обладая более богатой информацией, этот инструмент может делать еще больше полезных вещей для программистов.

Примеры синтаксиса для JavaScript+Types

Предлагается назвать результат JS+Types или JavaScript+Types.

Предложение Microsoft отмечает, что в настоящее время мы можем использовать синтаксис JSDoc следующим образом:

/**
 * @param a {number}
 * @param b {number}
 */
function add(a, b) {
    return a + b;
}

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

Вместо этого предлагается написать следующее:

function add(a: number, b: number) {
     return a + b; 
}

Это именно синтаксис TypeScript.

Предложение Этапа 0 описывает ряд конкретных синтаксисов для поддержки:

function stringsStringStrings(p1: string, p2?: string,
                             p3?: string, p4 = "test"): string {
     // TODO 
}  
let x: string;  
interface Person {
     name: string;
     age: number; 
}  
type CoolBool = boolean;
class Person {
     name: string;
     constructor(name: string) {
         this.name = name;
     }
      getGreeting(): string {
         return `Hello, my name is ${this.name}`;
     } 
}  
const point = JSON.parse(serializedPoint) as ({ x: number, y: number });  
type Foo<T> = T[]  interface Bar<T> {
     x: T; 
}  
function foo<T>(x: T) {
     return x; 
}  
class Box<T> {
     value: T;
     constructor(value: T) {
         this.value = value;
     } 
}  
add<number>(4, 5) 
new Point<bigint>(4n, 5n)

Другими словами, все это прямо из TypeScript.

Предлагаемое преимущество JavaScript+Types

В TypeScript или Flow перед выполнением кода выполняется этап компиляции. У программистов многих языков есть этапы компиляции, но у программистов JavaScript их никогда не было. Отсутствие необходимости компиляции перед выполнением повышает производительность.

В предложении информация о типе описывается как аннотации типов. В качестве аннотаций информация о типе в объявлении типа const x: number = 42 рассматривается как комментарий. Это означает, что большинство инструментов будут анализировать аннотацию типа, а затем игнорировать ее. Но можно разработать и другие инструменты, которые дополнительно делают что-то полезное.

Что дальше?

Microsoft планирует предложить это предложение в качестве этапа 1 на пленарном заседании комитета TC39 в марте 2022 года. На этом этапе комитет ECMAScript будет считать, что эта функция достойна рассмотрения для дальнейшей разработки.

Будет ли возможность для механизма выполнения JavaScript добавить проверку типов? Нет. Вот что говорит Microsoft:

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

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

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

об авторе

Дэвид Херрон: Дэвид Херрон — писатель и инженер-программист, занимающийся вопросами разумного использования технологий. Его особенно интересуют экологически чистые энергетические технологии, такие как солнечная энергия, энергия ветра и электромобили. Дэвид почти 30 лет работал в Силиконовой долине над программным обеспечением, начиная от систем электронной почты и заканчивая потоковым видео и языком программирования Java, и опубликовал несколько книг о программировании Node.js и электромобилях.

Первоначально опубликовано на https://techsparx.com.