Відмінності між TypeScript і Dart [закрито]


85

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

Мета обох нових мов мені здається однаковою. Як ви думаєте?

Чи цілі мови однакові?

Які реальні відмінності щодо них?


дивіться дискусію тут: programmers.stackexchange.com/questions/166978/…
diadiora

Відповіді:


60

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

TypeScript здається приємним, якщо вам подобається семантика JS або у вас є велика база коду JS, в яку ви інвестуєте, але у вас проблеми з технічним обслуговуванням в масштабі. Шлях до успіху значно гладший, оскільки він (в основному?) Назад сумісний з JS.

Дарт приймає більш ризиковану ставку. Це далеко від JS багато способів, що, я думаю, в основному добре, як щоденний програміст Dart, але це робить бар'єр для входу більш високим. Але в обмін на цей більш високий бар'єр для в'їзду ви отримуєте:

  • Дерево струшує
  • Геттери і сетери (хоча я припускаю, що TypeScript їх отримає з часом)
  • Перевантаження оператора
  • Немає Реальний блок сфера, що не підйомна, що не IIFE s
  • Рідний В.М.
  • Семантика здорової рівності
  • Ніякої дивної неявної божевільної конверсії
  • Лексично скріплені this скрізь
  • Міксини
  • Анотації
  • Система імпорту
  • Оператори, визначені користувачем
  • Родослов'я, з реіфікацією
  • Дзеркала
  • Кращі колекційні класи
  • Чистіший DOM API

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

Я в команді Google Dart, тому я, природно, дивлюсь на це з тієї точки зору / упередженості. Ось кілька випадкових речей, які потрапили мені в очі, здебільшого порівнюючи їх із Дарт. Я провів лише кілька хвилин, скумуючись, тому не сприймайте нічого з цього занадто серйозно ...

Без дженериків

Я здогадуюсь, що деякі типи краще, ніж взагалі відсутні, але втратити їх справді грубо. TypeScript має вбудовані типи масивів, а типи об'єктів охоплюють деякі випадки використання типу "map". Але не в змозі визначити власні загальні типи - це неприємність. Документи кажуть, що, додавши, generics працюватиме з використанням стирання типів, що я б очікував, враховуючи, що це "компіляція до легкого JS" стилю, але це теж може бути болем. Приємно іноді працювати з аргументами типу під час виконання.

Усі типи є нульовими

Дартс тим же шляхом. Змушує мене сумно в обох випадках.

Синтаксис анотації типів є приємним

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

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

Інтерфейси структурно набрані, класи номінально набрані

Має сенс, враховуючи, що це JavaScript, але він здається досить акуратним. Вміло неявно реалізувати інтерфейс - це приємно. Але схоже, що TypeScript не дозволяє вам йти іншим шляхом: даючи клас, ви не можете створити новий тип, сумісний з ним, не конкретно розширюючи його через бренд. У Dart, завдяки неявних інтерфейсів, ви можете.

Кращий звичайний тип може вийти з ладу

Це означає, що це помилка типу:

[1, true]

Ви можете перевантажувати інтерфейси за допомогою підпису параметрів

Це дійсно круто, оскільки це дає можливість більш точного потоку виводу типу через виклик функції, який робить деяке динамічне перемикання типу. Наприклад:

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

При цьому, коли компілятор бачить виклик подвоїтись, він може правильно дати точний тип повернення на основі виведеного типу аргументу. У чому я не впевнений, як реально реалізувати клас, який реалізує цей інтерфейс та робить щасливою перевірку типу. Насправді ви не можете перевантажувати конкретними методами, і моя п'ятихвилинна спроба зробити це щасливим шляхом динамічної перевірки типу, здається, не спрацювала.

Існує виділений синтаксис для типів масивів

Має сенс, оскільки немає дженериків. Це також приємно і лаконічно, що добре, але я особисто віддаю перевагу загальним загальним призначенням над одноразовими колекціями спеціальних випадків.

Немає неявного зриву

Однією з найбільш незвичайних системних функцій Dart є те, що сумісність присвоєння є двосторонньою: ви можете скасувати без попередження. Крім типового особливого випадку присвоєння до / з будь-якого (динамічного на інших мовах), TypeScript цього не дозволяє. Вам потрібно ввести ASDERT. Особисто мені тут подобається підхід TypeScript.

Функції стрілок і лексичні це

Це просто материнство і яблучний пиріг. Мені це подобається. (Дарт теж має це, і це завжди лексично пов'язане.)

В цілому це виглядає досить акуратно. Якщо ви хочете точно таку саму семантику JS (хорошу та погану), але також хочете трохи типів, TypeScript здається пристойним. Це як компілятор закриття, але з кращим синтаксисом.

Якщо ви хочете чогось більш агресивного кроку від синтаксису та семантики JS, то здається, що TypeScript це не так.


17
Що тремтить дерево?
citykid

4
Докладніше про струшування дерев: blog.sethladd.com/2013/01/…
Сет Ледд

19
"Інструменти Dart підтримують струшування дерев, техніка" відхилення "від невикористаного коду, зменшуючи таким чином розмір розгорнутої програми. Я можу імпортувати багаті бібліотеки, наповнені корисною користю, у моє додаток, але включатимуться лише ті функції, які я фактично використовую в моєму генерованому виході ". thx
citykid

3
Перебуваючи в стані попереднього перегляду, Typescript знаходиться в ідеальній формі для використання в професійних проектах, які надсилаються завтра. Мова та інструменти працюють без жодного серйозного питання або навіть навряд чи будь-якого питання.
citykid

4
Як зазначав @JustAgetherUserYouMayKnowOrNot, TypeScript додав дженерики в 0,9 blogs.msdn.com/b/typescript/archive/2013/06/18/…
Джон

60

Хоча питання було "Чи цілі мови однакові?", Справжнє питання: "Як зробити веб-програмування кращим там, де ми є?" .

Обидва проекти намагаються це зробити, враховуючи

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

  • сумісність з існуючим кодом js (0 перехід у TypeScript, який компілюється у js, складний у Dart, оскільки 2 VM розмовляють між собою)

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

За останні 3 дні я занурився вглиб Дарт, а потім у TypeScript. Моя база даних CodeScript перейшла до рядків коду 2000-х років, надто багато для роботи з чудовим, але занадто пухнастим CoffeeScript. Проблеми, з якими я зіткнувся, полягала в тому, що CoffeeScript не має функцій, якими володіють мови, призначені для програмування середнього та великого масштабу: інтерфейси, модулі, безпека типу. Але з кавою та js було одне, навіть набагато серйозніше: дивацтво js "цей покажчик" вплинуло на мій розум, і CoffeeScript тут нічого не допомагає.

Тож ось мої результати після 3 днів оцінювання та використання:

Дартс

Ретельно пройшли підручник, прочитавши 1 книгу, продемонструвавши 2-ю книгу та спробувавши демонстрацію. Я думав, Дарт, це майбутнє . Потім я спробував перенести свій додаток на Дарт. Це було моє захоплення знизилося з 100 до 10. Ось чому:

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

  2. Політика та можливості втечі : Деякі кажуть, що Apple, MS та Firefox ніколи не нададуть Dart VM. Ну, я не такий впевнений, але принаймні для Apple це здається на даний момент дуже певним. Для інших це більше, ніж навпаки. Тож немає проблем, ми можемо перетворити Dart в JavaScript. Те, як ця інтеграція працює насправді чудово, Dart підтримує js-заглушку, яка зберігає js-код, підключений до редактора Dart, тому print()твердження все ще з’являється в редакторі Dart, крутим. Але тут виникає інше: слід такого конвертованого коду високий. 150 кБ або близько того (до мінімізації). Я не надто сильно копався в точних розмірах, тому не прибивайте мене до цього.

  3. Мовна зрілість . Окрім занадто серйозних проблем із редактором Dart, що стикається мені в обличчя 3 рази на хвилину, я також вважав неприйнятним, що кожне знайдене джерело про код Dart використовує різний Dart. Мова змінюється щодня. Ви знаходите повідомлення від 5 тижнів тому? Він застарів. Ви спробували зразки з підручника Google? Щонайменше 1 зразок не складається, оскільки змінено API. Навіть звичні речі, як-от приєднання події до елемента DOM , добре рухаються .

  4. Інтеграція з існуючими js-бібліотеками дещо задіяна. 2 мультимедіа потрібно тут спілкуватися, це хитро.

Як висновок, ви не можете серйозно використовувати Dart на сьогоднішній день, і зануритися в нього не надто весело через 1 і 3. Обидва бали з часом будуть розчаровуватися. Щодо другого пункту Google опублікував показники ефективності кілька днів тому, продемонструвавши, що їх складений js кращий, ніж рукописний js. Мої компліменти, чудова робота. Час завантаження все ще може бути відсталим через проблему, як було сказано. Однак, якщо код сліду використовує багато багатьох сайтів, він може бути доступним кешованим і вуалявим, також зникає.

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

TypeScript

Оцінити 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 з цукром, нічого непередбачуваного.

Власне, ці вдосконалення дають мені все, що мені потрібно. Єдине, що я хотів би побачити в майбутньому - це загальні колекції. Але це арахіс.

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

Якщо вас цікавить майбутнє веб-програмування, обидва докладають великих зусиль, TypeScript є набагато більш прагматичним та зручним для використання, Dart - це дуже цікавий лабораторний проект, який стане корисним, коли доступні зрілі редактори та налагоджувачі та обсяг проектів, які можна виконати це буде залежати від політики.

У будь-якому випадку, три дні овалу були здебільшого веселими, і я багато чого навчився, якщо ви знайдете час, то для Dart потрібно 1 день та 2 години для того, щоб TypeScript склав власну думку. Спробуй це.

Оновлення жовтня 2014 року

Минуло деякий час і після цього з'являється припущення, що Typescript - це безпечний стабільний шлях, який потрібно пройти, було цілком правильним. Я щойно знайшов (дуже) видатне твердження про Typescript, Dart та закриття:

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

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

Майкл Болін - давній (колишній) герой переднього кінця google (ex) fb, також бере участь у закритті Google (дістаньте його книгу про закриття).

Google Traceur

Програма Google для проживання ECMA Script 6 сьогодні - це проект Traceur: https://github.com/google/traceur-compiler

Порівняно з Typescript, підтримка інструментів, імовірно, значно відстає на сьогодні. Однак, з іншого боку, це набагато швидше у прийнятті надто крутих майбутніх удосконалень мови js, таких як ітератори чи розуміння.

Facebook Flow, Google AtScript

надають подібні функції, як TypeScript.

"Можна поцікавитися, що з цими різними рішеннями для перевірки типу JavaScript і що з цим робити. Хороша новина полягає в тому, що Microsoft, Facebook і Google співпрацюють над цим", вважає Джонатан Тернер:

Команда TypeScript працює як з командами Flow, так і з AtScript, щоб забезпечити використання ресурсів, які вже створені спільнотою типізації JavaScript, через ці інструменти. Ці проекти можуть багато чому навчитися один у одного, і ми з нетерпінням чекаємо спільної роботи вперед та створення найкращих інструментів для спільноти JavaScript. У перспективі ми також будемо працювати над тим, щоб скласти найкращі функції цих інструментів у ECMAScript, стандарт, що стоїть за JavaScript. "

стаття infoq про потік fb


Я б зачекав, поки Google не почне використовувати Dart для більшості власних проектів (де це можливо) - починає їсти собачу їжу іншими словами. Також Dart звучить як Silverlight, тільки без частини XAML, лише однієї мови, але краще інтегрованої з JS / HTML.
День

1
Так, Дарт - це те, що ми можемо спостерігати і чекати в майбутньому, тоді як Typescript готовий до професійного розвитку вже зараз. Таким чином, порівнюючи Typescript з Dart, це порівняння яблук з помаранчевою розсадою.
citykid

7
Це була дуже прониклива відповідь. Дякую, що написали це.
Даршан Савардекар

2
не маю уявлення про те, як typecript "виправляє" thisконтекст, оскільки вам все одно доведеться зв'язувати функції зворотного виклику, оголошені всередині методів, з thisконтекстом методу, щоб отримати доступ до атрибутів класу. Як це "фіксувати" що-небудь?
Нуреттін

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 Хм, ти прав. Це, мабуть, усуває деякі величі JS. Я збирався використовувати цей новий інструмент, але тепер у мене є другі думки.
Шев

3
Не погоджуюсь. Це як порівняння яблук з грушами або карбюраторів з впорскуванням палива. Про цих двох є багато речей, що, природно, призводить до того, що багато людей думають про них одночасно.
hippietrail

Для запису, це працює var x = {}; x['foo'] = 5;і це теж робить var y:any = {}; y.foo = 5;, але я трохи здивований, виявивши, що ви маєте рацію з цим - сприймається тип {}, {}а не any. Може виникнути проблема з висновком типу. Я опублікував випуск тут - побачимо, як вони відповідають.
mindplay.dk

3

Довелося останнім часом поспішати на цю дискусію із власним висновком.

1-й: TypeScript

МС прийняв хороший підхід у тому, що ви можете легко заскакувати та виходити з TS та JS. Ми в основному використовуємо AngularJS для своєї розробки, і поки не знайдено багато документації для перетворення Angular в TypeScript. Це було приємним доповненням для включення TypeScript у наш робочий процес Dev.

2-й: Дартс

Дарт - трохи іронічний крок для Google. Можливо, вони не пам'ятають activeX і всі кошмари навколо, намагаючись змусити програму працювати в чому-небудь, крім жахливих IE 5 або IE 6 дня. МС пройшло багато років, щоб відновитись із тих днів.

Дартс як мова "концептуально", схоже, намагається поєднати деякі приємні функції OOP. Анотації тощо - це хороша думка для Javascript.

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

Наразі концепція спроби використовувати Dart у будь-якому, крім тривіального додатку, страшна.

Крім цього, ES6 не за горами. ES6 пропонує багато функцій, які Dart намагається виправити, які існують в ES5. Яка цінність буде після того, як ES6 вийде на вулицю? Принаймні, в цей час єдине зміна, яку ви повинні внести в TypeScript, коли ES6 вийде, - це, можливо, вибрати інший компіляцію для націлювання.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.