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

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

Aleh
22.06.2016
20:05:40

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

Google

Aleh
22.06.2016
20:07:38
ничего больше происходить не будет)

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, но он ниразу не уникальный :)

Artur
22.06.2016
21:01:56

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

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

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 не делать)