Что думаете на счёт TypeScript?
Мне нравится JS и меня несколько смущает его младший братец TS. Не понимаю зачем нужна та избыточная функциональность, которая делает код сложнее и менее читабельным.
Будущее за TS? Что думаете на этот счёт?) |
Цитата:
|
Маленькие проекты еще можно на js писать, но средние проекты я бы реализовывал на ts. Что собственно и делаю.
|
webgraph, пока не попробуешь по-серьёзному - не поймёшь(по себе сужу), напиши на нём какой-нить проект и все вопросы отпадут.)
В интернете много всякого бла-бла-бла, но на самом деле реальных преимущества два и они ультимативны: 1. Подсказки IDE становится максимально чёткими и удобными. 2. Ты не сможешь сделать мелких тупых ошибок типа опечаток, передачи объекта вместо строки и т.п. Эти два пункта ускоряют разработку на 90%, при потерях на типизацию менее 10%. :) |
Ну с опечатками так.
Не помню, что бы когда либо передавал объект вместо строки. Может я уникум, но ошибки типизации у меня крайне редки. Не припомню, когда делал. Серьезно на TS особо ничего не делал. Так, робкие попытки. Но сразу задолбался с типизацией при работе с DOM. И бросил. |
Цитата:
|
Цитата:
Есть какие-то другие аргументы? |
Цитата:
|
Цитата:
Плюс тот факт, что по итогу код TS компилируется в JS — это вообще как-то даже странно. |
Цитата:
|
Цитата:
|
Цитата:
Начинают писать... Делают кучу опечаток... Передают аргументы абы как... Потом не могут все это поправить. Тут как бы еще с размерами проектов определиться - маленький - средний - большой Как измерять? :D Например 10 человек разрабатывали что-то 1 год... Это какой размер? |
Цитата:
Особенно это помогает при работе с внешними данными: отпадает нужда каждый раз смотреть в консоли набор каких данных вернул сервер. |
webgraph,
TypeScript - продукт Microsoft. Подсказки IDE - это Language Server Protocol - продукт Microsoft. Сама IDE - это Visual Studio Code - продукт Microsoft. Без LSP и VS Code не было бы такой популярности у TS. Всё это результат монополии Microsoft, когда много денег и можно всё купить. Например, купить GitHub и остановить разработку Atom, конкурента VS Code. |
Цитата:
|
Цитата:
|
Хотя есть некоторые вещи, которые TS помогает отследить.
Например, простой код на js const anchor = document.querySelector ('.class'); const href = anchor.href Вроде все просто. Но ts сразу начнет возражать, что anchor может быть null. И волей неволей либо поставишь проверку, либо поклянешься, что null тут не будет. Либо поставишь проверку, что это должен быть элемент <a>, либо убедишь ts (приведением типа), что это обязан быть элемент <a> |
Цитата:
|
Цитата:
Ну еще есть мнение, что люди приходили в js с других языков, типа C, Java и прочих со строгой типизацией. И их оторопь брала, как это можно без типов? Срочно подайте типы, мы без них не умеем. |
Цитата:
Говнокодить можно на чем угодно. |
Цитата:
С помощью ts можно реализовать валидацию ключей (+ autocomplete) для доступа к данным объекта в dot-notation: пример. Это и + к удобству работы, и от ошибок отгородит. |
Цитата:
Я в своё время тоже возмущался и "не понимал", пока не взялся за реальный проект, так что и тебе никакие разумные доводы не помогут кроме дела. Прирост в скорости в два раза, в полёте мысли без отвлечений и загрузки в память мусора не имеющего отношения к контексту проблемы - это всё для тебя пустой звук пока не познаешь на себе. |
Ранее любой школьник мог величать себя веб-мастером, потом веб-разработчиком...
Сейчас все усложняется, повышается "порог вхождения" в профессию. Как следствие - отсеиваются "слабые". :) Сделать простенькую страничку на основе готовых шаблонов могли многие... Добавили Реакт (и пр.). Подвесили "тесты", да еще и разного "уровня". Кому показалось мало - добавили TS. Пока тенденции только к повышению "порога". Кто осилит - молодец. Главное чтобы работодатель все это оплачивал. А "на чем" и "как" не особо важно... |
Цитата:
Наоборот я за развитие и изучение нового. Тот же JS постоянно открывает для меня новые грани вместе с ростом моих потребностей в решении поставленных задач. "Прирост в скорости в 2 раза?" Скорости чего? Покажите реальные тесты, бенчмарки. "загрузки в память мусора" — какого ещё мусора? |
Цитата:
По мне так TypeScript — это тот же jQuery или какой-то React, а не прям отдельный язык программирования. |
webgraph, скорости с которой я пишу код.
Мусора - знаний о всех структурах, схемах и потоках данных в не релевантных частях большого приложения. Тебе не надо разбирать что-то кроме куска кода с которым ты работаешь, когда TS следит за входящими и исходящими данными за тебя. Агрессия - с другого сайта, лень переключать формы этикета, и так сойдёт.) Цитата:
Если ты топишь за ванилу, потому что главное - это скорость работы программы, а всё остальное презренно и ничтожно - пиши на ассеблере и не приставай к адекватным людям. Может быть даже закончишь за свою жизнь один какой-нибудь суперскоростной микропроект. |
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
Правда пока мы не определились чем измерять величину создаваемого ПО... Т.ч. вполне возможно у нас просто маленькие ПО. |
ksa, про порог вхождения - очень спорно. Сейчас собеседую чуваков, большинство сразу с ts начинали и без ts теряются.)
|
Aetae, тут уже мне не понятно...
Одно дело когда нужно что-то писать (TS) и писать что-то правильно, а не абы что. И когда вообще ничего не писать. Второе однозначно проще. Или к тебе приходят абсолютные эксперты по TS, без которого они уже ничего не могут сделать? Просто ко мне приходят те, кто и JS-то может совсем не знать... А уж TS и подавно... |
ksa, фишка в том что ts более строг, меньше свободы - проще в голову уложить. Само собой они не шарят за крутые фичи тюринг-полного ts.
Даёшь им банальный пример, типа: class Some { constructor(text) { this.text = text; } //... } Они такие "Ачё всмысле, что это за this.text, отуда он взялся и что делает?...". Всё потому что привкли, что рандомную хрень в класс писать низя, должно быть чётко: class Some { public text?: string; constructor(text: string) { this.text = text; } //... } =) |
Цитата:
Если еще и TS-у учить до приемлемого уровня - еще время уйдет. Текста писать больше придется... Отсюда упадет скорость "выдачи" программного продукта... А его требуют достаточно много, при небольшом коллективе программистов. Т.е. мы так не созрели для "поднятия планки" в разработке. :cray: Там же ведь еще и тестирование "в спину дышит"! А на него еще такой же коллектив нужен, а то и покруче... :) |
Субъективно: когда пишешь на ts, ощущение будто катишься по рельсам, но эти рельсы надо прокладывать (определять типы). А js - как раздолбанная проселочная дорога, и постоянно непонятно, что за объекты у тебя на руках и как с ними работать.
Прикол в том, что несмотря на дополнительный код, в продвинутой IDE (вебшторм или вс-код) это не проблема, потому что автокомплит позволяет очень быстро писать типы, кроме совсем хитрых кейсов, где надо прям подумать, и намного лучше работает при описании логики. Автокомплит js там тоже неплох, но только если мы напрямую используем какие-то объекты, созданные прямо здесь же, или заимпортированные. Ну или классы. Любая разновидность инъекции (даже просто параметры функций) разваливает автокомплит в хлам. Так же сила ts проявляется при рефакторинге, или просто каких-то изменениях. Когда поменяешь что-то там и сям, контроль типов очень помогает найти забытые куски кода. В общем, плюсов много, использовать рекомендую. |
Цитата:
По аналитике можно сделать вывод, что TS — это исключительно статическая типизация. У меня есть сильное чувство, что её просто скоро завезут в JS. Ибо он всё более и более низкоуровневым становится. И причём можно будет как указывать тип, так и нет (наподобие как в PHP). По мне так даже лучше, когда у тебя есть выбор. Сначала просто накидать код, чтоб быстрее реализовать результат. А потом можно и типы проработать. В общем, кто как хочет и кому как удобнее. А где вообще можно отслеживать предлагаемые нововведения в JS? Голосовать там или даже предлагать?) |
Цитата:
{ "status": "ok", "message-type": "work", "message-version": "1.0.0", "message": { "indexed": { "date-parts": [[2022, 12, 26]], "date-time": "2022-12-26T14:49:48Z", "timestamp": 1672066188725 }, "reference-count": 5, "publisher": "Keldysh Institute of Applied Mathematics", "issue": "82", "content-domain": { "domain": [], "crossmark-restriction": false }, "short-container-title": ["KIAM Prepr."], "published-print": { "date-parts": [[2017]] }, "DOI": "10.20948/prepr-2017-82", "type": "journal-article", "created": { "date-parts": [[2017, 9, 15]], "date-time": "2017-09-15T10:21:58Z", "timestamp": 1505470918000 }, "page": "1-14", "source": "Crossref", "is-referenced-by-count": 4, "title": ["Updated revision date for reference to alive publication"], "prefix": "10.20948", "author": [ { "ORCID": "http://orcid.org/0000-0002-7044-8287", "authenticated-orcid": false, "given": "Mikhail Mikhailovich", "family": "Gorbunov-Possadov", "sequence": "first", "affiliation": [ { "name": "Keldysh Institute of Applied Mathematics" } ] }, { "ORCID": "http://orcid.org/0000-0001-7372-3574", "authenticated-orcid": false, "given": "Rimma Yuryevna", "family": "Skornyakova", "sequence": "additional", "affiliation": [ { "name": "Keldysh Institute of Applied Mathematics" } ] } ], "member": "8521", "published-online": { "date-parts": [[2017]] }, "reference": [ { "key": "1", "unstructured": "\u0413\u043e\u0440\u0431\u0443\u043d\u043e\u0432-\u041f\u043e\u0441\u0430\u0434\u043e\u0432 \u041c.\u041c. \u0416\u0438\u0432\u0430\u044f \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f // \u041e\u0442\u043a\u0440\u044b\u0442\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u2014 2011, \u2116 4. \u2014 \u0421. 48\u201349. \u2014 URL: http://keldysh.ru/gorbunov/live.htm" }, { "key": "2", "doi-asserted-by": "publisher", "unstructured": "\u0413\u043e\u0440\u0431\u0443\u043d\u043e\u0432-\u041f\u043e\u0441\u0430\u0434\u043e\u0432 \u041c.\u041c. \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043a\u0430\u043a \u043e\u0431\u044f\u0437\u0430\u043d\u043d\u043e\u0441\u0442\u044c \u0443\u0447\u0435\u043d\u043e\u0433\u043e \u2014 [\u0431.\u2009\u043c.]: \u0418\u0437\u0434\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f, 2017. \u2014 64 \u0441. \u2014 doi:10.20948/ridero-2017-gorbunov \u2014 ISBN 978-5-4483-7792-1", "DOI": "10.20948/ridero-2017-gorbunov" }, { "key": "3", "unstructured": "\u0416\u0438\u0432\u0430\u044f \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f: \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u2014 URL: http://alive.keldysh.ru" }, { "key": "4", "unstructured": "Dublin Core Metadata Initiative. \u2014 URL: http://dublincore.org/" }, { "key": "5", "unstructured": "\u0410\u0432\u0442\u043e\u0440\u0443 \u043f\u0440\u0435\u043f\u0440\u0438\u043d\u0442\u0430 \u0418\u041f\u041c \u0438\u043c.\u041c.\u0412.\u041a\u0435\u043b\u0434\u044b\u0448\u0430 \u2014 URL: http://keldysh.ru/preprints/" } ], "container-title": ["Keldysh Institute Preprints"], "original-title": [ "\u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c\u0430\u044f \u0434\u0430\u0442\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0440\u0435\u0434\u0430\u043a\u0446\u0438\u0438 \u0432 \u0441\u0441\u044b\u043b\u043a\u0435 \u043d\u0430 \u0436\u0438\u0432\u0443\u044e \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044e" ], "deposited": { "date-parts": [[2020, 1, 16]], "date-time": "2020-01-16T09:06:58Z", "timestamp": 1579165618000 }, "score": 1, "resource": { "primary": { "URL": "http://keldysh.ru/papers/2017/prep2017_82.pdf" } }, "subtitle": [], "short-title": [], "issued": { "date-parts": [[2017]] }, "references-count": 5, "journal-issue": { "issue": "82", "published-online": { "date-parts": [[2017]] }, "published-print": { "date-parts": [[2017]] } }, "URL": "http://dx.doi.org/10.20948/prepr-2017-82", "relation": {}, "ISSN": ["2071-2898", "2071-2901"], "issn-type": [ { "value": "2071-2898", "type": "print" }, { "value": "2071-2901", "type": "electronic" } ], "subject": ["General Medicine"], "published": { "date-parts": [[2017]] } } } В котором, меня интересует лишь пара полей. Сколько времени уйдет на точное описание на ts такого объекта (И знать бы еще, что другие поля означают) И как описание объекта поможет, если вдруг в api что то поменяют? Например, добавят какие то поля? |
Цитата:
Одно из преимуществ - отсутствие этапа компиляции. В небольших проектах, по мне, он нафиг не нужен. Код передается браузеру как есть. Может быть спокойно минификирован. Например, кусок кода с JSDOC /** * @typedef BiblioElemNum * @type {{ * [id:string]:{ * elem:HTMLElement, * num:number, * cites:HTMLAnchorElement[], * } * }} */ /** * @type {?BiblioElemNum} */ let biblioids = null; /** * @param {HTMLElement} elem */ const insertBiblioBut = (elem) => { elem.style.position = 'relative'; const biblbut = /** @type {DocumentFragment} */ (bibliobut.cloneNode(true)); $data( /**@type {HTMLElement}*/ ($di(biblbut, 'p-biblio-but')), 'p-biblio-id', elem.id ); elem.append(biblbut); }; /** * @param {HTMLElement} cont - контейнер с элементов библиографии * @returns {BiblioElemNum} */ const findBiblios = (cont) => { $data(cont, 'p-biblio-cont', ''); return /**@type {HTMLElement[]} */ (Array.from(cont.children)).reduce( (a, e, i) => { if (e.id) a[e.id] = { elem: e, num: i + 1, cites: [...getCitesById(e.id)], }; if (a[e.id].cites.length) insertBiblioBut(e); else console.warn( `Нет отсылок на элемент библиографии ${a[e.id].num} с id="${ e.id }"` ); return a; }, /**@type BiblioElemNum*/ ({}) ); }; /** * @param {string} id - id элемента библиографии * @returns {NodeListOf<HTMLAnchorElement>} */ const getCitesById = (id) => { return /**@type {NodeListOf<HTMLAnchorElement>} */ ( $a(`a.${crefbiblio}[href="#${id}"]`) ); }; |
Цитата:
Но на практике в более-менее приличном проекте интерфейсы сервера генерируются на лету и из swagger модели автоматически соответствующими тулзами. По поводу jsdoc - нахрен не нужен в современном вебе. Гораздо более неудобная херня, чем TS при том же смысле. Сейчас без сборки на фронте практические ничего не делается всё равно, чтоб имело смысл с ним возиться. Цитата:
|
Цитата:
"\u0413\u043e\u0440\u0431\u0443\...." Цитата:
|
Часовой пояс GMT +3, время: 09:13. |