Typesafe Javascript - PullRequest
       51

Typesafe Javascript

19 голосов
/ 13 августа 2011

Есть ли способ применения типов в JavaScript?Я имею в виду препроцессор, который берет входной файл, написанный на ActionScript 3 или Java, и преобразует его в JS.

Мне не нужно большое устройство времени выполнения, мне просто нужно представить идеювремени компиляции в моем рабочем процессе и запустить тривиальные проверки времени компиляции в моем коде (а также использовать интерфейсы).Мне также не нужен API из Java или Flex, только синтаксис.

Стандартные функции браузера также можно проверить по определениям IDL, но это не обязательно.

Ответы [ 8 ]

9 голосов
/ 14 июня 2013

Хотя я немного опоздал на эту вечеринку, я думаю, что определенно стоит упомянуть Dart (это продукт Google) и TypeScript (который является продуктом Microsoft).

JavaScript быстро становится чрезвычайно популярным языком, поскольку приложения становятся все более веб-ориентированными. Однако, как вы указали, в JavaScript не хватает безопасности типов и, скажем, несколько других вещей; классы, интерфейсы и пакеты / пространства имен / модули.

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

Преимущества Dart и TypeScript состоят в том, что они обеспечивают безопасность типов, интерфейсы, классы и т. Д. Таким образом, вы можете писать более чистые, масштабируемые, управляемые приложения, которые все еще работают в браузере.

Будучи программистом, ориентированным на Microsoft, я имел большой опыт работы с TypeScript, включая некоторую активность в разработке языка (информацию по разработке TypeScript можно найти по адресу codeplex )

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

Я не могу комментировать Дарт, поскольку я использовал это только несколько раз, но мой общий опыт с Дартом был хорошим!

9 голосов
/ 13 августа 2011

Вам следует взглянуть на проект haxe .

Haxe - очень хороший типизированный язык, использующий вывод типов (т. Е. Вы не обязаны писать много объявлений типов).) но это обеспечивает корректность типа во время компиляции.

Язык имеет подобный javascript синтаксис, и компилятор может генерировать код для виртуальной машины neko, для javascript, as3, c ++ или PHP.

4 голосов
/ 22 ноября 2014

Существует множество статически типизированных языков, которые разработаны с конкретной целью компиляции в JavaScript (так называемая сборка Интернета):

4 голосов
/ 13 августа 2011

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

3 голосов
/ 13 августа 2011

Хотя typeof будет возвращать 'object' для каждого объекта или массива, вы можете использовать оператор instanceof. Скажем, у вас есть класс Person, и вы хотите увидеть, является ли объект, переданный вашей функции, Person, вы можете сделать это:

function someFunc(person){
  if(! person instanceof Person)
    throw('argument needs to be an instance of Person.');

  /* ... do your stuff ... */
}

Если вы просто хотите убедиться, что переменная имеет номер 3 вместо строки '3', вам нужно всего лишь использовать === вместо ==:

if( var === 3 ){
  /* ... do your stuff ... */
}
2 голосов
/ 13 августа 2011

Я согласился с тем, что Javascript - это прекрасный язык, с некоторыми явными дырами, худшим и наиболее незамеченным из которых является отсутствие статической безопасности типов.

Как указал эскимоблод, есть некоторые полумерыв форме GWT и Closure, но правильный ответ, imo, - это Scala, который сочетает в себе гибкость и выразительность Javascript с системой типов, намного лучше, чем в Java - или что будет правильный ответ, за исключением того, что проект Scala-GWT, похоже, застрял.

Пока мы ждем ...

0 голосов
/ 03 декабря 2015

Вот облегченный типобезопасный упаковщик функций для nodejs / browser:

https://www.npmjs.com/package/typeshave

Его 3.9K gzipped, поддерживает jsonschema и работает практически везде.Итак:

foo = function(bar){

}

можно переписать так:

foo = typesafe({ 
  bar: { type: "object" } 
}, function(bar){

}

Или просто обернуть позже, включая проверку глубинных структур и необязательных аргументов:

foo = typesafe({
  bar: { 
    type: "object", 
    required: true,
    properties: {
      foo: { type: "string", required:true },
      items: [{
        type: "integer"  
      }]
    }
  }
}, foo ); 

foo({ foo: "helloworld", items:[1,2,3] });

Это выглядит менее шумно в coffeescript imho

0 голосов
/ 13 сентября 2015

Infernu - это безопасное для типов подмножество JavaScript.Он не компилируется в JavaScript - он может работать как есть в вашем браузере!Средство проверки типов поддерживает полный вывод типов, поэтому аннотации типов не требуются (в будущем они будут поддерживаться для документации и для преднамеренного различения структурно идентичных типов).Он еще не готов к использованию, но работа еще не завершена.

...