Подтвердить что ты не робот

Типы безопасности Javascript

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

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

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

4b9b3361

Ответ 1

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

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

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

Обновление

На сегодняшний день наиболее популярным выбором, вероятно, является Typescript, расширенный набор Javascript, который допускает необязательные объявления типов, которые принудительно применяются во время компиляции.

Ответ 2

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

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

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

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

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

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

Пока 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 ... */
}

Ответ 6

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

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

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

Ответ 7

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

Ответ 8

Здесь используется облегченная оболочка функций типов для 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