
Aleh
05.08.2016
10:46:55
Ну, так вроде ж норм должно быть

Artur
05.08.2016
10:47:02
Ну покажи, как :)

Aleh
05.08.2016
10:47:16
Тип возвращаемого значения явно укажи в реализации

Ярослав
05.08.2016
10:47:26
так а что не так то?
interface SuperAnimal extends Cat, Dog, Fish {}
var catdofi = extender(base, [Cat, Dog, Fish]) as SuperAnimal;

Google

Artur
05.08.2016
10:48:09
Нет
Базовый класс один
И мне не нужна двойная реализация типов.
Все равно от этого интерфейса надо класс наследовать.
Иначе ты не получишь внутри него доступ к родительским методам.
И мне это нужно именно в виде класса.

Ярослав
05.08.2016
10:50:17
как-то замутно у тебя на входе всё ))

Artur
05.08.2016
10:50:56
Статические методы всегда возвращают экземпляры класса наследника (или их массивы).
В наследниках могут быть переопределены родительские статические классы или определены новые, которые могут использоваться родительские.
Поэтому премиси не подойдут.
При этом, помимо статической реализации неких фабричных методов, есть определения в базовом классе, которые нужны дочерним классов при создании экземпляров.


Дмитрий
05.08.2016
10:55:51
class ConcreteCity {
constructor(public name:CityName) {};
}
const City:Enumero<ConcreteCity> = Enumero.onType(ConcreteCity)(city);
class Enumero <E> {
public static onType<U,V,W>(t:{new(params:V):U}):(mapObject:W)=>Enumero<U> {
return function(mapObject:W):Enumero<U> {
return new Enumero(R.mapObjIndexed((params:V):U=>new t(params),mapObject),mapObject);
}
}
Базовый класс - абстрактный Enumero<E>, передавая в него конструктор(одно название) какого-либо класса, мы определяем уже типизированную форму класса
Объявление типов вида
function(t:{new():U})
Означает, что эта функция принимает на вход конструктор типа, чем определяется типизированный инстанс класа
Сорян, я сейчас очень плохо соображаю, и формулирую слова) Но кажется говоря про
function getInstance() { return new static }
ты имел ввиду нечнто похожее

Artur
05.08.2016
10:59:05
Я на примере getInstance пытался объяснить о чем я говорю и как это может работать.

Google

Artur
05.08.2016
10:59:54
В ConcreteCity ты не можешь определить статическую функцию которая будет использовать статические методы базового класса, т.к. она у тебя ни от чего не унаследована.

Дмитрий
05.08.2016
11:05:54
Базовый класс - Enumero. Это абстрактный enum, короче.
ConcreteCity - это класс, который мы присылаем, чтобы сделать конкретную реализацию дженерик-класса. Класс именно, не объект.
ConcreteCity - это внешний объект. Наследует абстракцию объект City, вследствии чего мы получаем уже типизированный класс Enumero<ConcreteCity>, который использует любые поля базового класса и при этом обладает чёткой привязкой к посланному нами типу данных
Где-то в этом месте у typescript начинаются сильные проблемы с абстракцией, с трудом можно записать что хочется хотя бы даже в таком виде, так что других вариантов тут особо не будет

Artur
05.08.2016
11:09:42
Почему не будет? Вот же я рабочий пример на скрине показал.
А что касается Enumero, я пока не вижу, чтобы можно было в ConcreteCity написать статический метод, который использовал бы статический метод Enumero или хотя бы City.

Дмитрий
05.08.2016
11:14:22
Все просто. Мне эти методы не нужны в инстансе, т.к. он является объектом с данными.

Aleh
05.08.2016
11:16:05
@izatop http://www.typescriptlang.org/play/index.html#src=class%20Foo%20%7B%0A%09static%20someStatic%3CT%20extends%20Foo%3E()%3AT%20%7B%0A%09%09return%3B%0A%09%7D%0A%09foo()%20%7B%7D%0A%09bar()%20%7B%0A%09%09return%200%3B%0A%09%7D%0A%7D%0A%0Aclass%20Bar%20extends%20Foo%20%7B%0A%09static%20someStatic()%20%7B%0A%09%09return%20new%20Bar%3B%0A%09%7D%0A%09bar()%20%7B%0A%09%09return%201%3B%0A%09%7D%0A%09foobar()%20%7B%7D%0A%7D%0A%0Aconst%20a%20%3D%20Bar.someStatic()%3B%0A

Artur
05.08.2016
11:17:21
Нет, же, в someStatic внутри куча кода. Мне не надо ее переопределять. И таких someStatic'ов будет десяток. А наследников сотня. Мне сто реализаций одного и того же кода писать не надо :)

Aleh
05.08.2016
11:17:24
хотя эти статики вообще даже интерфейс при наследовании соблюдать не должны, потому что по факту не являются публичным интерфейсом
теперь ясно)

Artur
05.08.2016
11:18:38
Вопрос ведь стоит не в том, как получить инстанс нужного класса, а в том, как заставить TS выдать нужный тип :)

Дмитрий
05.08.2016
11:21:21
Ну так а чем передача конструктора не выдача?))
Мы не инстанцируем ничего нигде, мы просто передаём конструктор в генерик, тем самым определяя тип

Artur
05.08.2016
11:23:08
Тем, что она избыточна, нет?

Дмитрий
05.08.2016
11:30:14

Artur
05.08.2016
11:31:20
Ну ты можешь нормальный пример показать? Я потому что не вижу как это может работать как мне неадо.

Дмитрий
05.08.2016
11:31:25
Я просто только что проверил - приватные статические методы родителя спокойно вызываются, имея уже конкретный дженерик типа
Сейчас тогда, пол часа, поем)

Artur
05.08.2016
11:34:53
Приятного)
Интересно прям посмотреть.

Google

Artur
05.08.2016
12:11:16
Да, короче со статиками все плохо
Static members cannot reference class type parameters.
Жду твой пример.

Ҫѐҏӗѫӑ
05.08.2016
12:12:33
почему разочарование? радоваться надо!
я даж подкоммитил туда типизации чуток!
и еще буду!

Artur
05.08.2016
12:13:14
Ну в целом радуюсь, разочаровываюсь, потому что не на TS.
А хотя, в общем-то, хорошее перевешивает.

Ҫѐҏӗѫӑ
05.08.2016
12:18:33
вообще предлагаю подумать надо переименованием чата в TypeScript + Flow. или плохая идея? или там Typed JavaScript
хотя мне в принципе и так норм. но подумать все равно предлагаю

Roman
05.08.2016
12:19:36

Aleh
05.08.2016
12:20:41

Artur
05.08.2016
12:25:27
Можно

Ҫѐҏӗѫӑ
05.08.2016
12:27:02
ping @vyorkin
ты не против?

Aleh
05.08.2016
12:42:05
норм

Ҫѐҏӗѫӑ
05.08.2016
12:42:08
линк наверное пока придется оставить

Artur
05.08.2016
12:54:56
?

Vladimir
05.08.2016
12:55:44
Что случилось??

Artur
05.08.2016
12:55:58
TS и Flow подружились

Vladimir
05.08.2016
12:56:38
неправда

Google

Vladimir
05.08.2016
12:56:48
ts - говно, flow рулит

Roman
05.08.2016
12:57:00
= ❤️ надо было добавить

Ҫѐҏӗѫӑ
05.08.2016
13:00:20
я вообще рисовать не умею. вспомнил как pixlr эдитором пользоваться)

Aleh
05.08.2016
13:00:51
можно в имя чата)
вот так типа
ваще огонь

Sergey
05.08.2016
13:14:54

kaflan
05.08.2016
13:43:21
флоу ругают =)

Sergey
05.08.2016
13:44:14
Ну вы со стикерами осторожнее, не дома же )

Artur
05.08.2016
14:06:05
А какой в итоге в TS 2 Beta this function type синтаксис?
WebStorm заявляет о поддержке этой фичи (в том числе), но подсказки при (this:Type) не выдает.

Aleh
05.08.2016
14:06:53
кстати да, я чет пробовал по-разному и не работало

Artur
05.08.2016
14:10:26
Ну вроде компилится
function bar(this:Foo):number {
return this.count();
}
Но идешка мне в лучшем случае в this подсовывает any.
class Foo {
count():number {
return 1;
}
}
const bar = function (this:Foo) { return this.count() }.bind(new Foo);
console.log(bar());
Работает. Но IDE не внемлет.
Может эту штуку надо как-то включить...
При этом 1.8 компилер внутри по прежнему
Но это нормально

Aleh
05.08.2016
14:35:09
а можно описать тип функций с заданным this?

Google

Aleh
05.08.2016
14:36:28
type F = {
(this: TestThis): void;
};
const f: F = function() {
//this defined here
}

Artur
05.08.2016
14:38:50
О!


Дмитрий
05.08.2016
14:40:39
Задача оказалась чуть сложнее, чем для перерыва на обед?
class Foo {
constructor(protected id:number){}
public static getList<U,W>(construct:{new(storage:W):U}):(f:W,l:W)=>U[] {
return function(first:W,last:W):U[] {
return [new construct(first),new construct(last)];
}
}
}
class Bar extends Foo {
constructor(public hello:string) {
super(Math.random());
}
static getIds() {
let val = Foo.getList(Bar)('Moscow','New York');
console.log(val.map(x=>[x.hello,x.id]));
return val;
}
}
Bar.getIds();
http://www.typescriptlang.org/play/index.html#src=class%20Foo%20%7B%0A%09constructor(protected%20id%3Anumber)%7B%7D%0A%20%20%20%20public%20static%20getList%3CU%2CW%3E(construct%3A%7Bnew(storage%3AW)%3AU%7D)%3A(f%3AW%2Cl%3AW)%3D%3EU%5B%5D%20%7B%0A%20%20%20%20%20%20%20%20return%20function(first%3AW%2Clast%3AW)%3AU%5B%5D%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%5Bnew%20construct(first)%2Cnew%20construct(last)%5D%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%7D%0A%0Aclass%20Bar%20extends%20Foo%20%7B%0A%20%20%20%20constructor(public%20hello%3Astring)%20%7B%0A%20%20%20%20%20%20%20%20super(Math.random())%3B%0A%20%20%20%20%7D%0A%20%20%20%20static%20getIds()%20%7B%0A%20%20%20%20%20%20%20%20let%20val%20%3D%20Foo.getList(Bar)('Moscow'%2C'New%20York')%3B%0A%20%20%20%20%20%20%20%20console.log(val.map(x%3D%3E%5Bx.hello%2Cx.id%5D))%3B%0A%20%20%20%20%20%20%20%20return%20val%3B%0A%20%20%20%20%7D%0A%7D%0A%0ABar.getIds()%3B


Artur
05.08.2016
14:43:12
А в моем случае будут сотни и сотни Bar.getList(Bar)...

Дмитрий
05.08.2016
14:44:00
Ну погоди, я переписывал пример чисто с твоей картинки))

Artur
05.08.2016
14:44:48
В общем нет решения нифига.

Дмитрий
05.08.2016
14:44:51
И посмотри внимательно, там нет Bar.getList(Bar) и в этом вся фишка

Alexander
05.08.2016
14:45:21
Бля вы чего тут сделали
Какой флоу

Дмитрий
05.08.2016
14:45:36
Foo.getList(Bar)
Foo.getList(String)
Foo.getList(Number)
всё будет подхватываться автоматически