
Vlad
24.04.2018
05:24:03
Пример.

Alex
24.04.2018
05:24:30
new Some({ a, b })

Vlad
24.04.2018
05:24:35
Ща.
Тогда у нас некоторая проблема, которую мы попробуем решить :)

Google

Alex
24.04.2018
05:26:32
Т.е. В конструкторе что-то типа
constructor(props: IProps<T>)

Vlad
24.04.2018
05:28:36
Эту проблему удалось решить, пожертвовав точным типом мембера b.
Как оттипизировать "b" в классе, а не в сигнатуре, я не знаю. Идей нет.
Но от того, что работает typeof obj.a я сам офигел. Работает.
Этого _точно_ нет в документации, но это невероятно круто, и это укладывается в логику языка.

Alex
24.04.2018
05:33:12
Да в документации базовые примеры, многие вещи не очевидны

Vlad
24.04.2018
05:45:24

Дмитрий
24.04.2018
05:51:10
Никаких истерик сейчас конечно же не будет
Потому что с большой долей вероятности вы будете разбирать свою клинопись, матерясь, сами)
Но тогда переживать уже будет поздно

Vlad
24.04.2018
05:58:26
LOL :D
Нормально, разберем, не переживайте. ? Это довольно простой код для того, кто умеет его читать. Тем более для того, кто умеет его писать. Вопрос тренировки, в которой некоторые себе отказывают.

Google

Дмитрий
24.04.2018
07:22:03
К этому коду кстати особо претензий нет) Просто будет не лишним помнить, что чем меньше эзотерики в коде — тем проще поддерживать проект

Vlad
24.04.2018
07:24:59
Просто понятие эзотерики у нас немного разное.
Но шансов такое написать в гражданском проекте у разраба немного. Это все-таки очень далеко от шаблонной рекурсии С++, которую во-первых умелец может воткнуть куда угодно, и которая во-вторых вычислительно полна в момент компиляции.
И которая потому открывает врата в ад, а тут их нет.
Собственно, после С++ толковые авторы языков специально следят за тем, чтобы их система типов совершенно случайно не получилась вычислительно полна.
А посему - нехрен истерить. Все нормально.
Хотя, ацкий паттерн expression templates в C++ - это был весьма полезный трюк, который позволял делать частичные вычисления. ? Но в TS такого нет. Расслабьтесь.

D
24.04.2018
07:50:38
Вычислительна полна это по Тьюрингу? Тогда система типов тс именно к такой и относится

Vlad
24.04.2018
08:20:22

Alexander
24.04.2018
08:21:35
Влад, ты первый сказал, что не полна, так что бремя доказательства лежит на тебе

Vlad
24.04.2018
08:21:51
Жжоте :)

Alexander
24.04.2018
08:22:05
Давай пацан сказал — пацан доказал

Vlad
24.04.2018
08:25:32
Воздержусь ? Подожду, когда кто-нибудь машину Тьюринга на типах TS изобразит ? Или, на худой конец, нормальные алгорифмы Маркова - тодже сойдет ?
Али не пацаны? :)

Alex
24.04.2018
08:27:15
гоу усложним задачу, есть интерфейс с generic типом, нужно установить зависимость между его полями

Artur
24.04.2018
08:27:22

Vlad
24.04.2018
08:28:34
No fuckin way :)
Блядь, извращенцы. Все пропало. Она, по ходу, таки вычислительно полна.

Google

Artur
24.04.2018
08:31:35
Ну так а в чём печаль то?

Alexander
24.04.2018
08:34:10
Влад, ты не прав)

Vlad
24.04.2018
08:36:07
Ну, тикет интересный. С тем, насколько он действительно означает вычислительную полноту, мы разберемся на днях. Тут думать надо.
Это любопытнейший теоретический вопрос, практические выводы из которого рано или поздно последуют, и если она таки полна, то мало вам не покажется.

Vitaliy
24.04.2018
08:45:44
чекнул ваш пример

Vlad
24.04.2018
08:48:28
И он не проверяет точный тип переменной. Вижу.
А, ну понятно почему. keyof C это все ключи C, то есть, "g" | "k"
Соответственно, C[ typeof a ] это все типы этих свойств С, то есть number | string
Это конечно лучше, чем совсем ничего. Но недостаточно хорошо.
Чтобы был точный "g", надо писать extends. Что можно сделать только введя параметр шаблона.
Ну тогда ой - с конструктором так точно нельзя (ему давать параметры шаблона запрещено), и с фабричным методом create - тоже нельзя, там надо давать или все параметры шаблона, или ни одного, и если не дать ни одного, то С не выведется.

Aleh
24.04.2018
09:05:16

Vlad
24.04.2018
09:08:05
Виснуть будет)
Печаль не в этом. Если оно полно, то рано или поздно, начнут отжигать, как в С++. А вот этого никто не хочет. Поэтому автор тикета и открыл его с пожеланием сразу прикрыть лавочку.

Aleh
24.04.2018
09:09:01

Vlad
24.04.2018
09:09:47
чекнул ваш пример
Может, завтра что-нибудь еще придумаю. Но очень вряд ли. Есть ощущение, что этого сделать нельзя. Пусть какой-нибудь другой энтузиаст нас удивит.

Alex
24.04.2018
09:42:54

Aleh
24.04.2018
09:45:15
Омг

Alex
24.04.2018
09:47:37

Google

Alex
24.04.2018
09:49:18

andretshurotshka?❄️кде
24.04.2018
10:03:30
https://github.com/tycho01/typical

Игорь
24.04.2018
10:09:50
народ, а кто-то юзает тайпскрипт вместе с react-ом?

Alex
24.04.2018
10:09:56

Admin
ERROR: S client not available

Artur
24.04.2018
10:11:27
Обсуждали это уже

Alex
24.04.2018
10:11:36

Artur
24.04.2018
10:13:29
Но в целом тс все по делу ругается
Просто при создании объекта тип свойства выводится как string

Alex
24.04.2018
10:14:22
не, мне нужно было сделать класс в который передаётся generic тип, и проверить попарное соотвествие двух полей
с помощью Conditional Types получилось разложить map тип на возможные комбинации парных значений
т.е. тип <T>{ [K in keyof T]: T[K} } раскладывается в
{ a: T[typeof b], b: T[typeof a] }

Google

andretshurotshka?❄️кде
24.04.2018
10:17:52
field2
а все
понял

Alex
24.04.2018
10:20:02

andretshurotshka?❄️кде
24.04.2018
10:20:06
тайплевел упорин
можно же просто сделать апи попроще)

Alex
24.04.2018
10:20:18
почему field3 получил допустимость всех типов
ну у менва вариант или передать 3 генерика, или один
три передавать не очень удобно
т.к. они могут определиться по аргументам отданым в конструктор

andretshurotshka?❄️кде
24.04.2018
10:22:05
это для реакта что-то?

Alex
24.04.2018
10:22:49
да

andretshurotshka?❄️кде
24.04.2018
10:23:19
ну примерно для чего

Alex
24.04.2018
10:23:53

andretshurotshka?❄️кде
24.04.2018
10:24:15
в реакте как юзается?)

Alex
24.04.2018
10:24:21
я вчера кидал свою реализацию типизированной формы, народ поржал, ибо для каждого поля отдельно создавался типизированный объект
типа field1, field2 и тд

andretshurotshka?❄️кде
24.04.2018
10:24:30
а да)
ну так жди генериков для jsx

Alex
24.04.2018
10:25:14
теперь, будет <Field name={"field"}> и значение value сразу предопределится
оказывается Conditional Types очень мощная штука для разложения типа на микс других
мало того, позволяет достать generic из типа
как расширить один тип другим?