@typescript_ru

Страница 13 из 669
Viacheslav
22.06.2016
19:32:32
на тему поддержки генериков в jsx ничего не делают случайно?

Ҫѐҏӗѫӑ
22.06.2016
19:34:01
нет вроде

Artur
22.06.2016
20:07:23
А можно подробнее? Потому что не очень понятно пока, если надо сказать, что объект соответствует некоему интерфейсу, обычно пишут интерфейс. Ты собираешься проверять определение абстрактных методов в объекте и делегировать функции из прототипа абстрактного класса объекту?

Google
Artur
22.06.2016
20:08:17
Тогда зачем тебе абстрактный класс?

Используй обычный

Aleh
22.06.2016
20:08:35
потому что в нем есть абстрактные методы, очевидно же)

Artur
22.06.2016
20:08:37
Ровно тоже самое, что я приводил в пример.

Aleh
22.06.2016
20:08:44
и потому что именно его нельзя инстанцировать

Artur
22.06.2016
20:09:25
Инстанцировать можно. Но это заставит ругнуться компилятор ТС

Aleh
22.06.2016
20:09:39
это и есть нельзя)

Artur
22.06.2016
20:09:45
А в рантайме вообще пофиг, инстанцируй сколько хочешь.

В рантайме можно)

Aleh
22.06.2016
20:10:01
в рантайме и типы обходить можно

Google
Aleh
22.06.2016
20:10:04
это не считается

Artur
22.06.2016
20:10:10
Короче я понял, тебе нужен ключ указатель на объект

При этом создавать объекты через реальные классы ты не хочешь

Так?

Aleh
22.06.2016
20:11:01
нет

я создаю через реальные классы

Artur
22.06.2016
20:11:08
Или ты хранишь объекты по ключу прототипа?

Который и есть твой абстрактный класс

Aleh
22.06.2016
20:12:05
да, храню по ключу объекты

но вопрос вообще в том

как описывается абстрактный класс)))

какой тип у абстрактного класса точнее

Vasiliy
22.06.2016
20:13:25
ну тип “что-то, у чего нет new()” (:

Aleh
22.06.2016
20:13:37
ага и возвращает объект этого типа :)

Так?
у меня потом есть в инициализаторе строчки типа container.bind(AbstractHttpClient, new SuperagentHttpClient);

т.е. все реальное, создается через реальные классы

Vasiliy
22.06.2016
20:15:28
в шарпе это было просто where T : new(), точнее, в этом случае можно было просто не писать это

Artur
22.06.2016
20:15:53
Погоди

Aleh
22.06.2016
20:20:29
?

Artur
22.06.2016
20:29:51
Такой хак получился abstract class Base { abstract foo():string; } class Child extends Base { foo() { return 'foo'; } } const map = new Map<any, any>(); function create<T extends Base>(key:any):T { return map.get(key); } const base = create(Base); // ok const child = create(Child); // ok base.foo(); // ok child.foo(); // ok

Google
Artur
22.06.2016
20:30:40
Поправил пример

В вебшторме подсказки падают, компилятор не ругается)

Но это если у тебя один абстрактный класс

Aleh
22.06.2016
20:32:41
ну не, у меня куча несвязанного

блин, это вообще конфиг, он не так критичен, потому что эти get вызываются только в нем и буквально в паре мест еще

но так удобно, что компилятор чекал возможные опечатки(

Artur
22.06.2016
20:34:26
Тады с приведением типа abstract class Base implements IBase { abstract foo():string; } abstract class AnotherBase { abstract bar():number; } class Child extends Base { foo() { return 'foo'; } } const map = new Map<any, any>(); function create<T>(key:any):T { return <T> map.get(key); } const base = create<Base>(Base); // ok const anotherBase = create<AnotherBase>(AnotherBase); // ok const child = create<Child>(Child); // ok base.foo(); // ok anotherBase.bar(); // ok child.foo(); // ok

Хм, а ты странный. Я конфиг сделал просто указывая интерфейс конфига.

Config.get<IApplicationConfig>(filename)

И вынес в итоге в статические шорткаты типа Config.getApplicationConfig()

Хотя, если куча конфигов, да еще и с хелперами каким-то.

В общем бери последний пример

Он рабочий

И подходят любые классы

Aleh
22.06.2016
20:37:38
ну, я имею ввиду конфиг контейнера)

Artur
22.06.2016
20:37:39
Но надо дублировать

Aleh
22.06.2016
20:38:13
да, понятно, что последний рабочий

я хотел избежать этого явно описав тип абстрактного класса

Artur
22.06.2016
20:38:52
Ну, может теоретически, если ты создашь базовый абстрактный класс и унаследуешь все остальные от него

Aleh
22.06.2016
20:39:32
тогда и на выходе тип будет только его

Google
Aleh
22.06.2016
20:39:38
не то, что нужно короче)

казалось бы, банальная вещь

))

Artur
22.06.2016
20:43:08
Вообще странно, что оно не работает.

Вот я тоже думал, что get<T>(thing:T):T вернет тип T

А оно без прямого указания не работает.

Aleh
22.06.2016
20:45:24
мм

Artur
22.06.2016
20:47:56
Тьфу, запутался я с этими абстрактными классами. Не работает именно для абстрактных классов же.

Хотя, казалось бы, чем не интерфейс.

Aleh
22.06.2016
20:48:28
интерфейс вообще ж недоступен в рантайме

Artur
22.06.2016
20:48:31
Суть та же, только имеет реализацию.

Не, я не к этому.

Но тебе прям принципиально абстрактный класс сделать?

Aleh
22.06.2016
20:50:09
да нет

мне сам вопрос интересен

как его описать-то

проблем-то подсунуть туда другую реализацию нет вообще)

Artur
22.06.2016
20:51:18
Я вот не уверен, а в других языках абстракции можно использовать на уровне референсов вообще?

Aleh
22.06.2016
20:54:27
ну да, на этом принципе же работают di-контейнеры

в php например можно у классов и интерфейсов брать их строчный уникальный FQCN

Google
Aleh
22.06.2016
20:56:19
в java тоже есть SomeClass.class

в js как бы есть Function.name, но он ниразу не уникальный :)

Aleh
22.06.2016
21:02:06
с 5.3 наверное, сейчас проверю

Artur
22.06.2016
21:02:24
Я уже года два толком с ним не работал. Может упустил что.

в js как бы есть Function.name, но он ниразу не уникальный :)
А зачем Function.name, если ссылка всегда уникальная.

Aleh
22.06.2016
21:03:10
это да

Artur
22.06.2016
21:03:16
Просто в реализации TypeScript почему-то абстрактный класс не дает на выход интерфейс.

Aleh
22.06.2016
21:03:19
ну и к строке уникально привести не проблема

может issue завести?)

Artur
22.06.2016
21:03:38
Хотя я вот DI делал и без абстракций обошелся.

Не уверен, но мне кажется они тут избыточны и довольно редко нужны.

Aleh
22.06.2016
21:04:02
ну мне просто удобно писать container.get(SomeClass)

и не загоняться)

Artur
22.06.2016
21:04:09
Ну я так же пишу

У меня по тому же принципу контейнер работают

@inject(ServiceClass) property:ServiceClass

Aleh
22.06.2016
21:04:46
а, я такое не пишу)

Artur
22.06.2016
21:04:56
Ну я решил почему бы нет)

Aleh
22.06.2016
21:04:57
решил, что лучше все в конфиге руками записать

а в классах вообще никаких намеков на container не делать)

Страница 13 из 669