
Max
13.10.2017
13:37:31
@angular_ru есть

Igor
13.10.2017
16:31:05
А кто уже щупал https://nestjs.com/ ? Есть отзывы?

Дмитрий
13.10.2017
17:10:14
Ребята
Помогите

Google

Дмитрий
13.10.2017
17:10:16
https://www.typescriptlang.org/play/#src=declare%20const%20a%3A%20Readonly%3C%5Bnumber%2C%20string%5D%3E%0A%0Aconst%20%5Bn%2C%20s%5D%20%3D%20a%0A
што за фигня

Александр
13.10.2017
17:17:51
деструктуризация, а что не так то?
https://basarat.gitbooks.io/typescript/docs/destructuring.html

Aleh
13.10.2017
17:19:20
Readonly ломает массив, он вообще ничего хорошего с массивом сделать не может)

Олег
13.10.2017
17:22:41

Дмитрий
13.10.2017
17:27:40
Примерно в этом проблема
https://www.typescriptlang.org/play/index.html#src=declare%20class%20A%3CT%3E%20%7B%0A%20%20%20%20map%3A%20%3CR%3E(data%3A%20(data%3A%20Readonly%3CT%3E)%20%3D%3E%20R)%20%3D%3E%20R%0A%7D%0A%0Aconst%20a%20%3D%20new%20A%3C%5Bnumber%2C%20string%5D%3E()%0Aa.map((%5Bn%2C%20s%5D)%20%3D%3E%20(%7B%20n%2C%20s%20%7D))%0A
то есть Readonly там используется в функции-коллбеке map для того, чтобы не мутировать ненароком
Видимо, придется просто убрать readonly

Олег
13.10.2017
17:34:51
потому что это разные сигнатуры, массив и обьект

Дмитрий
13.10.2017
17:36:06
хммм

Google

Дмитрий
13.10.2017
17:36:27
это понятно тоже)

Олег
13.10.2017
17:36:27
type Readonly<T> = {
readonly [P in keyof T]: T[P];
};
это не может быть массивом

Дмитрий
13.10.2017
17:36:40
нуу да
да

Олег
13.10.2017
17:40:36
да
declare class A<T extends (ReadonlyArray<any> | Readonly<any>)> {
map: <R>(data: (data: T) => R) => R
}
const a = new A<[number, string]>()
a.map(([n, s]) => ({ n, s }))
const b = new A<{ n: number; s: string }>()
b.map(({n, s}) => ([ n, s ])
кек?

Дмитрий
13.10.2017
17:42:01
в классе T не обязательно массив
Прочитал невнимательно
Действительно
Только не защищает от перезаписи =)
Но всё равно спасибо
Возможно, вообще подход стоит изменить

Александр
13.10.2017
17:57:17
ухты какой интересный пример оказывается, там же риоднли кортеж не хочет деструктурировать
https://github.com/Microsoft/TypeScript/issues/17563


Дмитрий
13.10.2017
17:58:15
Я предложил решить проблему радикально
https://www.typescriptlang.org/play/index.html#src=declare%20class%20A%3CT%3E%20%7B%0A%20%20%20%20map%3A%20%3CR%3E(data%3A%20(data%3A%20Readonly%3CT%3E)%20%3D%3E%20R)%20%3D%3E%20R%0A%7D%0A%0Aclass%20Tuple%3CA%2C%20B%3E%20%7B%0A%20%20%20%20constructor(readonly%20a%3A%20A%2C%20readonly%20b%3A%20B)%20%7B%20%7D%0A%20%20%20%20chain%3CC%2C%20D%3E(fn%3A%20(a%3A%20A%2C%20b%3A%20B)%20%3D%3E%20Tuple%3CC%2C%20D%3E)%3A%20Tuple%3CC%2C%20D%3E%20%7B%0A%20%20%20%20%20%20%20%20return%20fn(this.a%2C%20this.b)%0A%20%20%20%20%7D%0A%20%20%20%20mapl%3CC%3E(fn%3A%20(x%3A%20A)%20%3D%3E%20C)%3A%20Tuple%3CC%2C%20B%3E%20%7B%0A%20%20%20%20%20%20%20%20return%20new%20Tuple(fn(this.a)%2C%20this.b)%0A%20%20%20%20%7D%0A%20%20%20%20mapr%3CD%3E(fn%3A%20(x%3A%20B)%20%3D%3E%20D)%3A%20Tuple%3CA%2C%20D%3E%20%7B%0A%20%20%20%20%20%20%20%20return%20new%20Tuple(this.a%2C%20fn(this.b))%0A%20%20%20%20%7D%0A%7D%0A%0Aconst%20a%20%3D%20new%20Tuple%3Cnumber%2C%20string%3E(2%2C%20'ok')%0Aa.chain((n%2C%20s)%20%3D%3E%20new%20Tuple('foo'%2C%20'bar'))%0A


Дмитрий
13.10.2017
18:03:16
и почему это не очень подходит
наверное
https://www.typescriptlang.org/play/index.html#src=type%20Stream%3CT%3E%20%3D%20(sink%3A%20(payload%3A%20T)%20%3D%3E%20void)%20%3D%3E%20(()%20%3D%3E%20void)%20%7C%20void%0Ainterface%20CombineLatest%20%7B%0A%20%20%3CT1%2C%20T2%3E%20(s1%3A%20Stream%3CT1%3E%2C%20s2%3A%20Stream%3CT2%3E)%3A%20Stream%3C%5BT1%2C%20T2%5D%3E%0A%20%20%3CT1%2C%20T2%2C%20T3%3E%20(s1%3A%20Stream%3CT1%3E%2C%20s2%3A%20Stream%3CT2%3E%2C%20s3%3A%20Stream%3CT3%3E)%3A%20Stream%3C%5BT1%2C%20T2%2C%20T3%5D%3E%0A%7D%0A%0Atype%20MapStream%20%3D%20%3CT%2C%20R%3E(fn%3A%20(data%3A%20Readonly%3CT%3E)%20%3D%3E%20R%2C%20stream%3A%20Stream%3CT%3E)%20%3D%3E%20Stream%3CR%3E%0A%0Adeclare%20const%20a%3A%20Stream%3Cnumber%3E%0Adeclare%20const%20b%3A%20Stream%3Cstring%3E%0Adeclare%20const%20combineLatest%3A%20CombineLatest%0Adeclare%20const%20map%3A%20MapStream%0A%0Aconst%20stream%20%3D%20combineLatest(a%2C%20b)%0A%0Astream((%5Ba%2C%20b%5D)%20%3D%3E%20%7B%0A%20%20%20%20a.toExponential()%0A%20%20%20%20b.concat()%0A%7D)%0A%0Amap((data)%20%3D%3E%20%7B%0A%20%20%20%20data%5B0%5D%20%3D%20123%20%2F%2F%20OK%0A%7D%2C%20stream)%0A%0Amap((%5Ba%2C%20b%5D)%20%3D%3E%20(%7B%20%2F%2F%20Not%20OK%0A%20%20%20%20a%2C%20b%0A%7D)%2C%20stream)%0A%0A

Google

Дмитрий
13.10.2017
18:04:27
При этом, собака, типы-то норм выводит потом

Дмитрий
13.10.2017
18:06:49
У тебя же rx, да?

Дмитрий
13.10.2017
18:07:18
ну так вышло, что нет
своя реализация

Дмитрий
13.10.2017
18:07:27
Аа, лол
ну в общем во всех реализациях есть возможность добавлять в combineLatest кроме стримов ещё и функцию-комбинатор

Дмитрий
13.10.2017
18:09:19
это да
которая будет вместо map в моем случае)
Это понятно
Но это уже другой вопрос
я не очень допираю, как это реализовать здесь, где стримы - это не полноценные обсерваблы, а простые функции
как понять, что последний аргумент - это project, если и он и стрим - это прост функции и всё, эээх
поэтому пока решил обычным map довольствоваться, а оно так рраз и прям под дых
Мда
В голове сложился костыль, в общем


Дмитрий
13.10.2017
18:17:06
которая будет вместо map в моем случае)
https://www.typescriptlang.org/play/index.html#src=type%20Stream%3CT%3E%20%3D%20(sink%3A%20(payload%3A%20T)%20%3D%3E%20void)%20%3D%3E%20(()%20%3D%3E%20void)%20%7C%20void%0Ainterface%20CombineLatest%20%7B%0A%20%20%3CT1%2C%20T2%2C%20O%3E%20(s1%3A%20Stream%3CT1%3E%2C%20s2%3A%20Stream%3CT2%3E%2C%20fn%3A%20(a%3A%20T1%2C%20b%3A%20T2)%20%3D%3E%20O)%3A%20Stream%3CO%3E%0A%7D%0A%0Atype%20MapStream%20%3D%20%3CT%2C%20R%3E(fn%3A%20(data%3A%20Readonly%3CT%3E)%20%3D%3E%20R%2C%20stream%3A%20Stream%3CT%3E)%20%3D%3E%20Stream%3CR%3E%0A%0Adeclare%20const%20a%3A%20Stream%3Cnumber%3E%0Adeclare%20const%20b%3A%20Stream%3Cstring%3E%0Adeclare%20const%20combineLatest%3A%20CombineLatest%0Adeclare%20const%20map%3A%20MapStream%0A%0Aconst%20stream%20%3D%20combineLatest(a%2C%20b%2C%20(a%2C%20b)%20%3D%3E%20new%20Tuple(a%2C%20b))%0A%0Aclass%20Tuple%3CA%2C%20B%3E%20%7B%0A%20%20%20%20constructor(readonly%20a%3A%20A%2C%20readonly%20b%3A%20B)%20%7B%20%7D%0A%20%20%20%20chain%3CC%2C%20D%3E(fn%3A%20(a%3A%20A%2C%20b%3A%20B)%20%3D%3E%20Tuple%3CC%2C%20D%3E)%3A%20Tuple%3CC%2C%20D%3E%20%7B%0A%20%20%20%20%20%20%20%20return%20fn(this.a%2C%20this.b)%0A%20%20%20%20%7D%0A%20%20%20%20mapl%3CC%3E(fn%3A%20(x%3A%20A)%20%3D%3E%20C)%3A%20Tuple%3CC%2C%20B%3E%20%7B%0A%20%20%20%20%20%20%20%20return%20new%20Tuple(fn(this.a)%2C%20this.b)%0A%20%20%20%20%7D%0A%20%20%20%20mapr%3CD%3E(fn%3A%20(x%3A%20B)%20%3D%3E%20D)%3A%20Tuple%3CA%2C%20D%3E%20%7B%0A%20%20%20%20%20%20%20%20return%20new%20Tuple(this.a%2C%20fn(this.b))%0A%20%20%20%20%7D%0A%20%20%20%20bimap%3CC%2C%20D%3E(fa%3A%20(x%3A%20A)%20%3D%3E%20C%2C%20fb%3A%20(x%3A%20B)%20%3D%3E%20D)%3A%20Tuple%3CC%2C%20D%3E%20%7B%0A%20%20%20%20%20%20%20%20return%20new%20Tuple(fa(this.a)%2C%20fb(this.b))%0A%20%20%20%20%7D%0A%20%20%20%20toJSON()%3A%20%7B%20readonly%20a%3A%20A%2C%20readonly%20b%3A%20B%20%7D%20%7B%0A%20%20%20%20%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20a%3A%20this.a%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20b%3A%20this.b%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%7D%0A%0Astream(tuple%20%3D%3E%20tuple.bimap(%0A%20%20%20%20a%20%3D%3E%20a.toExponential()%2C%0A%20%20%20%20b%20%3D%3E%20b.concat()%0A))%0A%0Amap(tuple%20%3D%3E%20tuple.mapl((_)%20%3D%3E%20123)%2C%20stream)%0A%0Amap(tuple%20%3D%3E%20tuple.toJSON()%2C%20stream)%0A%0A
добавил bimap и toJSON под кейсы, опять же всё тайпчекнулось)


andretshurotshka?❄️кде
13.10.2017
18:19:22
странно
тайпскрипт тайпчекается

Дмитрий
13.10.2017
18:19:44
?
Просто Tuple позволяет не пытаться усидеть на двух стульях сразу и запихнуть два типа в один массив
Плюс атомарные функции приятнее для тайпчекера

Google

Дмитрий
13.10.2017
18:32:29
Не хочется переусложнять
К тому же так теряется возможность более двух стримов комбинировать, а надо. Не хочется усложнять вдвойне
Пока что просто уберу ридонли и вернусь к этому позже
Но смысл мне понятен, конечно
Если будет время, подумаю в этом направлении
Спасибо

Дмитрий
13.10.2017
18:51:20
Tuple обобщается до структуры данных TupleN
И мне ещё ни разу не требовалось N больше четырёх, столько всего разом удобнее просто не мержить)

andretshurotshka?❄️кде
14.10.2017
08:29:40
?

Ostap
14.10.2017
10:18:04

Denis
14.10.2017
10:57:57

Ostap
14.10.2017
10:58:37

Tattobu
14.10.2017
10:58:50

Ostap
14.10.2017
11:01:49
пока записи нету :( http://vinnytsiajs.org

Andrey
14.10.2017
15:20:10
Где найти какие браузеры покрываются определенным таргетом в ts?

Vlad
14.10.2017
16:03:25
Es5 будет понят наверняка, разве нет?

Ҫѐҏӗѫӑ
14.10.2017
16:15:41
http://kangax.github.io/compat-table/es6/

Vlad
14.10.2017
16:23:39

Andrey
14.10.2017
16:25:11

Vlad
14.10.2017
16:25:23
Зачем может потребоваться ответ на ваш вопрос?
Es5 должен быть везде. Es6 частично. Насколько частично Понятнл из страницы что дают выше
А ок. Грубо говоря вы хотите чтобы ваще приложение работало в chrome 60+, например.
Хз. Осознать все фичи es6 и глянуть Компат тейбл выше :)

Andrey
14.10.2017
16:29:15
Удобство)

Ҫѐҏӗѫӑ
14.10.2017
16:34:20

Andrey
14.10.2017
16:35:04

Google

Ҫѐҏӗѫӑ
14.10.2017
16:37:44
короче если два последних, то es6. если ие, то es5

Friedrich
15.10.2017
05:20:21

Andrey
15.10.2017
05:21:46

Friedrich
15.10.2017
05:21:56
target это просто версия синтаксиса, так скажем. Всякие нюансы (например, поддерживает ли какой-то браузер стандартный Promise) не учитываются таргетом.
С помощью target ты говоришь компилятору, в какую версию синтаксиса ты хочешь скомпилировать код.
А с помощью libs ты ему говоришь, в каком окружении (с каким набором стандартных зависимостей) твой код будет выполняться.

Andrey
15.10.2017
05:22:53

Friedrich
15.10.2017
05:23:01
Это две разные вещи. Потому что либсы полифиллятся, а таргеты — нет.

Andrey
15.10.2017
05:23:43

Friedrich
15.10.2017
05:23:51
От прям воще как надо сделали. Лучше не сделать.

Andrey
15.10.2017
05:23:59
Зачем тогда к ней привязываться?

Friedrich
15.10.2017
05:24:48
Другой разговор, что можно поверх этого хозяйства добавить набор пресетов — типа, хром с 56 версии это target: ES6 + libs: ES2015.Promise и т.п.
Это можно добавить, конечно. Но ты всерьёз хочешь от разработчиков компилятора, чтобы они тебе ещё и базу совместимости для всяких говнобраузеров поддерживали?
Давайте лучше это будет отдельный тул со своей своевременно обновляемой базой.

Александр
15.10.2017
05:26:09

Andrey
15.10.2017
05:26:10

Friedrich
15.10.2017
05:26:27
Почему нет?
Потому что у разработчиков компилятора всё-таки есть и другие, ну, важные дела.