Различия между TypeScript и Dart [закрыто]

85

Microsoft недавно представила Typescript, новый JavaScript-подобный язык программирования. Некоторое время назад я услышал о Dart, новом языке программирования, созданном Google для решения проблем, связанных с Javascript, таких как производительность, масштабируемость и т. Д.

Назначение обоих новых языков мне кажется одинаковым. Как вы думаете?

Являются ли цели языков одинаковыми?

Каковы реальные различия о них?

margabit
источник
см. обсуждение здесь: programmers.stackexchange.com/questions/166978/…
diadiora

Ответы:

60

Цитирую Боба Нистрома :

TypeScript выглядит неплохо, если вам нравится семантика JS или у вас есть большая кодовая база JS, в которую вы вложили деньги, но у вас возникают проблемы с обслуживанием в масштабе. Его путь к успеху гораздо более плавный, поскольку он (в основном?) Обратно совместим с JS.

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

  • Встряхивание дерева
  • Получатели и установщики (хотя я предполагаю, что TypeScript получит их в конце концов)
  • Перегрузка оператора
  • Нет Реальный блок сфера, не подъемная, не IIFE s
  • Нативная ВМ
  • Семантика нормального равенства
  • Нет странного неявного преобразования сумасшествия
  • Лексически связаны this везде
  • Примеси
  • Аннотации
  • Система импорта
  • Определяемые пользователем операторы подписки
  • Обобщения, с овеществлением
  • Зеркала
  • Лучшие коллекции классов
  • Более чистый DOM API

Кроме того, он пишет в http://www.reddit.com/r/programming/comments/10rkd9/welcome_to_typescript/c6g37xd :

Я в команде Google по дартсу, поэтому я естественно смотрю на это с этой точки зрения. Вот некоторые случайные вещи, которые попались мне на глаза, в основном сравнивая их с Dart. Я потратил всего несколько минут на скимминг, так что не принимайте это всерьез ...

Нет дженериков

Я думаю, что некоторые типы лучше, чем вообще никаких, но потерять их действительно сложно. TypeScript имеет встроенные типы массивов, а типы объектов охватывают некоторые варианты использования типа «карта». Но неспособность определить свои собственные универсальные типы - непростая задача. Документы говорят, что при добавлении дженерики будут работать с использованием стирания типов, чего я и ожидал, учитывая его стиль «compile to lightweight JS», но это тоже может быть проблемой. Приятно иметь возможность иногда что-то делать с аргументами типа во время выполнения.

Все типы обнуляются

Дарт это так же. Мне грустно в обоих случаях.

Синтаксис аннотации типов хорош

Почти каждый язык с необязательными аннотациями типов (ML, Scala, F #, Kotlin и т. Д.) Идет с "постфиксом после:. Dart пытается использовать аннотации типа C-стиля, что вызывает некоторые неприятные угловые случаи. Мне нравится то, что здесь есть TypeScript, особенно синтаксис для типов функций:

function takeCallback(callback : (n : number) => number)
{ ... }

Интерфейсы структурно типизированы, классы номинально типизированы

Имеет смысл, учитывая, что это JavaScript, но он выглядит довольно аккуратно. Возможность неявно реализовывать интерфейс - это хорошо. Но TypeScript, похоже, не позволяет вам пойти другим путем: имея класс, вы не можете создать новый тип, совместимый с ним, без конкретного расширения его из-за фирменного стиля. В Dart, благодаря неявным интерфейсам, вы можете.

Лучший общий тип может потерпеть неудачу

Это означает, что это ошибка типа:

[1, true]

Вы можете перегружать интерфейсы подписью параметра

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

interface Doubler {
  double(s : string) : string;
  double(n : number) : number;
}

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

Существует специальный синтаксис для типов массивов

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

Там нет скрытого даункинг

Одна из наиболее необычных функций системы типов Dart заключается в том, что совместимость назначений является двунаправленной: вы можете понижать рейтинг без предупреждения. Помимо типичного особого случая присвоения / из любого (динамического в других языках), TypeScript не позволяет этого. Вы должны напечатать assert. Лично мне нравится подход TypeScript здесь.

Стрелка и лексическая функция

Это всего лишь материнство и яблочный пирог. Мне это нравится. (У Дартта это тоже есть, и это всегда лексически связано.)

В целом выглядит довольно аккуратно. Если вы хотите точно такую ​​же семантику JS (хорошую и плохую), но также хотите смешать типы, TypeScript выглядит неплохо. Это похоже на Closure Compiler, но с лучшим синтаксисом.

Если вы хотите что-то более агрессивное, чем синтаксис и семантика JS, тогда, похоже, TypeScript не тот.

Сет Лэдд
источник
17
Что такое дрожание деревьев?
citykid
4
Подробнее о тряске деревьев: blog.sethladd.com/2013/01/…
Сет Лэдд,
19
«Инструменты Dart поддерживают встряхивание дерева, метод« стряхнуть »неиспользуемый код, уменьшая таким образом размер развернутого приложения. Я могу импортировать в свое приложение богатые библиотеки, наполненные полезной полезностью, но будут включены только те функции, которые я фактически использую в моем сгенерированном выводе. " thx
citykid
3
Находясь в режиме предварительного просмотра, Typescript находится в идеальной форме для использования в профессиональных проектах, которые выйдут завтра. Язык и инструменты работают без каких-либо серьезных проблем или вообще без проблем.
citykid
4
Как заметил @JustAnotherUserYouMayKnowOrNot, TypeScript добавил дженерики в 0.9 blogs.msdn.com/b/typescript/archive/2013/06/18/…
Джон
60

В то время как вопрос был «Являются ли цели языков одинаковыми?», Реальный вопрос: «Как мы можем улучшить веб-программирование там, где мы находимся?» ,

Оба проекта пытаются сделать это с учетом

  • язык программирования (TypeScript делает небольшой, но очень чистый шаг, Dart делает более революционный ход, который все еще движется)

  • совместимость с существующим кодом js (переход 0 в TypeScript, который компилируется в js, сложный в Dart, поскольку 2 виртуальные машины общаются друг с другом)

  • практика разработки программного обеспечения (только Dart, веб-компоненты и теневой домен)

За последние 3 дня я углубился в Dart, а затем в TypeScript. Моя кодовая база CoffeeScript занимала строки кода 2000-х годов, слишком много, чтобы справиться с красивым, но слишком пушистым CoffeeScript. Проблемы, с которыми я столкнулся, заключались в том, что в CoffeeScript отсутствуют функции, которые есть в языках, разработанных для программирования среднего и крупного масштаба: интерфейсы, модули, безопасность типов. Но был один , даже гораздо более серьезной проблемой , с кофе и JS: The JS «этот указатель» странность повлияло на мое здравомыслие и CoffeeScript ничего здесь не поможет.

Итак, вот мои результаты после 3 дней использования и оценки:

дротик

Тщательно изучил учебник, прочитал 1 книгу, прочитал 2-ю книгу и попробовал демоверсии. Я думал, Дарт, это будущее . Затем я попытался перенести мое приложение в Dart. Это было, где мой энтузиазм снизился со 100 до 10. Вот почему:

  1. Dart Editor является единственным способом программирования Dart. Хотя плагины для Sublime Text существуют, они не предоставляют такие функции, как intellisense, завершение кода (исправьте меня, если я ошибаюсь). Редактор дротиков, однако, в пре-альфа-качестве. Несмотря на то, что он поддерживает такие магические вещи, как супер-охлаждение, такие как обновление веб-страницы, когда вы редактируете файл CSS (! Действительно круто), он зависает или падает несколько раз в минуту. Таким образом, вы печатаете 5 букв, и 2 раза вам придется ждать 2 секунды или 15 секунд между наборами. И у меня был проект с несколькими строками кода, поэтому я не хотел ждать, что произойдет, если в строке 1000 с. Перемещен файл из одной папки в другую в Dart Editor, сбой. отладкас Dart Editor на первый взгляд лучше, чем все известные мне средства отладки js (chrome - мой выбор), но все еще слишком много чего не хватает: нет непосредственного окна (это делает отладку js намного лучше в данный момент), нет часов.

  2. Политика и возможности побега : Некоторые говорят, что Apple, MS и Firefox никогда не будут предоставлять виртуальные машины Dart. Ну, я не совсем уверен, но, по крайней мере, для Apple это кажется на данный момент вполне определенным. Для других это скорее, чем наоборот. Так что нет проблем, мы можем конвертировать Dart в JavaScript. Эта интеграция действительно великолепна: Dart поддерживает заглушку js, которая поддерживает код js, подключенный к Dart Editor, так что print()в Dart Editor все равно появляется выражение. Но тут возникает одно: площадь такого преобразованного кода высока. 150kB или около того (до минификации). Я не слишком много копался в точных размерах, так что не зацикливайся на этом.

  3. Языковая зрелость . Помимо слишком серьезных проблем с Dart Editor, появляющихся мне в лицо 3 раза в минуту, я также счел недопустимым, что каждый источник кода Dart, который вы найдете, использует свой Dart. Язык меняется каждый день. Вы нашли сообщение от 5 недель назад? Это устарело. Вы пробуете образцы из учебника Google? По крайней мере 1 пример не компилируется, так как API изменился. Даже обычные вещи, такие как присоединение события к элементу DOM, находятся в хорошем состоянии .

  4. Интеграция с существующими библиотеками js немного сложна. 2 ВМ нужно общаться здесь, это сложно.

В заключение, вы не можете всерьез использовать Dart на сегодняшний день, и погружение в него не слишком увлекательно из-за 1 и 3. Обе точки со временем разочаруют. О 2 пунктах, Google опубликовал тесты производительности несколько дней назад, демонстрируя, что их скомпилированные js лучше, чем рукописные js. Мои комплименты, отличная работа. Время загрузки может все еще быть позади из-за проблемы следа, как сказано. Однако, если код следа используется многими многими сайтами, он может быть доступен в кеше и вуаля, а также исчезнет.

Итак: я считаю Дарт отличным проектом, использование которого в настоящее время несет в себе значительную часть непредвиденного риска, и в этом году потребуется, чтобы вывести его на хороший стабильный уровень.

Машинопись

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

  1. Интерфейсы . Инкапсуляция и интерфейсы позволяют мне легко структурировать мой код. Отлично!

  2. Класс государства. , TypeScript позволяет выразить состояние, которое экземпляры класса переносят явно, или, что лучше, его принудительно применяют. Это большой шаг лучше по сравнению с JS или кофе.

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

  4. Редактор, Intellisense . TypeScript поставляется со 100% высочайшим интеллектом, который реагирует в микро- или миллисекундном диапазоне, как это используется в Visual Studio при программировании на C #. Заголовки TypeScript для всех важных библиотек js также существуют . Отлично, отлично.

  5. Опыт и риск . Использование TypeScript сопряжено с нулевым риском, язык четко определен, совершенно стабилен, это просто js с сахаром, ничего непредвиденного.

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

Так что насчет производительности? Хотя я считаю себя фанатом производительности, я не верю, что существует какой-либо проект, который бы сделал здесь выбор технологии на основе производительности. Оба в лиге.

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

В любом случае, 3 прошедших дня были в основном веселыми, и я многому научился, если вы найдете время, Дарту потребуется 1 день, а TypeScript - 2 часа, чтобы составить собственное мнение. Попробуй.

Обновление октябрь 2014

Прошло какое-то время, и после публикации кажется, что предположение, что Typescript - это безопасный стабильный путь, было совершенно правильным. Я только что нашел (очень) заметное утверждение о Typescript, Dart и Closure:

Я давно интересовался проблемой веб-программирования в целом. Я считаю, что Google Closure в настоящее время все еще является лучшим вариантом для крупномасштабной разработки на JavaScript / в Интернете, но в конечном итоге он будет заменен чем-то менее подробным. Хотя Dart демонстрирует большие надежды, я все еще встревожен размером JavaScript, который он генерирует. Для сравнения, если TypeScript может быть напрямую переведен в JavaScript, который может быть скомпилирован с использованием расширенного режима компилятора Closure, то мы можем получить все преимущества оптимизированного JavaScript из Closure без многословия. Более того, поскольку TypeScript - это расширенный набор JavaScript, я считаю, что его синтаксические расширения в какой-то момент могут превратить его в стандарт ECMAScript,

http://blog.bolinfest.com/2013/01/generating-google-closure-javascript.html

Майкл Болин - давний (бывший) герой внешнего интерфейса Google, также участвовавший в закрытии Google (получить его книгу о закрытии).

Google Traceur

Appraoch Google для работы с ECMA Script 6 сегодня - это проект Traceur: https://github.com/google/traceur-compiler.

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

Facebook Flow, Google AtScript

обеспечить аналогичные функции, как TypeScript.

«Можно задаться вопросом, что происходит с этими различными решениями для проверки типов JavaScript и что с этим делать. Хорошая новость заключается в том, что Microsoft, Facebook и Google сотрудничают по этим вопросам, по словам Джонатана Тернера из Microsoft:

Команда TypeScript работает как с командами Flow, так и с командами AtScript, чтобы обеспечить возможность использования ресурсов, уже созданных сообществом JavaScript, для этих инструментов. Эти проекты могут многому научиться друг у друга, и мы с нетерпением ждем совместной работы, продвигаясь вперед и создавая лучшие инструменты для сообщества JavaScript. В долгосрочной перспективе мы также будем работать над тем, чтобы объединить лучшие возможности этих инструментов в ECMAScript, стандарт JavaScript. "

infoq статья о потоке фб

citykid
источник
Я бы подождал, пока Google не начнет использовать Dart для большинства своих собственных проектов (где это применимо) - другими словами, начнет есть собачью еду. Также Dart звучит как Silverlight, только без XAML-части, только с одним языком, но лучше интегрированный с JS / HTML.
Ден
1
Да, Dart - это то, что находится в лаборатории, которую мы можем наблюдать и ждать в будущем, в то время как Typescript уже готов к профессиональному развитию. Таким образом, сравнивая Typescript с Dart, вы сравниваете яблоки с оранжевыми саженцами.
citykid
7
Это был очень проницательный ответ. Спасибо, что написали это.
Даршан Савардекар
2
Понятия не имею, как машинописный текст «исправляет» thisконтекст, так как вам все равно придется связывать функции обратного вызова, объявленные внутри методов, с thisконтекстом метода, чтобы получить доступ к атрибутам класса. Как это "исправить" что-нибудь?
nurettin
1
действительная точка. в то время как связывание все еще иногда требуется, это псевдоним внутри функций стрелок , так что проблема, по крайней мере, смягчена.
citykid
17

Цитируя Скотта Хансельмана:

Люди сравнивали TypeScript с Dart. Это сравнивает яблоки с карбюраторами. TypeScript основан на JavaScript, поэтому проблем с взаимодействием JS нет. Dart - это виртуальная машина, написанная с нуля. Дарт взаимодействует с JavaScript ... но это не JS. Например, он даже не использует числовой тип JavaScript.

От того, почему TypeScript должен быть ответом на что-либо?

М. Дадли
источник
8
Я немного смущен, если честно. TypeScript тоже не совсем JS, верно? var x = {}; x.foo = 5; //Doesn't work in typescriptи в var e = window.event ? window.event : e; //Doesn't work in typescriptприведенном выше примере произойдет сбой компилятора TypeScript. Я что-то пропустил? Я не могу просто «вставить» свой JavaScript и использовать типы, когда мне это нравится. Я должен изучить некоторый новый синтаксис и структурировать все с типами.
aikeru
@aikeru Хммм, вы правы. Это, кажется, устраняет некоторые из величия JS. Я собирался использовать этот новый инструмент, но теперь у меня есть вторые мысли.
Chev
3
Не согласен. Это все равно что сравнивать яблоки с грушами или карбюраторами с впрыском топлива. В этих двух вещах есть много вещей, которые, естественно, заставляют множество людей думать о них одновременно.
hippietrail
Для записи, это работает , var x = {}; x['foo'] = 5;и это делает тоже самое var y:any = {}; y.foo = 5;, но я был немного удивлен, обнаружив , что вы правы об этом - воспринимаемый тип {}является {}скорее чем any. Может быть проблема вывода типа. Я разместил вопрос здесь - посмотрим, как они ответят.
mindplay.dk
3

Пришлось ввязываться в эту дискуссию с моим собственным открытием в последнее время.

1-й: TypeScript

MS выбрала хороший подход в том, что вы можете легко прыгать в TS и JS. Мы в основном используем AngularJS для нашей разработки и обнаружили, что пока мало документации для преобразования Angular в TypeScript. Это было приятное дополнение для включения TypeScript в наш рабочий процесс Dev.

2-й: дартс

Дарт - это ироничный шаг для Google. Может быть, они не помнят activeX и все кошмары вокруг, пытаясь заставить приложение работать во всем, кроме страшного IE 5 или IE 6 дня. MS потребовалось много лет, чтобы оправиться от тех дней.

Дарт как язык «концептуально», кажется, пытается объединить некоторые приятные функции ООП. Аннотации и т. Д. - хорошая мысль для Javascript.

Проблема в том, что трудно представить достаточную пропускную способность для создания нового редактора, нового языка, новых виртуальных машин в разных браузерах, плагинов для других IDE, компилятора для преобразования в javascript (без размера в несколько мегабайт), преобразования или создания новых библиотек dart для заменить тысячи текущих библиотек js, попросить кого-нибудь принять решение о полимерах или директивах, преобразовать сайт dartlang в использование dart, и это то, что я могу придумать с самого начала.

Концепция пытаться использовать Dart во всем, кроме тривиального приложения, в настоящее время страшна.

Поверх всего этого ES6 не далеко. ES6 имеет много функций, которые Дарт пытается исправить, которые существуют в ES5. Каким будет ценностное предложение, когда ES6 выйдет на улицу? По крайней мере, в это время единственное изменение, которое вы должны внести в TypeScript после выхода ES6, - это, возможно, выбрать другую компиляцию для целевой.

Просто чтобы прояснить хоть что-то, что я про MS человек. MS делает несколько достойных продуктов и добилась больших успехов, чтобы исправить прошлые ошибки в сообществе OSS. Я до сих пор редко использую что-либо кроме TypeScript от MS.

код
источник