
Vitaliy
13.04.2018
13:00:30

Ivan
13.04.2018
13:01:15
ну не any
ну что-нибудь
ну чтобы smartcast не врубился

Google

Ivan
13.04.2018
13:01:34
а то он скотина преобразует x просто в D
в общем там any не нужно

Vitaliy
13.04.2018
13:03:05

Mark
13.04.2018
13:03:25
я руками прописываю эти поля
ну просто заполняю
ни как такое низя :(

Vitaliy
13.04.2018
13:10:04
а чем решение выше не подходит?
https://i.gyazo.com/35390e7e2616a7c243c40c3104d3c94d.png
можно чуть-чуть задублировать
https://i.gyazo.com/aaf922ae3e424cd66986c29216b32214.png

Mark
13.04.2018
14:20:21
Спасибо :)
я просто думал одним интерфейсом обойтись

Vlad
13.04.2018
14:58:20
Да можно вообще без интерфейсов обойтись.

Google

Vlad
13.04.2018
15:13:38
Хотя не получится. Вот решение, которое работает в точности как надо. Оно чуть посложнее.
http://www.typescriptlang.org/play/#src=function%20thing()%20%7B%0D%0A%20%20%20%20return%20%7B%20d%3A%201%20%7D%0D%0A%7D%0D%0A%0D%0Ainterface%20A%20%7B%20a%3A%20number%20%7D%0D%0Ainterface%20B%20%7B%20b%3A%20number%20%7D%0D%0Ainterface%20C%20%7B%20c%3A%20number%20%7D%0D%0Ainterface%20D%20%7B%20d%3A%20number%20%7D%0D%0A%0D%0Atype%20M%20%3D%20(A%20%26%20Partial%3CB%20%26%20C%20%26%20D%3E)%0D%0A%20%20%20%20%7C%20(B%20%26%20Partial%3CA%20%26%20C%20%26%20D%3E)%0D%0A%20%20%20%20%7C%20(C%20%26%20Partial%3CA%20%26%20B%20%26%20D%3E)%0D%0A%20%20%20%20%7C%20(D%20%26%20Partial%3CA%20%26%20B%20%26%20C%3E)%3B%0D%0A%20%20%20%20%0D%0Alet%20x%20%3D%20thing()%3B%0D%0A%0D%0Alet%20y%3A%20M%3B%0D%0Ay%20%3D%20x%3B%0D%0A%0D%0Aconsole.log(y.d)%3B

andretshurotshka?❄️кде
13.04.2018
16:43:57
надо остальные поля сделать как undefined тип
и перечислить через |

Mark
13.04.2018
16:44:44
а можно пример)?

andretshurotshka?❄️кде
13.04.2018
16:44:48
а
могут быть все четыре поля?
да вроде это то что надо

Mark
13.04.2018
16:49:19

andretshurotshka?❄️кде
13.04.2018
16:49:59
а это не работает?

Vlad
13.04.2018
19:40:13
А хотите решение повеселее?
Лучше стало, правда? :)

Mark
13.04.2018
19:42:56
тут в объяснения происходящего сам черт ногу сломить...

Vlad
13.04.2018
19:43:46
Попроще так попроще. Теперь знак ? писать не надо ;)
Работает оно так.
1) "K extends keyof A" - К подмножество ключей типа А, где А - параметер Has.
2) Partial<A> - это просто, делает все свойства типа A опциональными.
3) { [key in K]: A[K] } - определяет новый тип, в котором будет ровно такие элементы, которые заданы параметром K, то есть один.
4) A[K] извлекает из типа А тип его мембера K.

Google

Vlad
13.04.2018
19:47:18
5) Пересекаем типы при помощи &, и неопциональный параметр перетирает опциональный.
Ключевые слова - "mapped types".
Без этого - только руками четыре интерфейса написать. Но не знаю, ИМХО это совсем не проще, когда в TS такие замечательные штуки есть.
Короче, вот это заклинание Has заботает независимо от наших знаний о нем, так что можно его один раз скопипастить и расслабиться. :)
И вот еще как можно:
type X = Has<'a'|'b', A> | Has<'b'|'c', A>;
В X либо определены а и b, либо b и c.
а это не работает?
Нет, первый мой вариант не работал. Ломается если задать два мембера сразу, т.е. например { a : "1", b : "1" }

Oleg
13.04.2018
21:29:15
А встроенный Pick не то же самое делает, что и Has?

Vlad
13.04.2018
21:29:37
Хм.

Oleg
13.04.2018
21:30:10
type Pick<T, K extends keyof T> = { [P in K]: T[P]; };

Vlad
13.04.2018
21:30:20
Да, вроде ровно то же самое.

Morsik
13.04.2018
21:30:23
другое
has делает все | undefined, кроме нужного поля
а, стоп

Vlad
13.04.2018
21:31:49
type Has<K extends keyof A, A> = Partial<A> & Pick<A, K>
Вот так они относятся.
С Pick оно попроще как-то выглядит, действительно.
Ну и тогда параметры разверуть.
type Has<A, K extends keyof A> = Partial<A> & Pick<A, K>
Вот, так хорошо.

Oleg
13.04.2018
21:37:18
В 2.8 кажется завезли, пачку удобных дженериков

Дмитрий
14.04.2018
04:25:49
Я не понимаю почему в тс в таком восторге от спорных эзотерических конструкций, больше напоминающих черновики по матану

Google

Дмитрий
14.04.2018
04:28:47
Напишите уже наконец майнкрафт на тс выражениях, к чему все эти полумеры

Gleb
14.04.2018
04:29:08
Да херня , потом все равно сидишь в рекомпозе генерики подтыкаешь типами чтобы хоть что то вывести

Дмитрий
14.04.2018
04:29:24
Ну вот да

Gleb
14.04.2018
04:30:32
у меня большой сравнительно проект и я брал его из за количества только либ, в итоге я оч устал подтыкать генерики прям это уже заколебывает и все равно нет нет да не выведутся типы в конце композиции

Vlad
14.04.2018
04:30:32
Это вполне естественно. Трудно быть в восторге от вещей, смысла и предназначения которых не понимаешь, правда ведь?

Gleb
14.04.2018
04:31:30
Еще раз - смыл в количестве тайпингов для либ

Дмитрий
14.04.2018
04:38:07
Вы уже два дня решаете проблему которой просто нет

Vlad
14.04.2018
04:38:15
Мне в свою очередь не очень понятно, что в mapped types такого непонятного и сложного. И как в принципе можно предъявлять претензии к наличию фич, предназначенных в первую очередь для авторов фреймворков и библиотек. Не нравится - не пользуйся.

Дмитрий
14.04.2018
04:38:51
Братан, забудь слово "не понятно", поверь все всё прекрасно понимают

Vlad
14.04.2018
04:39:51
Братан - ты ты кто, Иисус Христос, чтобы тебе верить? :)

Дмитрий
14.04.2018
04:40:03
Да
Какой вопрос такой и ответ, сорян
Я предъявляю претензии к глобальному направлению движения проекта в таких моментах, потому что это потом сказывается на всех
Подобные порывы ПОСЧИТАТЬ объекты выглядят как надпись говном на стене извиняюсь за прямоту

Vlad
14.04.2018
04:41:26
Не понимаю претензии, и извини - совсем не вижу, как это может отрицательно сказаться «на всех».

Дмитрий
14.04.2018
04:41:46
вроде бы и понятно что автор имел ввиду, но читать всё равно не приятно
Потому что все насмотрятся на подобный трэш и начинают думать что это нормально и правильно и так стоит делать
А то что тут два дня пытаются юзать объекты не по назначению к сожалению никто не скажет

Vlad
14.04.2018
04:43:23
Ну, этого бы я не опасался. У большинства заметные проблемы с пониманием, как эти конструкции в принципе работают. :)
И нужны они, ещё раз, в первую очередь авторам фреймворков и библиотек.

Google

Дмитрий
14.04.2018
04:44:33
В первую же очередь они им не нужны

Vlad
14.04.2018
04:45:03
Ну вот тут уже дай мне, как такому автору, самому решать.

Дмитрий
14.04.2018
04:45:23
Чем меньше подобного обмазывания объектами в библиотеках тем проще и надежнее их типизация
То за всех говоришь то вдруг за себя и обратно
Еще раз - это паршивая практика
Очень

andretshurotshka?❄️кде
14.04.2018
04:46:45
и я просто тайпинги пишу

Дмитрий
14.04.2018
04:47:10
Забиться в угол и рыдать, естественно

Vlad
14.04.2018
04:47:26
Да нет, это ты какой-то демагог. Вообще непонятно, зачем ты вот это все говоришь :)

Дмитрий
14.04.2018
04:47:37
Прецеденты не являются оправданием для существования же

Vlad
14.04.2018
04:48:21
«Вот это плохая практика» - какая блин из практик там плохая? Зависимые типы? Да неужели? :)

Дмитрий
14.04.2018
04:48:36
ЗАВИСИМЫЕ ТИПЫ
АААА
прекрати плиз
Нет, ты серьезно так думаешь?

Vlad
14.04.2018
04:49:34
С тобой там вообще все в порядке? :)

Дмитрий
14.04.2018
04:49:40
Ты реально решил что забацал сейчас зависимые типы, в тайпскрипте?

Vlad
14.04.2018
04:49:53
Ой, сколько пафоса :)