Комментарии 40
Такая статья в твит поместилась бы, мощно
Простите, я в TypeScript полный профан - так, пару раз чутка менял код в сервисах, написанных на нем.
В чем отличие Composite от:
interface Point {
x: number
y: number
}
type Point = {
x: number
y: number
};
Это предложение в стандарт ECMAScript, т.е. речь тут про JS, а не TS.
Касательно интерфейсов и типов, так это просто типизация. Composite - это самостоятельная структура
Ну что вы! Это же - TypeScript. Тут так нииизззя. Тут надо будет щас устроить войну по поводу того, что ещё пророк Тимофей Пиндрический завещал в Тайпскрипте использовать композиты, поэтому сейчас мир разделится на три лагеря:
Первые будут по нарокам Пиндрического пользовать композиты.
Вторые - будут использвоать типы.
Третьи (99% от всех пользователей) как делали {x: 1, y: 2} без определения типа, так и будут делать.
Для всего этого сейчас на Хабре понавыпускают статеек с объяснениями, а потом ещё сделают курс, на котором вас научат всё это как следует понимать. Пользоваться вы этим не будете, но сертификат получите.
После чего, спецификацию уберут через пару лет, потому что на Эльфоклингонском гораздо удобнее будет определять типы, посему писать будут что-то в стиле:
ℌ≒ ẍƶƖ ÿẓƷ
Тогда писать станет вообще проще и удобнее, и это не будет занимать столько-же времени.
Тот факт, что транспайлится это будет в одну и ту же многомегабайтную плащиницу кода, никого интересовать не будет. Ведь скорость-же!
Но предупрежения о том, что ты неправильно подумал использовать типы будут не только внедрятся тебе в мозг через нейролинки ещё до того, как ты напишешь эту ересь (причём эти предупреждения будут выдавать сотни тысяч строк кода, которые будут иметь достаточно мало отношения к реальному месту, в котором есть ошибка), но и будут внедрятся тебе во сны, чтобы ты даже в страшном бреду не думал использовать эти конструкции.
Так что всё в порядке. Там разберутся.
Не зря TypeScript был изобретён одной из самых бюрократических компаний в мире, которая достаточно мало думает о том, что что-то надо делать проще.
В чем отличие Composite от
Судя по написанному в пропозале, у него поведение при сравнивании как у сишной структуры: по полям. За счёт этого их можно использовать как ключи в мапах и включать во множества без фактических дубликатов.
По факту шорт-кат от создания дата-класса вида:
class Test {
constructor(
readonly x: number,
readonly y: number
) {}
}
В целом - неплохо, не такой и редкий кейс. Главное оставить ещё возможность задания значений не только по порядку, но и объектом.
так предусмотрено же не по порядку https://youtu.be/hFenspfGLTk?si=1kXYCTgpxGldKTyR&t=410
Мне кажется, что это расшерение возможностей Object.create().
Лучше бы js на ts заменили в браузере
Вы нормальный человек вообще? А давайте С заменим на TypeScript? Вы понимаете что TypeScript это вообще не язык программирования даже, это по сути система типов поверх джаваскрипта, которая ничего нового вообще не привносит кроме дико накрученного культа типов, когда люди начинают создавать абсолютно шизофренически сложные вещи, потому что они не умеют сделать просто - и некоторые люди, например я, считают, что типам вообще не место в коде - они все могут быть вытащены в headers; посудите сами - даже в C++ есть auto, в Java есть var - все это указывает на то, что при вызове функции, вы получаете в ответ не просто значение, а значение с типом. А то, что вы указываете типы в функции типа
function(a: string, b: number) {}
это вообще не enterprise-grade, вы написали ничем незадокументированную функцию - ах ну да, давайте ее задокументируем
/**
* @param a - the name
* @param b - the number
*/
function(a: string, b: number) {}
И чем же это отличается от стандартного JavaScript:
/**
* @param a {string} - the name
* @param b {number} - the number
*/
function(a, b) {}
Да ничем, кроме того, что JavaScript программисты обладают дисциплиной писать документацию. Вы понимаете что JS - это не язык, а виртуальная машина? Можно придумать хоть 100 языков, которые будут компилироваться в JavaScript, потому что универсальный, простой, красивый язык. А Microsoft, с ее политикой Embrace, Extend, Extinguish, тупо захватила рынок веб-дева, промыло всем мозги, создало базу TypeScript-шовинистов, которые думают, что пипец какие умные, потому что они используют строгую типизацию.
Поймите же вы - типизации можно добиться и без TypeScript, с тем же JSDoc и Closure Compiler. Но нет, здравый смысл и инженерный подход к разработке ПО был полностью истреблен, как видно по комменту выше. Как я ненавижу TypeScript и Microsoft за то что они сделали со сценой веб-дева.
Всё верно говорите. Но потом у вас проект тысяч на сто строк и 6 лет разработки двумя командами по 5 человек. И тут вы решаете сделать рефакторинг. И радуетесь тому что сделали верный выбор и типизация у вас есть.
«100 тысяч строк на скриптах» как-то не вяжется с «верным выбором».
Я люблю этот язык (ES) и пишу на нём весь UI (разумеется, когда нельзя достичь желаемого на pure CSS, а это не так уж часто). Ещё на нём удобно делать glue для низкоуровневых библиотек, плагины для препроцессоров и макросы для Фотошопа. Но если бы мне пришлось писать на нём бизнес-логику и другие вещи на сотни тысяч строк, я бы сильно огорчился.
тупо захватила рынок веб-дева
В том-то и дело, что ни фига. Вот и пытаются зайти через TS.
Вы понимаете что JS - это не язык, а виртуальная машина?

JavaScript - это динамически-типизированная виртуальная машина. Вы можете придумать любой язык, который будет под нее компилироваться. TypeScript - один из тех языков. Вам нужны типы для того, чтобы чувствовать себя комфортно при написании кода, чтобы был autocomplete, потому что кроме статического анализа, еще есть тесты, которые должны покрывать ваш продукт. Но это вопрос не языка - а тулзов - компилятора и IDE. TypeScript это лишь один вариант - как я уже и сказал, есть такая вещь как Google Closure Compiler, который тоже поддерживает типы, через обычный JSDoc. Считай, JavaScript - это ассемблер для браузера. Конечно, можно на чистом писать, но обычно люди упрощают себе жизнь. Но TypeScript - это не единственный вариант, и говорить, что он должен заменить JS в браузере это пипец какое невежество.
Так а я разве спорю? Именно виртуальная машина. И именно динамически типизированная. Поэтому делать статически типизированный язык под динамически типизированную ВМ это как получать солнечные лучи из огурцов.
Об этом и была картинка. (На самом деле, это кадр из видео).
даже в C++ есть auto
Не в описании параметров функций. Зато в описании параметров есть const, классная штука, очень хотелось-бы и в тайп-скрипт ее :)
Да ничем, кроме того, что JavaScript программисты обладают дисциплиной писать документацию.
Бгг, ну зачем-же так врать-то? :) Если Вам так сильно ненавистны типы в описании параметров функций, то и в документации к этим функциям вы их тоже писать не будете, инфа 100%.
Вы понимаете что JS - это не язык, а виртуальная машина?
Простите, но у вас каша в голове. :) Кстати, а Си это тоже виртуальная машина? А то на заре юности я видел, компилятор С++ который компилировал код в голый си, а потом уже в машинные коды.
JavaScript это язык. V8 - виртуальная машина исполняющая код написанный на JavaScript. Точно так-же как, например, Java байткод это язык, который выполняется виртуальной машиной Java. Единственная разница это то, что Java компилируется в этот промежуточный байт-код, что дает возможности более легко вносить изменения в сам язык Java, а в случае с JS он сам и выступает в роли такого байткода для виртуальной машины. И вы правы в том, что JS просто так трогать нельзя, все изменения должны быть осторожными, иначе поломают всю экосистему.
Мне не ненавистны типы, мне ненавистны типы в коде. Они все должны быть в headers. Во всех инженерных дисциплинах уже давно используется model-driven парадигма. Создание модели и ее реализация должны быть полностью разделены.
Усли у вас есть модель, вы хоть на каком языке можете все переписать, а структура останется. А типы идут из структуры - интерфейсов и тп, то бишь дизайна. Кроме V8 есть другие виртуальные машины, и байт-код у них разный, но все работают под спеку JS, делая его языком этой виртуальной машины, или сокращенно, ею же. Это называется абстракция.
Для меня, язык программирования - это совокупность систем типа Java, где подсистемы типов, API, контроля исполнения (вроде потоков), анализатора исходного кода, компилятора, экосистемы и вычисления работают вместе. Короче ЯП - это полноценный продукт, мета-фреймворк. Когда тебя спрашивают, на каком языке ты пишешь - это значит, какой вендор тебе поставляет тулзу, с помощь которых ты создаешь программы. Примеры таких продуктов - Java, Python, Go, а главное ActionScript 3 - когда Adobe сделала компилятор, выпустила Flash Builder IDE, написана кучу профессиональных API для связи с Java на бекенде и бинарной сериализации типа AFMа - а потом это все просто в один день похерили, оставив всех веб-инженеров на произвол судьбы.
JavaScript же это просто скриптовой язык к виртуалке. У него нету API кроме браузерного, который контролируют сами вендоры, в нем нету такого же утонченного способа создавать event-loopы, как например в Python. На нем не пишут программы - на нем пишут скрипты. Если же вы делаете что-то, у чего все то, что перечислено в параграфе выше - это может стать ЯП, однако если это делает "сообщество", как сейчас, то это совершенно нелегитимно потому что каждый городит кто во что горазд - и те люди, которые оказались "у руля" после внезапной смерти флеша, пытаются выставить себя авторами современного джаваскрипта как языка программирования.

На примере выше - один из таких людей, говорит, что eslint не должен быть установлен глобально. То есть в каждый свой проект я должен тащить миллион зависимостей в 600 мб, чтобы поставить линтер, хотя я бы просто мог сделать это 1 раз. Но этот человек очень сильно убежден, что в "комьюнити", которое он почему-то представляет, нельзя так делать и я должен делать так, как решил он и его друзьяшки. Короче эти типы настолько попутали берега, что почему-то решили, что JavaScript (trademark Oracle кстати) - это их ЯП. И хотя MS изобрела свой язык, она зачем-то говорит, что это улучшенный JavaScript, тем самым создавая образ того, что JavaScript (trademark Oracle кстати) дефективен, и плодя полчаща TypeScript фанатиков, которые постоянно гонят на JS.
Окей, вы сделали продукт, написали компилятор. Оставьте других людей в покое, кто может быть просто хочет использовать JSDoc и другой компилятор (я уже 5ый раз говорю про Google Closure Compiler) без типовой ереси вроде

Пусть они в своем комьюнити придумают свой язык и назовут его как хотят, но Языки Программирования для широкой аудитории - это тяжелая работа серьезных компаний - только тогда это будет язык программирования. По сути же, сейчас все эти люди незаконно используют JavaScript трейдмарк в целях своего тщеславия.
Как продукта, который можно скачать, в отличие от Java, JavaScript'а не существует - можно скачать jsc и это будет вирутальной машиной, или браузер, в котором будет V8 - и написать к ним скрипты на JavaScript, но в моем понимании, это не ЯП. Короче мой тезис, что нам нужно четко провести грань между языками и системами программирования, чтобы не путаться в номенклатуре, и чтобы всякие "комьюнити" а также корпорации не хамели и не стягивали все одеяло на себя.
И да, у систем написанных на C может быть runtime, и это может быть мини-виртуальной машиной. В чем вопрос?
То есть var point = Object.freeze({a:1,b:2})
не дано сделать? Блин всей этой массе больных шизофреников без инженерного образования из всяких Babel'ов, которые сидят на T39 реально нечего делать, и они из года в год придумывают какие-то вещи, которые вообще кроме таких же как они никому не нужны. Мы закончили разработку языка JavaScript еще в 2017 с приходом async/await - с тех пор больше ничего не надо. Но нет, ни у кого нет мозгов сделать что-то реально полезное типа AOP и они пилят вот такие вещи... И главное нет бы сделать что-то реально крутое типа try abc()
- ну то есть вообще без catch'a, нет блин, давайте сидеть на конференциях 5 лет обсуждать новый бред
Там ведь главное не immutable, а возможность сравнения ключей в Map и Set.
Тоже так себе. Нужно неизменяемость и отсутствие прототипа. Просто объект или кортеж. Без магии. И чтобы ошибка валилась)
Пошел почитал спеку - непонятно почему ТС не мог в 2х словах объяснить, что это было сделано для сравнения объектов в сетах. За что купил - за то продал. Короче это просто чтобы не писать
function setHas(set, a) {
for(var b of set) {
// compare a to b
if(compareValues(a, b)) return true
}
}
function compareValues(a, b) {
for (var key in a) {
if (a[key] !== b[key]) return false
}
return true
}
Тогда зачем делать эти компараторы, вместо того, чтобы в классы добавить служебный метод __compare
(как constructor
) для имплементации, который бы вызывался автоматом когда делаешь == на объектах одинакового класса, или в случаях с .has. Вообще как в Питоне нужно сделать, чтобы классы могли сами решать как выполнять операции типа ++ на них - вот это было бы круто.
Декоратор в таком виде не повесишь, а вот в предложенном - да. Для декларативного кода это затеяно.
Хочу подметить, что кейс с try func()
вполне юзабелен, потому что в хорошо написанной функции, скорее всего, предусмотренны свои throw
там, где это действительно надо.
Так же возможно присваивание с данной конструкцией, например, try obj = func(a, b)
, при ошибки присваивание просто пропускает данное выражение, а obj = try func(a, b)
в таком случае присвоит переменной значение null
чего бы нам не хотелось. Можно придумать ещё много примеров фактического применения, но пока что остановимся.
В заключении хочу сказать, что на мой личный взгляд такая структура могла бы заменить громосткий try { ... } catch { ... } finally { ... }
возможно не везде, но в некоторых кейсах. В общем, считайте это как синтаксический сахар, ибо нужен он для удобочитаемости.
очень-очень часто я пишу
try {
var content=readFile() // файла может не быть
}catch(e){
var content=''
} // бесполезный блок
Почему нельзя сделать красиво -
var content = try readFile() || ''
Непонятно. Вернее понятно - потому что есть программисты, вообще ничего не соображают в красоте, лаконичности и простоте (по сути, двуногие гоминиды с нейронкой во лбу) а есть инженеры, которых всех вытеснили подчистую из разговора, через slave source movement.
Примерно год назад ушел от const и let к var, использую let только когда реально нужно - например, когда создается scope при итерации (так как var перезаписывается):
for(let el of document.querySelectorAll()) {
el.onclick=()=>{ console.log(el) }
}
Язык - это просто язык, это интерфейс к системе. Отличие прогрера от инженера в том, что прогер пишет код, а инженер кодирует систему. Хорошо, пусть они добавляют синтаксический сахар, но это ничего общего с профессиональной разработкой информационных систем вообще не имеет. Хочу чтобы они оставили JavaScript в покое, заморозили его просто, и придумали свой язык, который бы в него компилировался. К тому же - JavaScript, это трейдмарк Оракл.
Когда MS только начиналась, они специализировались на dev-тулах, а теперь, когда они огромный монополист, они диктуют свои понятия через культ, не просто не давая маленьким dev-студиям шанс на жизнь, а просто искоренив вообще такое понятие как профессиональная разработка тулзов для своей же индустрии за деньги.

Видите, можно очень много придумать фактически реально полезных примеров - а что сделали они (ТС39 на поводке у MS) - убрали обязательный err из catch(err), на что у них ушло лет 5 обсуждений, и остановились на этом. Чтобы прийти к чему-то реально вкусному, у них еще 10 лет бюрократии уйдет, если вообще они додумаются, что очень маловероятно (см мем выше).
Обычно такие proposals отвергаются из-за неопределённости: что возвращать в случае throw - Error, null, '', или что-то ещё.
в любом случае, для себя можно написать обвёртку типа
let try_func = () => { try { return func() } catch (e) { return 'fuck you TypeScript' } }
Мужики, композиция в ООП есть.
Похоже это способ вынести иммутабельные структуры из недр v8, наружу, чтобы у разработчика появился инструмент облегчть жизнь движку
Просто синтаксический сахар? Или в чём польза?
хотелось бы чтобы побольше статей были такими же короткими и информативными
Arrays, objects… теперь ‘composites’?