
Mike
02.09.2016
12:10:25
надо без тайпофа
BaseClass он уже тип

Vladimir
02.09.2016
12:11:03
>в нормальных языках
каких, например?

Google

Mike
02.09.2016
12:13:03
относительно примера

Oleg
02.09.2016
12:14:59
Dart, Scala

Ҫѐҏӗѫӑ
02.09.2016
12:16:00
в скале будет не запятая, а много with

Vladimir
02.09.2016
12:16:46
Множественное наследование как бы не есть гуд

Ҫѐҏӗѫӑ
02.09.2016
12:17:16
+

Aleh
02.09.2016
12:17:22
> Creatable, Deletable
это какие-то каноничные названия интерфейсов

Ҫѐҏӗѫӑ
02.09.2016
12:17:33
но если язык предоставляет такое, то это не плохо, а норм

Aleh
02.09.2016
12:17:34
их можно имплементить в любом количестве

Vladimir
02.09.2016
12:18:11
может быть - в C++ не норм
в скале может и норм


Oleg
02.09.2016
12:18:49
https://www.typescriptlang.org/play/index.html#src=%0D%0Ainterface%20IService%3CM%3E%20%7B%0D%0A%20%20get%3A%20(id%3A%20string)%20%3D%3E%20M%0D%0A%7D%0D%0A%0D%0Aabstract%20class%20Service%3CM%3E%20implements%20IService%3CM%3E%20%7B%0D%0A%20%20constructor()%20%7B%0D%0A%20%20%7D%0D%0A%20%20get%20%3D%20(id%3A%20string)%20%3D%3E%20%7B%0D%0A%09%20%20let%20r%20%3D%20%7Bid%3A%20'qwe'%7D%20as%20any%0D%0A%09%20%20return%20r%0D%0A%20%20%7D%0D%0A%7D%0D%0A%0D%0Ainterface%20IDoc%20%7B%0D%0A%20%20id%3A%20string%0D%0A%7D%0D%0A%0D%0Aclass%20DocService%20extends%20Service%3CIDoc%3E%20%7B%0D%0A%7D%0D%0A%0D%0A%0D%0Ainterface%20ICreatableService%3CM%3E%20%7B%0D%0A%20%20create%3A%20(createReqiest%3A%20any)%20%3D%3E%20M%0D%0A%7D%0D%0A%0D%0Afunction%20creatable%3CS%20extends%20Service%3CM%3E%2C%20M%3E(SuperClass%3A%20S)%20%7B%0D%0A%20%20%20%20return%20class%20Creatable%3CM%3E%20extends%20SuperClass%20implements%20ICreatableService%3CM%3E%20%7B%0D%0A%20%20%20%20%20%20create%20%3D%20(createReqiest%3A%20any)%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20let%20r%20%3D%20%7Bid%3A%20'qwe'%7D%20as%20any%0D%0A%09%20%20%20%20return%20r%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%7D%3B%0D%0A%7D%0D%0A%0D%0A%2F%2F%20const%20CreatableDocService%20%3D%20creatable%3CDocService%3E(DocService)%0D%0A%2F%2F%20let%20a%20%3D%20new%20CreatableDocService()%0D%0A%2F%2F%20alert(JSON.stringify(a.create('123')))
сорри за жесть. плейграунд в ТС говно

Google

Oleg
02.09.2016
12:21:43
короче сервис у меня с генериком, ругается вроде на то что new нет
кто как бы такую задачу решил бы?

Vladimir
02.09.2016
12:23:38
> ТС говно

Aleh
02.09.2016
12:26:38

Ҫѐҏӗѫӑ
02.09.2016
12:26:54
ТС говно™

Aleh
02.09.2016
12:27:19
и например ниже DocService он не типа DocService


Oleg
02.09.2016
12:27:53
погодите. в плейграунде завел свой первый пример - там тоже ругань
давайте первый исправим
https://www.typescriptlang.org/play/index.html#src=class%20BaseClass%20%7B%0D%0A%7D%0D%0A%0D%0Afunction%20updateable%3CT%20extends%20typeof%20BaseClass%3E(SuperClass%3A%20T)%20%7B%0D%0A%20%20%20%20return%20class%20Updateable%20extends%20SuperClass%20%7B%0D%0A%20%20%20%20%20%20constructor()%20%7B%0D%0A%20%20%20%20%20%20%20%20super()%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20update%20%3D%20()%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20console.log('update')%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%7D%3B%0D%0A%7D%0D%0A%0D%0Afunction%20deletable%3CT%20extends%20typeof%20BaseClass%3E(SuperClass%3A%20T)%20%7B%0D%0A%20%20%20%20return%20class%20Deletable%20extends%20SuperClass%20%7B%0D%0A%20%20%20%20%20%20constructor()%20%7B%0D%0A%20%20%20%20%20%20%20%20super()%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20delete%20%3D%20()%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20console.log('delete')%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%7D%3B%0D%0A%7D%0D%0A%0D%0Aclass%20A%20extends%20BaseClass%20%7B%0D%0A%7D%0D%0A%0D%0Aconst%20UpdatableA%20%3D%20updateable%3CA%3E(A)%0D%0Aconst%20DeletableA%20%3D%20deletable%3CUpdatableA%3E(UpdatableA)%0D%0A%0D%0Aconst%20AA%20%3D%20DeletableA%0D%0A%0D%0Alet%20a%20%3D%20new%20AA()%0D%0A%0D%0Aa.update()%20%2F%2F%20update%0D%0Aa.delete()%20%2F%2F%20delete%0D%0Aconsole.log(a%20instanceof%20UpdatableA)%20%2F%2F%20true
вот. сюда фокус. Type T is not a constructor function type


Mike
02.09.2016
12:30:24
https://www.typescriptlang.org/play/index.html#src=class%20BaseClass%20%7B%0D%0A%7D%0D%0A%0D%0Ainterface%20IConstructableBaseClass%20%7B%0D%0A%20%20%20%20new%20()%3A%20BaseClass%3B%0D%0A%7D%0D%0A%0D%0Afunction%20updateable%3CT%20extends%20IConstructableBaseClass%3E(SuperClass%3AT)%20%7B%0D%0A%09var%20Constrctable%20%3D%20%3CIConstructableBaseClass%3ESuperClass%3B%0D%0A%20%20%20%20return%20class%20Updateable%20extends%20Constrctable%20%7B%0D%0A%20%20%20%20%20%20constructor()%20%7B%0D%0A%20%20%20%20%20%20%20%20super()%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20update()%3Avoid%20%7B%0D%0A%20%20%20%20%20%20%20%20console.log('update')%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%7D%3B%0D%0A%7D%0D%0A%0D%0Afunction%20deletable%3CT%20extends%20IConstructableBaseClass%3E(SuperClass%3AT)%20%7B%0D%0A%09var%20Constrctable%20%3D%20%3CIConstructableBaseClass%3ESuperClass%3B%0D%0A%20%20%20%20return%20class%20Deletable%20extends%20Constrctable%20%20%7B%0D%0A%20%20%20%20%20%20constructor()%20%7B%0D%0A%20%20%20%20%20%20%20%20super()%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20delete()%3Avoid%20%7B%0D%0A%20%20%20%20%20%20%20%20console.log('delete')%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%7D%3B%0D%0A%7D%0D%0A%0D%0Aclass%20A%20extends%20BaseClass%20%7B%0D%0A%7D%0D%0A%0D%0Aconst%20UpdatableA%20%3D%20updateable(A)%0D%0Aconst%20DeletableA%20%3D%20deletable(UpdatableA)%3B%0D%0A%0D%0Aconst%20AA%20%3D%20DeletableA%3B%0D%0A%0D%0Alet%20a%20%3D%20new%20AA()%0D%0A%0D%0Aa.update()%20%2F%2F%20update%0D%0Aa.delete()%20%2F%2F%20delete%0D%0Aconsole.log(a%20instanceof%20UpdatableA)%20%2F%2F%20true%0D%0Aconsole.log(a%20instanceof%20DeletableA)%20%2F%2F%20true
это пока лучшее что я смог сделать
это работает, но теряет цепочку в подсказчике
сейчас подумаю как править


Oleg
02.09.2016
12:32:12
Миш, там видишь update теряется

Mike
02.09.2016
12:32:29
да
вижу
ворт сейчас думаю как его убедить не потерять

Aleh
02.09.2016
13:32:28
Oleg https://www.typescriptlang.org/play/index.html#src=type%20Factory%3CT%3E%20%3D%20%7B%0D%0A%09new%20(...args%3A%20any%5B%5D)%3A%20T%3B%0D%0A%7D%0D%0A%0D%0Ainterface%20Updatable%20%7B%0D%0A%09update()%3A%20void%3B%0D%0A%7D%0D%0Aclass%20MyClass%20%7B%09%0D%0A%09test()%3A%20void%20%7B%7D%3B%09%0D%0A%7D%0D%0A%0D%0Afunction%20updatable%3CT%3E(a%3A%20Factory%3CT%3E)%3A%20Factory%3CT%20%26%20Updatable%3E%20%7B%0D%0A%09a.prototype.update%20%3D%20function()%7B%7D%3B%0D%0A%09return%20%3CFactory%3CT%20%26%20Updatable%3E%3Ea%3B%0D%0A%7D%0D%0A%0D%0Aconst%20a%20%3D%20new%20(updatable(MyClass))%3B
мне не нравится, но вот

Google

Oleg
02.09.2016
13:34:29
добавь deletable плиз
то есть два поведения

Mike
02.09.2016
13:34:51
rhenj
круто
сейчас попробую со своим подходм склеить
без вписывания прототипа


Aleh
02.09.2016
13:35:59
https://www.typescriptlang.org/play/index.html#src=type%20Factory%3CT%3E%20%3D%20%7B%0D%0A%09new%20(...args%3A%20any%5B%5D)%3A%20T%3B%0D%0A%7D%0D%0A%0D%0Ainterface%20Updatable%20%7B%0D%0A%09update()%3A%20void%3B%0D%0A%7D%0D%0Ainterface%20Deletable%20%7B%0D%0A%09delete()%3A%20void%3B%0D%0A%7D%0D%0Aclass%20MyClass%20%7B%09%0D%0A%09test()%3A%20void%20%7B%7D%3B%09%0D%0A%7D%0D%0A%0D%0Afunction%20updatable%3CT%3E(a%3A%20Factory%3CT%3E)%3A%20Factory%3CT%20%26%20Updatable%3E%20%7B%0D%0A%09a.prototype.update%20%3D%20function()%7B%7D%3B%0D%0A%09return%20%3CFactory%3CT%20%26%20Updatable%3E%3Ea%3B%0D%0A%7D%0D%0Afunction%20deletable%3CT%3E(a%3A%20Factory%3CT%3E)%3A%20Factory%3CT%20%26%20Deletable%3E%20%7B%0D%0A%09a.prototype.delete%20%3D%20function()%7B%7D%3B%0D%0A%09return%20%3CFactory%3CT%20%26%20Deletable%3E%3Ea%3B%0D%0A%7D%0D%0A%0D%0Aconst%20a%20%3D%20new%20(deletable(updatable(MyClass)))%3B


Mike
02.09.2016
13:42:28
https://www.typescriptlang.org/play/index.html#src=type%20Factory%3CT%3E%20%3D%20%7B%0D%0A%09new%20(...args%3A%20any%5B%5D)%3A%20T%3B%0D%0A%7D%0D%0A%0D%0Ainterface%20IUpdateable%20%7B%0D%0A%09update()%3Avoid%3B%0D%0A%7D%0D%0Ainterface%20IDeletable%20%7B%0D%0A%09delete()%3Avoid%3B%0D%0A%7D%0D%0A%0D%0Afunction%20updateable%3CT%3E(SuperClass%3AFactory%3CT%3E)%3AFactory%3CT%26IUpdateable%3E%20%7B%0D%0A%09const%20Constractable%20%3D%20%3CFactory%3CIUpdateable%3E%3E%3Cany%3ESuperClass%3B%0D%0A%20%20%20%20const%20res%20%3D%20class%20Updateable%20extends%20Constractable%20implements%20IUpdateable%20%7B%0D%0A%20%20%20%20%20%20constructor()%20%7B%0D%0A%20%20%20%20%20%20%20%20super()%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20update()%3Avoid%20%7B%0D%0A%20%20%20%20%20%20%20%20console.log('update')%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%7D%3B%0D%0A%09return%20%3CFactory%3CT%26IUpdateable%3E%3Eres%3B%0D%0A%7D%0D%0A%0D%0Afunction%20deletable%3CT%3E(SuperClass%3AFactory%3CT%3E)%3AFactory%3CT%26IDeletable%3E%20%7B%0D%0A%09const%20Constractable%20%3D%20%3CFactory%3CIDeletable%3E%3E%3Cany%3ESuperClass%3B%0D%0A%20%20%20%20const%20res%20%3D%20class%20Deletable%20extends%20Constractable%20implements%20IDeletable%20%7B%0D%0A%20%20%20%20%20%20constructor()%20%7B%0D%0A%20%20%20%20%20%20%20%20super()%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20delete()%3Avoid%20%7B%0D%0A%20%20%20%20%20%20%20%20console.log('update')%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%7D%3B%0D%0A%09return%20%3CFactory%3CT%26IDeletable%3E%3Eres%3B%0D%0A%7D%0D%0A%0D%0A%0D%0Aclass%20A%20%7B%0D%0A%09ping()%3Avoid%20%7B%0D%0A%09%09console.log('A%3A%3Aping')%3B%0D%0A%09%7D%0D%0A%7D%0D%0A%0D%0Aconst%20DeletableA%20%3D%20deletable(A)%3B%0D%0Aconst%20UpdatableDeletableA%20%3D%20updateable(DeletableA)%3B%0D%0Alet%20a%20%3D%20new%20UpdatableDeletableA()%0D%0A%0D%0Aa.ping()%3B%0D%0Aa.update()%20%2F%2F%20update%0D%0Aa.delete()%20%2F%2F%20delete%0D%0Aconsole.log(a%20instanceof%20UpdatableDeletableA)%20%2F%2F%20true%0D%0Aconsole.log(a%20instanceof%20DeletableA)%20%2F%2F%20true%0D%0Aconsole.log(a%20instanceof%20A)%20%2F%2F%20true
во
то что надо
сейчас попробуем успростить
https://www.typescriptlang.org/play/index.html#src=type%20Factory%3CT%3E%20%3D%20%7B%0D%0A%09new%20(...args%3A%20any%5B%5D)%3A%20T%3B%0D%0A%7D%0D%0Ainterface%20IUpdateable%20%7B%0D%0A%09update()%3Avoid%3B%0D%0A%7D%0D%0Afunction%20updateable%3CT%3E(SuperClass%3AFactory%3CT%3E)%3AFactory%3CT%26IUpdateable%3E%20%7B%0D%0A%09const%20Constractable%20%3D%20%3CFactory%3CObject%3E%3ESuperClass%3B%0D%0A%20%20%20%20const%20res%20%3D%20class%20Updateable%20extends%20Constractable%20implements%20IUpdateable%20%7B%0D%0A%20%20%20%20%20%20constructor()%20%7B%0D%0A%20%20%20%20%20%20%20%20super()%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20update()%3Avoid%20%7B%0D%0A%20%20%20%20%20%20%20%20console.log('update')%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%7D%3B%0D%0A%09return%20%3CFactory%3CT%26IUpdateable%3E%3Eres%3B%0D%0A%7D%0D%0Ainterface%20IDeletable%20%7B%0D%0A%09delete()%3Avoid%3B%0D%0A%7D%0D%0Afunction%20deletable%3CT%3E(SuperClass%3AFactory%3CT%3E)%3AFactory%3CT%26IDeletable%3E%20%7B%0D%0A%09const%20Constractable%20%3D%20%3CFactory%3CObject%3E%3ESuperClass%3B%0D%0A%20%20%20%20const%20res%20%3D%20class%20Deletable%20extends%20Constractable%20implements%20IDeletable%20%7B%0D%0A%20%20%20%20%20%20constructor()%20%7B%0D%0A%20%20%20%20%20%20%20%20super()%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20delete()%3Avoid%20%7B%0D%0A%20%20%20%20%20%20%20%20console.log('update')%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%7D%3B%0D%0A%09return%20%3CFactory%3CT%26IDeletable%3E%3Eres%3B%0D%0A%7D%0D%0A%0D%0A%0D%0Aclass%20A%20%7B%0D%0A%09ping()%3Avoid%20%7B%0D%0A%09%09console.log('A%3A%3Aping')%3B%0D%0A%09%7D%0D%0A%7D%0D%0A%0D%0Aconst%20DeletableA%20%3D%20deletable(A)%3B%0D%0Aconst%20UpdatableDeletableA%20%3D%20updateable(DeletableA)%3B%0D%0Alet%20a%20%3D%20new%20UpdatableDeletableA()%0D%0A%0D%0Aa.ping()%3B%20%20%2F%2F%20A%3A%3Aping%0D%0Aa.update()%20%2F%2F%20update%0D%0Aa.delete()%20%2F%2F%20delete%0D%0Aconsole.log(a%20instanceof%20UpdatableDeletableA)%20%2F%2F%20true%0D%0Aconsole.log(a%20instanceof%20DeletableA)%20%2F%2F%20true%0D%0Aconsole.log(a%20instanceof%20A)%20%2F%2F%20true
вот итог
мне нравится
Aleh спасибо, за наводку


Aleh
02.09.2016
13:53:28
пожалуйста)

Dreamerinnoise
02.09.2016
13:54:05
Тайпскрипт не говно?

Oleg
02.09.2016
14:13:50
круты, без вопросов
какие еще пути упрощения
чтобы уменьшить до талого

Google

Mike
02.09.2016
14:14:32
что значит до талого?

Oleg
02.09.2016
14:15:15
количество кода уменьшить. может быть другой подход для композиции
теперь следующий челлендж. добавить генериков interface IUpdateable<T>

Mike
02.09.2016
14:17:49

Oleg
02.09.2016
14:19:00
аналог abstact class DocService<T> extends Service<T> with Updatable<T>

Mike
02.09.2016
14:19:34
всё равно не понял
interface UpdateableA extends IUpdateable, A {
}
nfrjt xnjkb&
такое чтоли?

Oleg
02.09.2016
14:22:34
у тебя есть обощенный сервис, работающий с моделью документа определенного рода. Service<ISomeDoc>. Тебе нужно собрать сервис Creatable, Deletable и т/д/

Ҫѐҏӗѫӑ
02.09.2016
14:27:55

Алексей
02.09.2016
15:04:40
/тайпскрипт_не_говно™

Vladimir
02.09.2016
15:18:48
да не, говно

Nikita
02.09.2016
15:39:04
ни тайпскрипту, ни флоу невозможно внятно объяснить, что у редакса есть миддлвары
то есть есть в dispatch можно передать вообще все, что угодно
ну или с такой туевой хучей дженериков, что охренеешь

Ҫѐҏӗѫӑ
02.09.2016
15:42:11
это так

Nikita
02.09.2016
15:45:54
а есть аналог редакса, ну или вообще не аналог, но который учитывает типы и под них заточен?

Oleg
02.09.2016
15:48:19
кому редакс нравится - типизирует экшены и редьюсеры

Nikita
02.09.2016
15:48:45
я бы хотел взглянуть на такой код) Где хотя бы 5 редьюсеров есть, а не todo)

Google

Oleg
02.09.2016
15:49:19
мы еще плагин к вебпаку накатали чтобы стейт пересобирать без Object.assign а присваиванием

Aleh
02.09.2016
15:50:05
я бы хотел взглянуть на такой код) Где хотя бы 5 редьюсеров есть, а не todo)
https://www.typescriptlang.org/play/index.html#src=type%20PlainTypedAction%20%3D%20%7B%0D%0A%09type%3A%20string%3B%0D%0A%7D%3B%0D%0Atype%20ThunkAction%20%3D%20%7B%0D%0A%09()%3A%20void%3B%0D%0A%7D%3B%0D%0A%0D%0Atype%20Dispatch%20%3D%20%7B%0D%0A%09(action%3A%20PlainTypedAction%20%7C%20ThunkAction)%3A%20void%3B%0D%0A%7D%3B%0D%0A%0D%0Atype%20Props%20%3D%20%7B%0D%0A%09dispatch%3A%20Dispatch%3B%0D%0A%7D
я не юзаю thunk, поэтому не знаю, но в чем собственно проблема?

Nikita
02.09.2016
15:50:39
а как ты без thunk живешь?

Aleh
02.09.2016
15:50:57
ну, есть другие мидлвары

Nikita
02.09.2016
15:51:42
ясно. у меня специфика проекта, что есть отдельная библиотека, которая отвечает за взаимодействие с сервером. Я ее через thunk 3 аргументом прокидываю

Aleh
02.09.2016
15:52:18
и?)
можешь показать, где проблема?

Nikita
02.09.2016
16:00:00
ща)

Alex
02.09.2016
16:00:51
https://www.youtube.com/watch?v=tSIfHvgVeQg

Mike
02.09.2016
16:01:32

Aleh
02.09.2016
16:01:47
@gusnkt ну и чем мое определение Dispatch плохо в твоем случае?

Nikita
02.09.2016
16:03:52

Aleh
02.09.2016
16:04:06
ну, в плане, доопредели нужные в одном месте и юзай во всем проекте


Nikita
02.09.2016
16:15:00
https://www.typescriptlang.org/play/index.html#src=type%20Action%3CP%3E%20%3D%20%7B%0D%0A%09type%3A%20string%2C%0D%0A%09payload%3A%20P%0D%0A%7D%0D%0A%0D%0Atype%20AsyncAction%3CS%2C%20P%2C%20H%3E%20%3D%20(%0D%0A%09dispatch%3A%20Dispatch%3CS%2C%20P%2C%20H%3E%2C%0D%0A%09getState%3A%20StateGetter%3CS%3E%2C%0D%0A%09helpers%3A%20H%0D%0A)%20%3D%3E%20void%3B%0D%0A%0D%0Atype%20DispatchAction%3CS%2C%20P%2C%20H%3E%20%3D%20Action%3CP%3E%20%7C%20AsyncAction%3CS%2C%20P%2C%20H%3E%3B%0D%0Atype%20Dispatch%3CS%2C%20P%2C%20H%3E%20%3D%20(action%3A%20DispatchAction%3CS%2C%20P%2C%20H%3E)%20%3D%3E%20void%3B%0D%0Atype%20StateGetter%3CS%3E%20%3D%20()%20%3D%3E%20S%3B%0D%0A%0D%0Atype%20Store%3CS%2C%20P%2C%20H%3E%20%3D%20%7B%0D%0A%09dispatch%3A%20Dispatch%3CS%2C%20P%2C%20H%3E%2C%0D%0A%09getState%3A%20StateGetter%3CS%3E%0D%0A%7D%0D%0A%0D%0A
ну вот как-то так нужно)
я на это посмотрел и подумал - в баню)


Vladimir
02.09.2016
16:18:12
потому что dispatch принимаю что угодно, по своей сути
его нельзя типизировать