
hlomzik
04.08.2016
18:30:33
как в TS можно сделать дженерик для обычного хэша? Object<T> не катит (Object is not generic), а { [s: string]: T } странноват (не изящно :))
и кто дружил lodash с ts?
import { pickBy } from ‘lodash’ ругается
pickBy(<Object>scopes, keys) ругается

Андрей
05.08.2016
03:55:16

Artur
05.08.2016
07:26:44
Норм, да

Google

Artur
05.08.2016
07:27:08
А React у нас с Flow оказывается работает... разочарование месяца...

Dreamerinnoise
05.08.2016
07:28:28

Artur
05.08.2016
07:29:17
То да
Кто бы написал теперь генератор flow -> d.ts

Aleh
05.08.2016
08:40:53
И какие в flow есть синтаксические конструкции, которые ts не умеет?

Artur
05.08.2016
08:41:24
Потому, что не с TS :)
Они немножечко несовместимы.
type vs interface и т.п.
Но жить это не мешает.

Aleh
05.08.2016
08:42:16

Artur
05.08.2016
08:42:34
Есть

Андрей
05.08.2016
08:49:31
Flow это эти вот PropTypes?

Google

hlomzik
05.08.2016
08:57:42

Artur
05.08.2016
09:04:46

Андрей
05.08.2016
09:06:03
да, я понимаю, что runtime, я просто с 'Flow' не сталкивался, думал это одно и тоже. Это тогда наверно какая-то система аннотаций типов для JS альтернативная?

Artur
05.08.2016
09:06:20
Да, именно так и есть.
Ребят, а такой вопрос: как без дженериков определить в статическом методе базового класса тип возвращаемого значения в виде инстанса для наследуемых от него классов?
Как-то мне огород с class Bar extends Foo<Bar> ... не очень нравится.

Саторин
05.08.2016
09:11:34
там есть this как возвращаемый тип

Artur
05.08.2016
09:12:32
Ага, я тоже с ним уже разбежался
A 'this' type is available only in a non-static member of a class or interface.

Саторин
05.08.2016
09:14:15
эм, а как ты вообще вернешь в статическом методе какой то неизвестный при компиляции тип?

Artur
05.08.2016
09:19:46
Для этих случаев есть позднее статическое связывание. Не вижу препятствий для определения типа на стадии компиляции типа возвращаемого статическим методом базового класса при его вызове в наследнике. Правда для этого наверное какое-то ключевое слово должно быть.
Что-то вроде {new(): static}

Саторин
05.08.2016
09:22:13
а, как я понял ты хочешь некий делегирующий конструктор который какие то параметры подставляет и вызывает конструктор класса-потомка

Artur
05.08.2016
09:25:35
Точно.

Саторин
05.08.2016
09:26:03
типа create(x): thisClass { return new thisClass(x, y) }

Artur
05.08.2016
09:26:19
Ну да. Только внутри логика сложнее немножко будет.
create при этом static в родителе

Саторин
05.08.2016
09:26:50
ага

Artur
05.08.2016
09:27:01
Можно так сделать Child.create<Child>() но это будет оверхед
Пропозал на эту тему в TS есть
Сейчас читаю

Google

Artur
05.08.2016
09:27:40
Может в 2.0 есть такая штука

Саторин
05.08.2016
09:27:56

Artur
05.08.2016
09:28:20
Там new не будет :)
Он будет возвращать псевдо объект типа.
Но это не суть.
Главное дать понять, что возвращает тип класса от которго он унаследован.
А на твой вопрос, кстати, есть ответ
А, нет, нету
Короче пока самый адекватный вариант такой.

Андрей
05.08.2016
09:33:33
в спецификации 1.8 такого точно не было. а 2.0 я еще детально не штудировал..

Саторин
05.08.2016
09:34:19
wtf
если ты скастишь объект к какому то классу, у него не появятся методы этого класса, нахуя.

Artur
05.08.2016
09:35:24
Логика там будет сложнее

Саторин
05.08.2016
09:36:02
не проще тогда кастить полученный объект к своему классу Bar

Artur
05.08.2016
09:36:21
Нет
Потому что эти методы будут вызываться многократно. Это не фабрика.
Вернее почти фабрика, но не она.
Проще сказать так: каждый раз кастовать при вызове этих статических методов не хочется совсем.

Саторин
05.08.2016
09:38:37
как тебе тогда function baz<T>(cls): T { return cls.baz() as T }

Artur
05.08.2016
09:38:39
И таких методов статических будет около десятка.

Google

Саторин
05.08.2016
09:39:08
а, фейл
все равно T указывать придется
ну лан, мне кажется фигней страдаешь

andretshurotshka?❄️кде
05.08.2016
09:39:46
any any any и не паримся

Artur
05.08.2016
09:40:35

Саторин
05.08.2016
09:40:56
можно через миксины сделать попробовать

Artur
05.08.2016
09:41:09
И вот почему
Короче, в классе, который мы хотим замиксовать, могут использоваться статические методы примеси.
class Foo<T> {
static baz():T {
return {} as T;
}
}
class Bar {
static baz2() {
return this.baz(); ???
}
}
class FooBar = mixin(Foo, Bar)
Что-то вроде того
Поэтому надо Bar extends Foo
Но A extends B<A> как-то не гламурно

Саторин
05.08.2016
09:48:49
почему бы тебе все статические методы не заменить на обычные
и не использовать обычное наследование
типа FooBuilder implements Builder<Foo> и погнал

Artur
05.08.2016
09:53:26
Все просто. Мне эти методы не нужны в инстансе, т.к. он является объектом с данными.

Саторин
05.08.2016
09:54:00
ну, их и не будет
смысл в том чтобы у класса был метод build который и возвращал объект нужного тебе типа
в общем я ушел

Google

Artur
05.08.2016
10:05:57
Я тебя понял. Но мне надо иметь всю эту информацию на уровнее определения класса, а не в скомпонованном через build объекте. Это, в общем-то, почти тот же самый mixin получается.

Aleh
05.08.2016
10:38:27

Artur
05.08.2016
10:43:58
А как ты этот метод определил? Ты же просто хочешь сделать фабричный метод?
В принципе да, будет несколько фабричных методов, которые возвращают инстансы дочерних классов. Но таких дочерних классов может быть сотня. Сами же фабричные методы будут вызываться через потомков и указывать каждый раз Foo.staticMethod<Foo>() считаю излишним. В PHP (sic!), к примеру, это решается через late static bindings (например
function getInstance() { return new static } ).

Ярослав
05.08.2016
10:44:39

Aleh
05.08.2016
10:45:15
Так это, если ты опишешь метод как
staticMethod<T extends Foo>(): T

Artur
05.08.2016
10:45:19
Этиз классов может быть сотня. Они должны знать о реализации методов базового класса, но никакие другие интерфейсы не должны.

Aleh
05.08.2016
10:45:32
А в реализации будет return new this или как там
То ts сам не зарулит?

Artur
05.08.2016
10:45:47
Нет, в реализации будет логика гораздо сложнее.

Aleh
05.08.2016
10:46:07
Реализация возвращает не себя?

Artur
05.08.2016
10:46:09
Что-то вроде вызова через стор (WeakMap, к примеру)

Aleh
05.08.2016
10:46:24
Да хоть хттп запрос, на выходе что?

Artur
05.08.2016
10:46:26
Но возвращать всегда будет new Child(...)