Отказаться от интерфейсов?
ишью Сереги мне напомнили одну мысль, которую я вынашиваю
мы сейчас используем типы и интерфейсы, притом использование интерфейсов особо ничем не обосновано, мы не пишем интерфейс-интерфейс, а описываем просто тип чего-то, и в 95% случаев, когда мы их используем, они запросто заменяются типом без потери смысла/функционала
в то же время это кучу запутанного и всратого кода создает, типа type IProps = .... сфига-ли там префикс I, во-первых, и почему остальные пропсы написаны интерфейсами, а этот - типами (пс: потому что extends Interface {} выглядит убого)
иной раз вообще не понятно, когда то а когда то писать, потому что по большому счету мы пишем и там и там просто типы
я как вижу: интерфейсы нужны, если бы мы писали ооп, + во всяких мега-узких кейсах, когда нужен мержинг интерфейсов с одинаковыми именами и всякие такие вещи, во всем остальном - можно писать типы вообще везде, потому что ими можно делать юнионы и так далее, а интерфейсами - нет
опять же надо подумать как их писать: добавлять ли префикс T и прочее
дискасс
интерфейс это связка имени и типа, а тип - просто тип. Без интерфейсов у тебя ошибки компилятора превратятся в огромные нечитаемые куски текста, т.к. там где были просто имена интерфейсов будет полное описание типа
Серег, кажется это не так)
вот на типе:

вот на интерфейсе:

Текст ошибки идентичен
я тоже не понял о чем Серега, можно пруфы?
я про это https://www.typescriptlang.org/docs/handbook/advanced-types.html#interfaces-vs-type-aliases сам не проверял. Просто помню что читал про это. Попозже проверю
ну тут надо подумать/поизучать, но я оставил, чтобы это не забылось
по мне так можно оставить как есть (юзать interface где это возможно, для остального type), но отказаться от правила помечать префиксом I типы объявленные с помощью interface. Возможно ввести критерии, по которым можно понять какие именно интерфейсы и алиасы нужно таким префиксом помечать.
Я в целом за то, чтобы убрать префиксы — ни I, ни T на самом деле не нужны. Сейчас уже почти полгода на проекте без префиксов — ни разу не чувствовал их необходимость :)
Я за то, чтобы оставить всё как есть и категорически против того что бы префикс убирать. Префикс помогает визуально отличать объекты от необъектов, это полезно.
А правило простое: префикс I - для типов которые объявлены через interface и для пересечения нескольких интерфейсов, для всех остальных - без префикса. Union интерфейсов это не интерфейс и соотвественно тоже не должен иметь префикса
Сейчас уже почти полгода на проекте без префиксов — ни разу не чувствовал их необходимость :)
на хаскеле?
Я за то, чтобы оставить всё как есть
по мне так можно оставить как есть
вопрос: почему плохо/не стоит писать все на типах? пока все что я видел - это мессадж @sk1e про ошибки, но там без пруфов и надо чекать
Я за то, чтобы оставить всё как есть
по мне так можно оставить как есть
вопрос: почему плохо/не стоит писать все на типах? пока все что я видел - это мессадж @sk1e про ошибки, но там без пруфов и надо чекать
пруфы я привёл, но видимо документация неактуальна
Я бы оставил интерфейсы из-за правила линтера которое заставляет добавлять префикс. Мне удобно видеть когда у тебя на входе объект и когда необъект. Это полезная, дополнительная информация
на хаскеле?
Не, на TS.
Но на Хаскеле кстати тоже.
Зачем тебе именно по имени определять, что внутри за типом скрыто? Ну когда нужно, провалишься в него по ctrl+клик, тебе все равно придется это делать, если ты хочешь посмотреть что там в объекте
А так получается, что небольшая потребнсть, которая возникает время от времени, заставляет тебя писать по-особенному всё время вообще, со всеми интерфейсами во всех модулях
Просто с этим префиксом не всё однозначно. Не понятно где нужно его применять, а где нет, и соответственно правило линтера нихера по сути не линтит, потому что как считает сам же Серега, пересечение двух интерфейсов нужно помечать префиксом I, а линтер в такое не умеет.
Union интерфейсов это не интерфейс и соотвественно тоже не должен иметь префикса
И вот с этим заявление я категорически не согласен.
на хаскеле?
Не, на TS.
Но на Хаскеле кстати тоже.
Зачем тебе именно по имени определять, что внутри за типом скрыто? Ну когда нужно, провалишься в него по ctrl+клик, тебе все равно придется это делать, если ты хочешь посмотреть что там в объекте
так я могу визуально, без всяких кликов определить. Когда я захочу посмотреть что там внутри это уже другой случай. Иногда удобно просто понять что это объект
Union интерфейсов это не интерфейс и соотвественно тоже не должен иметь префикса
И вот с этим заявление я категорически не согласен.
Это множество интерфейсов)
Это множество интерфейсов)
что в свою очередь тоже является интерфейсом
Это множество интерфейсов)
что в свою очередь тоже является интерфейсом
но нет же, как и множество чисел не является числом
Иногда удобно просто понять что это объект
Не понимаю в чем удобство :)
Иногда удобно просто понять что это объект
Не понимаю в чем удобство :)
Получаешь больше информации, без всяких кликов и переходов
Получаешь больше информации, без всяких кликов и переходов
Мне кажется это какое-то фантомное удобство. Я например эти префиксы вообще не замечаю, мозг их просто фильтрует, для него это информационный мусор. На некоторых проектах пробовал писать без этих префиксов и никакого дискомфорта не ощутил.
но нет же, как и множество чисел не является числом
Почему? в итоге то конечным значением будет число. Не понимаю твою логику :)
тут мне кажется в обратную строну должно работать. Типа нельзя сказать, что число это какое-то множество чисел (если мы говорим об ограниченном множестве), а вот любое множество чисел в итоге является числом. Как минимум если мы рассуждаем в разрезе типа и значения какой-то переменной, не углубляясь в философию :)
но нет же, как и множество чисел не является числом
Почему? в итоге то конечным значением будет число. Не понимаю твою логику :)
Я короче допустил ошибку в рассуждениях. Множество и элемент множества, конечно разные вещи, но union не создаёт множество значений а добавляет в него. Тогда, действительно, тип union'а интерфейсов так же сам есть интерфейс
Надо чётко тогда понимать, как часто тебе
Иногда удобно просто понять что это объект
Потому что ни мне, ни Диме особо потребности и удобства в этом нет :) Я боюсь, что для относительно редкого кейса мы вынуждены менять кодстайл, который аффектит на нас всех еще и 100% времени работы с кодом
Получаешь больше информации, без всяких кликов и переходов
Мне кажется это какое-то фантомное удобство. Я например эти префиксы вообще не замечаю, мозг их просто фильтрует, для него это информационный мусор. На некоторых проектах пробовал писать без этих префиксов и никакого дискомфорта не ощутил.
ок, в принципе наверно можно всё же обойтись без префиксов
тогда действительно можно отказаться от интерфейсов. Но там есть всё же некоторые различия https://github.com/microsoft/TypeScript/pull/7029 https://github.com/microsoft/TypeScript/issues/28174, нужно проанализировать как они могут повлиять
Я поддерживаю @sk1e, не знаю насчет пруфов, но у меня в голове довольно четко разделены объекты через интерфейсы и unions & type aliases, не понимаю зачем это все мешать в одно определение type
Если я вижу IEntity, то я понимаю что это объект, если я вижу Entity, то понимаю что за ним скрыто множество сущностей, типа 'man' | 'woman' | 'car' | 'cat', или допустим я хочу подчеркнуть/сделать более понятным что этот string есть LoaderName
Иногда удобно просто понять что это объект
Не понимаю в чем удобство :)
Получаешь больше информации, без всяких кликов и переходов
поддерживаю, не нужно кликать и переходить внутрь, меньше телодвижений за счет префикса который написан единожды, а работать с интерфейсом я буду кучу раз, либо я один раз помечаю либо постоянно скачу посредством cmd + click
у меня в голове довольно четко разделены объекты через интерфейсы и unions & type aliases, не понимаю зачем это все мешать в одно определение type
на мой взгляд, это разделение ты сам придумал, потому что по факту его нет ни в языке как таковом, ни в коде, который мы пишем, потому что мы можем запросто какие-нибудь интерсекшны и юнионы интерфейсов писать
Если я вижу IGender, то я понимаю что это объект, если я вижу Gender, то понимаю что за ним скрыто множество гендеров, типа 'man' | 'woman' | 'car' | 'cat'
во-первых, это просто-напросто не всегда так, (см. выше), во-вторых, это связано с именем всего лишь, т.е. с наличием префикса, в-третьих, в чем от этого профит? конкретно
или допустим я хочу подчеркнуть/сделать более понятным что этот string есть LoaderName
я вообще не понял, причем тут типы и интерфейсы)