@typescript_ru

Страница 35 из 669
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
хотя мне в принципе и так норм. но подумать все равно предлагаю
учитывая что по флоу народа не наберется на отдельный чат, мысль здравая

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
Задача оказалась чуть сложнее, чем для перерыва на обед?
Ага, оно хорошо когда ты через потомков getList не вызываешь.

А в моем случае будут сотни и сотни 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) всё будет подхватываться автоматически

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