@typescript_ru

Страница 34 из 669
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
А React у нас с Flow оказывается работает... разочарование месяца...
Это было вполне логичным решением свой же продукт интегрировать с другим своим продуктом

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
Они немножечко несовместимы.
Я не вникал, но в ts есть конструкция type, например

Artur
05.08.2016
08:42:34
Есть

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

Google
hlomzik
05.08.2016
08:57:42
import * as _ from 'lodash'; ... _.groupBy(xs, x => x.smth)
Да, так и решил. Но дальше тайпскрипт совсем пошел с ума сходить

Artur
05.08.2016
09:04:46
Flow это эти вот PropTypes?
Нет, PropTypes для рантайм проверки. При исопльзовании TS и Flow они не так чтобы прям обязательны.

Андрей
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
Можно так сделать Child.create<Child>() но это будет оверхед
а разве можно параметры в дженериках использовать для new?

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 если ты скастишь объект к какому то классу, у него не появятся методы этого класса, нахуя.

Саторин
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
any any any и не паримся
Я как раз парюсь, потому что мне нужна нормальная поддержка в IDE.

как тебе тогда function baz<T>(cls): T { return cls.baz() as T }
Нет проблемы T вынести на уровень класса Foo<T>

Саторин
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 получается.

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
Я тебя понял. Но мне надо иметь всю эту информацию на уровнее определения класса, а не в скомпонованном через build объекте. Это, в общем-то, почти тот же самый mixin получается.
обычно делают интерфейс, который наследует от всех возможных классов-миксинов, а потом обозначают переменную, которая имплементирует этот интерфейс

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(...)

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