react-redux-starter-kit icon indicating copy to clipboard operation
react-redux-starter-kit copied to clipboard

Отказаться от интерфейсов?

Open chmnkh opened this issue 6 years ago • 49 comments

ишью Сереги мне напомнили одну мысль, которую я вынашиваю

мы сейчас используем типы и интерфейсы, притом использование интерфейсов особо ничем не обосновано, мы не пишем интерфейс-интерфейс, а описываем просто тип чего-то, и в 95% случаев, когда мы их используем, они запросто заменяются типом без потери смысла/функционала

в то же время это кучу запутанного и всратого кода создает, типа type IProps = .... сфига-ли там префикс I, во-первых, и почему остальные пропсы написаны интерфейсами, а этот - типами (пс: потому что extends Interface {} выглядит убого)

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

я как вижу: интерфейсы нужны, если бы мы писали ооп, + во всяких мега-узких кейсах, когда нужен мержинг интерфейсов с одинаковыми именами и всякие такие вещи, во всем остальном - можно писать типы вообще везде, потому что ими можно делать юнионы и так далее, а интерфейсами - нет

опять же надо подумать как их писать: добавлять ли префикс T и прочее

дискасс

chmnkh avatar Oct 16 '19 08:10 chmnkh

интерфейс это связка имени и типа, а тип - просто тип. Без интерфейсов у тебя ошибки компилятора превратятся в огромные нечитаемые куски текста, т.к. там где были просто имена интерфейсов будет полное описание типа

sk1e avatar Oct 16 '19 08:10 sk1e

Серег, кажется это не так)

вот на типе: image

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

Текст ошибки идентичен

in19farkt avatar Oct 16 '19 08:10 in19farkt

я тоже не понял о чем Серега, можно пруфы?

chmnkh avatar Oct 16 '19 08:10 chmnkh

я про это https://www.typescriptlang.org/docs/handbook/advanced-types.html#interfaces-vs-type-aliases сам не проверял. Просто помню что читал про это. Попозже проверю

sk1e avatar Oct 16 '19 08:10 sk1e

ну тут надо подумать/поизучать, но я оставил, чтобы это не забылось

chmnkh avatar Oct 16 '19 09:10 chmnkh

по мне так можно оставить как есть (юзать interface где это возможно, для остального type), но отказаться от правила помечать префиксом I типы объявленные с помощью interface. Возможно ввести критерии, по которым можно понять какие именно интерфейсы и алиасы нужно таким префиксом помечать.

in19farkt avatar Oct 16 '19 09:10 in19farkt

Я в целом за то, чтобы убрать префиксы — ни I, ни T на самом деле не нужны. Сейчас уже почти полгода на проекте без префиксов — ни разу не чувствовал их необходимость :)

Znack avatar Oct 16 '19 16:10 Znack

Я за то, чтобы оставить всё как есть и категорически против того что бы префикс убирать. Префикс помогает визуально отличать объекты от необъектов, это полезно.

А правило простое: префикс I - для типов которые объявлены через interface и для пересечения нескольких интерфейсов, для всех остальных - без префикса. Union интерфейсов это не интерфейс и соотвественно тоже не должен иметь префикса

sk1e avatar Oct 17 '19 02:10 sk1e

Сейчас уже почти полгода на проекте без префиксов — ни разу не чувствовал их необходимость :)

на хаскеле?

sk1e avatar Oct 17 '19 02:10 sk1e

Я за то, чтобы оставить всё как есть

по мне так можно оставить как есть

вопрос: почему плохо/не стоит писать все на типах? пока все что я видел - это мессадж @sk1e про ошибки, но там без пруфов и надо чекать

chmnkh avatar Oct 17 '19 02:10 chmnkh

Я за то, чтобы оставить всё как есть

по мне так можно оставить как есть

вопрос: почему плохо/не стоит писать все на типах? пока все что я видел - это мессадж @sk1e про ошибки, но там без пруфов и надо чекать

пруфы я привёл, но видимо документация неактуальна

Я бы оставил интерфейсы из-за правила линтера которое заставляет добавлять префикс. Мне удобно видеть когда у тебя на входе объект и когда необъект. Это полезная, дополнительная информация

sk1e avatar Oct 17 '19 03:10 sk1e

на хаскеле?

Не, на TS.

Но на Хаскеле кстати тоже.

Зачем тебе именно по имени определять, что внутри за типом скрыто? Ну когда нужно, провалишься в него по ctrl+клик, тебе все равно придется это делать, если ты хочешь посмотреть что там в объекте

Znack avatar Oct 17 '19 06:10 Znack

А так получается, что небольшая потребнсть, которая возникает время от времени, заставляет тебя писать по-особенному всё время вообще, со всеми интерфейсами во всех модулях

Znack avatar Oct 17 '19 07:10 Znack

Просто с этим префиксом не всё однозначно. Не понятно где нужно его применять, а где нет, и соответственно правило линтера нихера по сути не линтит, потому что как считает сам же Серега, пересечение двух интерфейсов нужно помечать префиксом I, а линтер в такое не умеет.

Union интерфейсов это не интерфейс и соотвественно тоже не должен иметь префикса

И вот с этим заявление я категорически не согласен.

in19farkt avatar Oct 17 '19 07:10 in19farkt

на хаскеле?

Не, на TS.

Но на Хаскеле кстати тоже.

Зачем тебе именно по имени определять, что внутри за типом скрыто? Ну когда нужно, провалишься в него по ctrl+клик, тебе все равно придется это делать, если ты хочешь посмотреть что там в объекте

так я могу визуально, без всяких кликов определить. Когда я захочу посмотреть что там внутри это уже другой случай. Иногда удобно просто понять что это объект

sk1e avatar Oct 17 '19 07:10 sk1e

Union интерфейсов это не интерфейс и соотвественно тоже не должен иметь префикса

И вот с этим заявление я категорически не согласен.

Это множество интерфейсов)

sk1e avatar Oct 17 '19 07:10 sk1e

Это множество интерфейсов)

что в свою очередь тоже является интерфейсом

in19farkt avatar Oct 17 '19 07:10 in19farkt

Это множество интерфейсов)

что в свою очередь тоже является интерфейсом

но нет же, как и множество чисел не является числом

sk1e avatar Oct 17 '19 07:10 sk1e

Иногда удобно просто понять что это объект

Не понимаю в чем удобство :)

in19farkt avatar Oct 17 '19 07:10 in19farkt

Иногда удобно просто понять что это объект

Не понимаю в чем удобство :)

Получаешь больше информации, без всяких кликов и переходов

sk1e avatar Oct 17 '19 07:10 sk1e

Получаешь больше информации, без всяких кликов и переходов

Мне кажется это какое-то фантомное удобство. Я например эти префиксы вообще не замечаю, мозг их просто фильтрует, для него это информационный мусор. На некоторых проектах пробовал писать без этих префиксов и никакого дискомфорта не ощутил.

in19farkt avatar Oct 17 '19 07:10 in19farkt

но нет же, как и множество чисел не является числом

Почему? в итоге то конечным значением будет число. Не понимаю твою логику :)

in19farkt avatar Oct 17 '19 07:10 in19farkt

тут мне кажется в обратную строну должно работать. Типа нельзя сказать, что число это какое-то множество чисел (если мы говорим об ограниченном множестве), а вот любое множество чисел в итоге является числом. Как минимум если мы рассуждаем в разрезе типа и значения какой-то переменной, не углубляясь в философию :)

in19farkt avatar Oct 17 '19 07:10 in19farkt

но нет же, как и множество чисел не является числом

Почему? в итоге то конечным значением будет число. Не понимаю твою логику :)

Я короче допустил ошибку в рассуждениях. Множество и элемент множества, конечно разные вещи, но union не создаёт множество значений а добавляет в него. Тогда, действительно, тип union'а интерфейсов так же сам есть интерфейс

sk1e avatar Oct 17 '19 07:10 sk1e

Надо чётко тогда понимать, как часто тебе

Иногда удобно просто понять что это объект

Потому что ни мне, ни Диме особо потребности и удобства в этом нет :) Я боюсь, что для относительно редкого кейса мы вынуждены менять кодстайл, который аффектит на нас всех еще и 100% времени работы с кодом

Znack avatar Oct 17 '19 07:10 Znack

Получаешь больше информации, без всяких кликов и переходов

Мне кажется это какое-то фантомное удобство. Я например эти префиксы вообще не замечаю, мозг их просто фильтрует, для него это информационный мусор. На некоторых проектах пробовал писать без этих префиксов и никакого дискомфорта не ощутил.

ок, в принципе наверно можно всё же обойтись без префиксов

sk1e avatar Oct 17 '19 07:10 sk1e

тогда действительно можно отказаться от интерфейсов. Но там есть всё же некоторые различия https://github.com/microsoft/TypeScript/pull/7029 https://github.com/microsoft/TypeScript/issues/28174, нужно проанализировать как они могут повлиять

sk1e avatar Oct 17 '19 08:10 sk1e

Я поддерживаю @sk1e, не знаю насчет пруфов, но у меня в голове довольно четко разделены объекты через интерфейсы и unions & type aliases, не понимаю зачем это все мешать в одно определение type

Если я вижу IEntity, то я понимаю что это объект, если я вижу Entity, то понимаю что за ним скрыто множество сущностей, типа 'man' | 'woman' | 'car' | 'cat', или допустим я хочу подчеркнуть/сделать более понятным что этот string есть LoaderName

kinda-neat avatar Oct 21 '19 04:10 kinda-neat

Иногда удобно просто понять что это объект

Не понимаю в чем удобство :)

Получаешь больше информации, без всяких кликов и переходов

поддерживаю, не нужно кликать и переходить внутрь, меньше телодвижений за счет префикса который написан единожды, а работать с интерфейсом я буду кучу раз, либо я один раз помечаю либо постоянно скачу посредством cmd + click

kinda-neat avatar Oct 21 '19 04:10 kinda-neat

у меня в голове довольно четко разделены объекты через интерфейсы и unions & type aliases, не понимаю зачем это все мешать в одно определение type

на мой взгляд, это разделение ты сам придумал, потому что по факту его нет ни в языке как таковом, ни в коде, который мы пишем, потому что мы можем запросто какие-нибудь интерсекшны и юнионы интерфейсов писать

Если я вижу IGender, то я понимаю что это объект, если я вижу Gender, то понимаю что за ним скрыто множество гендеров, типа 'man' | 'woman' | 'car' | 'cat'

во-первых, это просто-напросто не всегда так, (см. выше), во-вторых, это связано с именем всего лишь, т.е. с наличием префикса, в-третьих, в чем от этого профит? конкретно

или допустим я хочу подчеркнуть/сделать более понятным что этот string есть LoaderName

я вообще не понял, причем тут типы и интерфейсы)

chmnkh avatar Oct 21 '19 06:10 chmnkh