-
Notifications
You must be signed in to change notification settings - Fork 13
Отказаться от интерфейсов? #150
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
интерфейс это связка имени и типа, а тип - просто тип. Без интерфейсов у тебя ошибки компилятора превратятся в огромные нечитаемые куски текста, т.к. там где были просто имена интерфейсов будет полное описание типа |
я тоже не понял о чем Серега, можно пруфы? |
я про это https://www.typescriptlang.org/docs/handbook/advanced-types.html#interfaces-vs-type-aliases |
ну тут надо подумать/поизучать, но я оставил, чтобы это не забылось |
по мне так можно оставить как есть (юзать |
Я в целом за то, чтобы убрать префиксы — ни |
Я за то, чтобы оставить всё как есть и категорически против того что бы префикс убирать. Префикс помогает визуально отличать объекты от необъектов, это полезно. А правило простое: префикс I - для типов которые объявлены через interface и для пересечения нескольких интерфейсов, для всех остальных - без префикса. Union интерфейсов это не интерфейс и соотвественно тоже не должен иметь префикса |
на хаскеле? |
вопрос: почему плохо/не стоит писать все на типах? пока все что я видел - это мессадж @sk1e про ошибки, но там без пруфов и надо чекать |
пруфы я привёл, но видимо документация неактуальна Я бы оставил интерфейсы из-за правила линтера которое заставляет добавлять префикс. Мне удобно видеть когда у тебя на входе объект и когда необъект. Это полезная, дополнительная информация |
Не, на TS. Но на Хаскеле кстати тоже. Зачем тебе именно по имени определять, что внутри за типом скрыто? Ну когда нужно, провалишься в него по ctrl+клик, тебе все равно придется это делать, если ты хочешь посмотреть что там в объекте |
А так получается, что небольшая потребнсть, которая возникает время от времени, заставляет тебя писать по-особенному всё время вообще, со всеми интерфейсами во всех модулях |
Просто с этим префиксом не всё однозначно. Не понятно где нужно его применять, а где нет, и соответственно правило линтера нихера по сути не линтит, потому что как считает сам же Серега, пересечение двух интерфейсов нужно помечать префиксом
И вот с этим заявление я категорически не согласен. |
так я могу визуально, без всяких кликов определить. Когда я захочу посмотреть что там внутри это уже другой случай. Иногда удобно просто понять что это объект |
Это множество интерфейсов) |
что в свою очередь тоже является интерфейсом |
но нет же, как и множество чисел не является числом |
Не понимаю в чем удобство :) |
Получаешь больше информации, без всяких кликов и переходов |
Мне кажется это какое-то фантомное удобство. Я например эти префиксы вообще не замечаю, мозг их просто фильтрует, для него это информационный мусор. На некоторых проектах пробовал писать без этих префиксов и никакого дискомфорта не ощутил. |
Почему? в итоге то конечным значением будет число. Не понимаю твою логику :) |
тут мне кажется в обратную строну должно работать. Типа нельзя сказать, что число это какое-то множество чисел (если мы говорим об ограниченном множестве), а вот любое множество чисел в итоге является числом. Как минимум если мы рассуждаем в разрезе типа и значения какой-то переменной, не углубляясь в философию :) |
Я короче допустил ошибку в рассуждениях. Множество и элемент множества, конечно разные вещи, но union не создаёт множество значений а добавляет в него. Тогда, действительно, тип union'а интерфейсов так же сам есть интерфейс |
Надо чётко тогда понимать, как часто тебе
Потому что ни мне, ни Диме особо потребности и удобства в этом нет :) Я боюсь, что для относительно редкого кейса мы вынуждены менять кодстайл, который аффектит на нас всех еще и 100% времени работы с кодом |
ок, в принципе наверно можно всё же обойтись без префиксов |
тогда действительно можно отказаться от интерфейсов. Но там есть всё же некоторые различия microsoft/TypeScript#7029 microsoft/TypeScript#28174, нужно проанализировать как они могут повлиять |
Я поддерживаю @sk1e, не знаю насчет пруфов, но у меня в голове довольно четко разделены объекты через интерфейсы и unions & type aliases, не понимаю зачем это все мешать в одно определение type Если я вижу IEntity, то я понимаю что это объект, если я вижу Entity, то понимаю что за ним скрыто множество сущностей, типа 'man' | 'woman' | 'car' | 'cat', или допустим я хочу подчеркнуть/сделать более понятным что этот string есть LoaderName |
поддерживаю, не нужно кликать и переходить внутрь, меньше телодвижений за счет префикса который написан единожды, а работать с интерфейсом я буду кучу раз, либо я один раз помечаю либо постоянно скачу посредством cmd + click |
на мой взгляд, это разделение ты сам придумал, потому что по факту его нет ни в языке как таковом, ни в коде, который мы пишем, потому что мы можем запросто какие-нибудь интерсекшны и юнионы интерфейсов писать
во-первых, это просто-напросто не всегда так, (см. выше), во-вторых, это связано с именем всего лишь, т.е. с наличием префикса, в-третьих, в чем от этого профит? конкретно
я вообще не понял, причем тут типы и интерфейсы) |
профит такой же как и от разной схемы именования для переменных, функций и их разных подмножеств, типов, ts классов, scss классов и переменных: ты получаешь информацию о сущности из имени без инспекции её сигнатуры и тем более места её объявления |
почему при именовании переменных, функций и их разных подмножеств, типов, ts классов, scss классов и переменных, мы не пишем никакие префиксы для этого, а здесь вдруг это стало необходимым? и в честь чего это вдруг связано с тем, как именно тип объявлен? даже если бы нам действительно этот префикс нужен бы был (а он не нужен, ящитаю, потому что при именовании переменных, функций и их разных подмножеств, типов, ts классов, scss классов и переменных мы никакие префиксы не пишем и как-то прекрасно живем), это никак не обязано быть связанным с тем, как мы объявляем тип: через интерфейс или через тайп |
префикс, кейс, грамматика - какая разница? Это всё разные способы кодирования информации в имя.
это связано косвенно. Префикс показывает не способ объявления типа, а возможное множество его значений. Он не показывает что тип через interface объявлен |
Скоро все будем юзать префикс # для приватных полей класса и кайфовать от обилия информации зашитой в имя переменных 😂 https://github.com/tc39/proposal-class-fields#private-fields |
ну так ишью про способ объявления типа, а не про префиксы, просто Макс написал так, как будто если мы добавляем префикс какой-то, например
ну как бы да, факт, но я не понял, как это на мой вопрос отвечает, + это, как я уже выше писал, следующий этап обсуждения - нужны ли префиксы или нет, чтобы до него дойти, надо сначала решить, нужны ли интерфейсы |
капэц, больше костылей богу костылей |
Обсуждали именно префиксы. Твой ишью тут давно уже не обсуждают. Сорян( |
|
Насчет этого разделения, откуда оно взялось? откуда ты впринципе какое-то можешь сформировать о используемой технологии? все из документации и конвенциях на уровне языка/технологии, так вот, здесь когда речь идет о шейпе объекта и о контрактах, в доке тайпскрипта используется именно interface, когда речь идет о type aliases используется type |
мне вообще это кажется каким-то приплетением солида не совсем к месту, если честно, во-первых во-вторых,
я не вижу особо преград перед тем, чтобы свою конвенцию ввести, почему мы должны какой-то конвенции слепо следовать, если мы, например, считаем ее плохой
опять же, я не понимаю почему для нас в данном случае ориентир - это дока тайпскрипта (вообще к слову говоря, я лично к доке этой не очень положительно отношусь), а не наше удобство я конкретную существующую проблему на мой взгляд обозначил, и мне кажется что надо конкретно по существу по ней говорить, выдвигать какие-то аргументы повесомее, чем "в доке так написано", притом что в доке аргументация донная абсолютно, на мой взгляд |
Как это всё напоминает https://en.wikipedia.org/wiki/Hungarian_notation :) |
Во, нужно завести ишу на эту тему, нужно внедрять, круто же когда в имя переменной вшит ее тип, требую больше информационного шума в коде! 😂 |
рандомно наткнулся на ишью
больше неактуальны начиная с версии ts 2.1 и интерфес и тип алаяс показывают ошибку как
к слову можно делать |
Я ща все типы что вижу переписываю на/новые пишу через type, проблем пока никаких не заметил, даже приятнее что не надо эту I добавлять. @sk1e ты можешь попробовать это делать на текущем проекте, потом отпишешься :) |
Попробовал, думаю можно отказываться от интерфейсов и от префикса |
@Znack, @in19farkt, @chmnkh все, объявляем победу type и фиксируем где-то или как? |
задачу делаем чтобы перевести все interface -> type? |
мне кажется переводить текущий код это так себе задача, можно и обойтись имхо)
а у нас вроде как нету раздела в ТС со стандартами, мб можно и начать оттуда |
Задачу отдельную на эту тему можно сделать, просто приоритет низкий поставить. |
ишью Сереги мне напомнили одну мысль, которую я вынашиваю
мы сейчас используем типы и интерфейсы, притом использование интерфейсов особо ничем не обосновано, мы не пишем интерфейс-интерфейс, а описываем просто тип чего-то, и в 95% случаев, когда мы их используем, они запросто заменяются типом без потери смысла/функционала
в то же время это кучу запутанного и всратого кода создает, типа
type IProps = ...
. сфига-ли там префиксI
, во-первых, и почему остальные пропсы написаны интерфейсами, а этот - типами (пс: потому чтоextends Interface {}
выглядит убого)иной раз вообще не понятно, когда то а когда то писать, потому что по большому счету мы пишем и там и там просто типы
я как вижу: интерфейсы нужны, если бы мы писали ооп, + во всяких мега-узких кейсах, когда нужен мержинг интерфейсов с одинаковыми именами и всякие такие вещи, во всем остальном - можно писать типы вообще везде, потому что ими можно делать юнионы и так далее, а интерфейсами - нет
опять же надо подумать как их писать: добавлять ли префикс
T
и прочеедискасс
The text was updated successfully, but these errors were encountered: