Pull to refresh

Comments 32

Весьма и весьма спорный список недостатков:

— Отсутствие модульности
уже нет

— Нелогичное поведение
по мне так в C++ гораздо больше нелогичностей

— Динамическая типизация — нет IntelliSense, из-за чего мы не видим, какие ошибки будут возникать во время написания, а видим их только во время исполнения программы
для этого есть голова
Насколько мне известно, Visual Studio Code умеет делать восхитительные подсказки, которые основаны на комментариях и, внимание, на том, что возвращает метод/функция. Разве этого мало?
Мне сложно судить, поскольку ни Visual Studio, ни восхитительными подсказками я никогда не пользовался, как то и без всего этого живется неплохо.

Если всю жизнь ничего слаще морковки не пробовать, то она будет казаться очень сладкой)

const a = {
name: «My name»
};
let i: number;
let s: string = «name»;
i = a[s];

Таким же способом можно получить доступ к приватным членам класса… Код, конечно, попахивает. IntelliSense говорит, что все ОК (если бы было i = a[«name»], тогда да — подсветил бы ошибку).

P.S.: За такое и сам бы по руках бил.
Список недостатков высосан из пальца. Отсутствие популярных библиотек в DefinitelyTyped никак нельзя назвать недостатком языка. Опциональная типизация — одна из главных фич языка, позволяющая постепенно переводить существующий JS-код на TS. Про «количество генерируемых файлов» я вообще молчу. Еще очень часто среди «недостатков» всплывает тот факт, что Typescript придумал Microsoft, а они — корпорация зла! *facepalm*

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

За полтора года использования в дизайне языка встретилось несколько багов или недоработок, которые со временем оперативно пофиксили. Был только один неприятный момент, который отказались исправить: нельзя использовать Enum в качестве ключа для Dictionary.

А что думаете насчет отсутствия полной поддержки ES6 ES2015 к примеру Object.assign?
Не пробовали ставить target: "es6" и потом обрабатывать babel'ом? (Вдруг есть такой опыт)


спасибо)

Так Object.assign — это не синтаксис. Это должен поддерживать движок, а не язык. Если движок не поддерживает, есть полифиллы.

Стоп. TypeScript надмножество и поддерживает ES2015, Object.assign — возможность языка. Я в курсе насчет отсутствия полифилов в составе TypeScript. А вот отсутствие в интерфейсе объекта assign мною было замечено. (Сейчас может уже все нормально я не знаю). Но интересно сколько раз сталкивались с таким.

Коль автора комментария пока нет, мне интересно мнение насчет "той самой боли" typings для не популярных библиотек. Бывают достаточно большие не популятные библиотеки, как быть ?


Можно конечно:


declare var lib;

Может вы рецепты знаете какие или статью интересную на эту тему?
ps: пару месяцев пишу на typescript часто беспокоят всякие мелочные проблемы.
спасибо)

К сожалению, автоматической магии тут не может быть. Если нет typing'а для библиотеки, которую вы используете, варианта действий всего три.

Идеальный вариант — написать объявление самому и отправить PR с ним в репозиторий DefinitelyTyped. И самому будет удобно работать, и сообществу поможете.

Самый быстрый вариант — использовать any и работать с библиотекой так, как бы вы писали на чистом JS — обложиться мануалами, включить автоподсказки IDE, скрестить пальцы и молиться.

Компромисс — написать самому частичное объявление, которое покрывает не всю библиотеку, а только то, что вы из нее непосредственно используете, и ждать, когда какой-нибудь альтруист не столкнется с подобной проблемой и не выберет путь #1.
Именно с этим конкретным случаем не сталкивался. В спецификации сказано, что TS является надмножеством ES2015, так что скорее всего это баг — такие вещи можно отправить им в багтрекер и их довольно быстро чинят.

Отдельный вопрос — это существование трансформаций новых фич в более старые целевые платформы. Обычно новые возможности ES2015 внедряют сразу же, но только для целевой платформы ES6, потому что генерируемый код будет практически неизменным. А уже потом добавляют трансформацию, позволяющую использовать эту возможность в более старой платформе ES3/ES5. Например, объявления переменных let добавили в 1.4, а использовать их в ES5 стало возможно только в 1.5. Генераторы включили в 1.7, а поддержку в ES5 ждем не раньше релиза 2.0. На самом деле, это тоже хорошо — фичи становятся доступными быстрее, а при желании можно использовать постобработку Babel'ом.
Простите, но что за фигню вы пишете?

Нелогичное поведение.

Аргументы будут или это просто слова?

Динамическая типизация — нет IntelliSense, из-за чего мы не видим, какие ошибки будут возникать во время написания, а видим их только во время исполнения программы.

IntelliSense это как раз наоборот сильная сторона TypeScript, потому что IDE более точно может выводить подсказки, на основе анализа типов, а не показывать весь список идентификаторов, которые нашла.

Функции обратного вызова

От этого вообще выпал. Вы когда с JS познакомились, вчера?

Потом еще зачем-то заголовочные файлы из Си сюда приплели

TSD уже не актуален, нужно пользоваться typings

UFO just landed and posted this here
UFO just landed and posted this here
Можете ответить на:
«Где хранить, как обновлять, куда класть свои, включать в Solution или нет?»
UFO just landed and posted this here
>Неявная статическая типизация. Если объявим переменную типа any, то никакой пользы от статической типизации не получим.
Это недостаток прокладки между монитором и клавиатурой, но никак не языка.
Скажите, а в чем профит TS? Простите, не ради троллинга, действительно интересно.

Посмотрел синтаксис — очень похож на Java.
Уже лет пять-шесть пишу на JS. Особо проблем с типизацией никогда не испытывал.
Но много кто хвалит TS, а читаю статью так и не вынес для себя что либо полезное.
>Скажите, а в чем профит TS?
Самое главное: нормальная поддержка классов.
Транспиляция и типизация. Много пишу на ts с самого его появления, и сейчас я не представляю, как можно писать что-то больше 30 строк на ванильном js, без типов и классов. Это ж придётся запоминать синтаксис jQuery, Express и Angular.

Просто статья плохая. Посмотрите примеры из оф. документации, они нагляднее.


Условно, можно разделить профит на 2 части:
1) Синтаксис. Typescript — это синтаксис из самых свежих спецификаций es (классы, декораторы, деструктуризация) + немного своего сахара (енумы, пространства имён). Профит очевиден: меньше кода с тем же результатом.
2) Собственно система типов. Это можно считать лишь некой дополнительной проверкой кода до его запуска. Потому что штуки, вроде интерфейсов или protected-полей существуют только на этапе компиляции ts в js.


При грамотном подходе к написанию кода профитом будут:
а) Хорошие подсказки кода;
б) Самодокументация кода. Очень часто достаточно просто посмотреть на сигнатуру метода в .d.ts-файлах, чтобы понять, чего в него нужно передавать. В случае с JS во-первых, нужно найти нужный метод или документацию для него, а это порой непросто, и во-вторых, понять, какие сигнатуры в конечном итоге приемлемы, потому что очень часто, когда разбор аргументов идёт в методе, всё становится не очень очевидно.
в) Отлавливание багов, связанных с типами ещё до запуска. Банальный пример: опечатка в имени поля. Код на TS просто не скомпилируется и этот баг всплывёт сразу. В проекте на js это может всплыть в самый неожиданный момент.

UFO just landed and posted this here
У вас спискок типов переменных на самом деле — список примитивных типов. И в примерах только примитивные типы используются (ну и один раз функция). А ведь вся соль дженериков и типизации проявляется, когда в качестве типа используется класс.
>По аналогии с C# знак вопроса после переменной означает, что её значение можно не передавать

в C# такого нет. Там есть синтаксис T?, раскрывающийся в Nullable, и означающий, что если Т — тип-значение, то переменная типа T? может принимать значение null. Но это не значит, что параметр этого типа можно не передавать в метод.
Безотносительно плюсов и минусов JS, некоторые из которых мне тоже показались спорными, просто скажу спасибо за хорошо оформленную статью и внятные примеры.
Это всё в лучшем виде есть в официальной документации
UFO just landed and posted this here

С Typescript развитие и эволюция кода (рефакторинг) становятся очень простыми и лёгкими — изменил сигнатуру функции, и исправляешь все использования просто глядя на диагностический вывод компилятора.
Очень часто бывает такое — пишешь какую-то сложную конструкцию, TS ругается. Пытаешься разбираться и понимаешь, что если бы он не ругнулся, то эту же ошибку ты бы уже получил в рантайме, причём в виде какого-нибудь "Cannot get property of null" или что-то такое.
Короче с TypeScript почти (до стабилизации strictNullChecks) работает уравнение Компилируется === Работает.

Sign up to leave a comment.