
Artur
05.08.2016
14:46:23

Дмитрий
05.08.2016
14:46:43
static getList<U,W>
U - тип конструктора, что мы передаём, W - его входные параметры. Второй даже не обязательно, но так подсветка синтаксиса полнее)

Artur
05.08.2016
14:46:44
Baz.getList должен возвращать инстанцы Baz'ов и т.п.
Не, ну это понятно.

Google

Artur
05.08.2016
14:47:26
Ну вот на примере какого-нибудь ActiveRecord в пэхапэ

Дмитрий
05.08.2016
14:47:42
Какой угодно конструктор пиши)

Artur
05.08.2016
14:47:45
php
Users::findById()->name
А тут получается надо заморочиться
Users.findById(Users)().name
Ну и проще свести тогда к простому
Foo.get<Foo>().fooProperty
Так что тут походу от миксинов не уйти

Дмитрий
05.08.2016
14:50:19

Artur
05.08.2016
14:50:34
Да где же он у тебя сам-то подхватывается?
let val = Foo.getList(Bar)('Moscow','New York');
Просто в твоем примере конструктор передается и тут дженерик не нужен

Aleh
05.08.2016
14:52:32
так просто active record не нужен

Дмитрий
05.08.2016
14:52:41

Artur
05.08.2016
14:53:00
Да мне ActiveRecord и не нужен.

Google

Artur
05.08.2016
14:53:09
Мне подобие ODM нужно

Aleh
05.08.2016
14:53:34
ну вообще видимо красивее всего через generic
причем, если методов статических много, то вероятнее правильно было бы вынести все статические в отдельный интерфейс
потому что вероятно будут случаи, когда захочется отдельный объект делать с таким интерфейсом

Artur
05.08.2016
14:55:41
Без миксина никуда
Нет позднего статического связывания или его аналога

Aleh
05.08.2016
14:56:03
а issue есть?

Artur
05.08.2016
14:56:04
В Mongoose подобная задача так и решается.
Есть issue

Aleh
05.08.2016
14:56:17
ой, а скинь линк

Дмитрий
05.08.2016
14:57:06

Artur
05.08.2016
14:58:21
Ну так да, но это самый частый случай. Чаще будет getList напрямую вызываться, по аналогии метода findOne у моделей в монгусе.

Дмитрий
05.08.2016
14:58:28
А ещё обрати внимание на x=>[x.hello,x.id] из разных классов
М - многословность))

Artur
05.08.2016
14:59:14
Еще раз, Bat.getIds будет вызываться в коде 1 раз из 100 раз Bar.getList.
Аналог - модель findOne в Mongoose.
ой, а скинь линк
https://github.com/Microsoft/TypeScript/issues/5863#issuecomment-165388445
Собственно, там по ссылке самый простой пример того, что я хочу.

Google

Artur
05.08.2016
15:02:00
Не то, но аналог того, что нужно.
А в Mongoose это сделано следующим образом (если вкратце)
interface Model<T extends Document>
model<D, S>(schema) Model<D> & S { ... }
const myModel = model<{prop:string}, {staticMethod...}>(schema)
Model.findOne().exec().then(x => console.log(x.prop))

Дмитрий
05.08.2016
15:05:16

Artur
05.08.2016
15:05:46
Ага
Мне нужен getList в статических методах наследника
А не отдельно
Плюс

Дмитрий
05.08.2016
15:06:21
А я не в статическом методе наследника сделал?

Artur
05.08.2016
15:06:30
Таких методов 10 штук, мне надо вот эти связывания делать в 100 файлах по 10 раз в каждом?
Для простоты, есть один базовый класс, в нем 10 статических методов, есть 100 наследников этого класса. Эти 100 наследников в коде вызывают от 10 до 100 раз методы базового класса.
Собственнь, Bar.getList(Bar) или дублировать в 100 наследниках код функцию getList.
Выглядит как костыль.
Хотя в нормальных языках решается за раз два

Дмитрий
05.08.2016
15:09:52
Выглядит как обращение к статическому методу ?
И зачем тебе дублировать getList? Я его в дочернем классе не дублировал

Aleh
05.08.2016
15:11:37
хе, теперь с this type получилось красивее организвать cucumber сценарии

Artur
05.08.2016
15:14:20
Я вот реально не понимаю, почему TS не хочет. Мы же в static getList имеет this в виде конструктора класса наследника.
Должно быть что-то вроде getList(): {new(): this}

Дмитрий
05.08.2016
15:17:15

Google

Artur
05.08.2016
15:17:16
Поэтому похоже придется использовать миксины и this type.

Дмитрий
05.08.2016
15:18:09

Artur
05.08.2016
15:18:19
Каждый раз A.getList(A), B.getList(B)
N.getList(N)
Зачем туда N, если он и так this === N?

Дмитрий
05.08.2016
15:19:29

Artur
05.08.2016
15:19:38
Да не нужно мне внутри него!
Мне нужно у наследников снаружи этот метод вызывать же
И получать их инстансы
А вот Flow меня понимает!
https://tryflow.org/?code=Y2xhc3MgRm9vIHsKICAgIGlkOm51bWJlcjsKICAgIAogICAgc3RhdGljIGdldExpc3QoKTpBcnJheTx0aGlzPiB7CiAgICAgICAgcmV0dXJuIFtuZXcgdGhpcygpXTsKICAgIH0KfQoKY2xhc3MgQmFyIGV4dGVuZHMgRm9vIHsKICAgIGhlbGxvOnN0cmluZzsKICAgIAogICAgc3RhdGljIGdldElkcygpIHsKICAgICAgICByZXR1cm4gdGhpcy5nZXRMaXN0KCkubWFwKHggPT4geC5pZCk7CiAgICB9Cn0KCkJhci5nZXRMaXN0KCkubWFwKHggPT4gY29uc29sZS5sb2coeC5oZWxsbywgeC5pZCkpOw==
Flow умный, будь как Flow!
Это мне WebStorm сказал на мой пример на Flow
Хотя на типы не ругается, но автокомплит не робит
И вообще фигня какая-та
Зато в песочнице на tryflow все ок

Vladimir
05.08.2016
15:35:05
ну так webstorm не поддерживает flow

Ярослав
05.08.2016
15:36:59
наследников?

Google

Vladimir
05.08.2016
15:37:05
это просто синтаксис

Artur
05.08.2016
15:37:21
Я уже понял)

Ярослав
05.08.2016
15:39:01
ну это даже на словах тупо получается. Если у тебя есть статические методы для обработки чего-то там со стороны, то будь добр туда пробрасывай параметром то, что хочешь обработать, или биндь, или ещё как-нибудь, но примешивать статические методы в другой класс, чтобы их не писать — очень-очень-очень плохая идея

Artur
05.08.2016
15:43:39
Да на надо ничего примешивать. Средствами JS это все делается без проблем, если TS выкинуть.
Вот прям простой пример
class Foo {
static getList() {
return [new this, new this];
}
}
class Bar extends Foo {}
console.log(Bar.getList());
А вот для TS вынь и подай Bar.getList<Bar>()

Дмитрий
05.08.2016
15:50:12

Artur
05.08.2016
15:51:06

Дмитрий
05.08.2016
15:51:18
Теперь для того, чтобы Bar создал пару инстансов Bar не нужно даже скобки писать
Bar.getIds
Куда уж дальше)

Artur
05.08.2016
15:51:37
Я там выше писал, выкинь getIds
Оставь функции исключительно в родительском классе
И вызываться они будут через дочерний класс снаружи где-то в модулях.