@typescript_ru

Страница 375 из 669
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
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
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#src=declare%20const%20a%3A%20ReadonlyArray%3C%5Bnumber%2C%20string%5D%3E%0A%0Aconst%20%5Bn%2C%20s%5D%20%3D%20a%0A

Дмитрий
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
А кто уже щупал https://nestjs.com/ ? Есть отзывы?
я юзаю в продукшоне. даже выступал с докладм по nestjs. оч рекомендую

Denis
14.10.2017
10:57:57
я юзаю в продукшоне. даже выступал с докладм по nestjs. оч рекомендую
Основная фишка это di и форс структуры проекта ?

Ostap
14.10.2017
10:58:37
Основная фишка это di и форс структуры проекта ?
из основного да. но есть куча очень ужобных плюшек

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
Где найти какие браузеры покрываются определенным таргетом в ts?
Я короче о том что по-моему вопрос не должен так ставиться. Компат тейблы есть на фичи. Сообщением выше такой дали.

Andrey
14.10.2017
16:25:11
Я короче о том что по-моему вопрос не должен так ставиться. Компат тейблы есть на фичи. Сообщением выше такой дали.
Почему? Вот я понимаю, когда в бабеле ты собираешь под браузеры. Вот мне плевать в какой стандарт соберётся всё. Главное, чтобы все браузеры, оторые мне нужны поддерживали. Но и собирать под es3 неохота(если грубо говорить).

Vlad
14.10.2017
16:25:23
Зачем может потребоваться ответ на ваш вопрос? Es5 должен быть везде. Es6 частично. Насколько частично Понятнл из страницы что дают выше

А ок. Грубо говоря вы хотите чтобы ваще приложение работало в chrome 60+, например.

Хз. Осознать все фичи es6 и глянуть Компат тейбл выше :)

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

Andrey
14.10.2017
16:35:04
в бабеле мы берем инфу о поддержке фич из того же compat-table, если речь о preset-env
Верно, но таргет на браузеры проще для восприятия. Тебе не надо мониторить что поддерживают браузеры.

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

Friedrich
15.10.2017
05:20:21
Где найти какие браузеры покрываются определенным таргетом в ts?
Нигде. Таргеты вообще не связаны с поддержкой браузерами. Тебе больше интересно "libs": из tsconfig.

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
Да. Зачем сделали реализацию, которая совершенно не нужна на практике.
делаешь модуль для ноды. target=es2016, module=umd pretty=true и получаешь хороший код на выходе и вполне читаемый который работает с commonjs и require

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

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