
Aleh
09.08.2016
18:44:19
чет тупанул)

Ярослав
09.08.2016
18:49:37
Он не знает

Aleh
09.08.2016
18:51:46
почему же, если там указано что-то типа {[s: string]: Value}

Google

Ярослав
09.08.2016
19:33:10
Потому что это указывает на доступ по индексу, но не по итератору
Итератор вы можете определить через Symbol.iterator и возвращать оттуда что душе угодно
for...of использует итератор
Так понятнее?

Vladimir
09.08.2016
19:39:48
и в чем проблема?

Ярослав
09.08.2016
19:41:24
The left-hand side of a 'for...of' statement cannot use a type annotation
это вот еще почему? типа активное автоопределение?

Vladimir
09.08.2016
19:42:08
ну это объяснение явно не причем

Ярослав
09.08.2016
19:42:42
Вполне логичное объяснение

Aleh
09.08.2016
19:42:54

Ярослав
09.08.2016
19:43:08
Нет

Aleh
09.08.2016
19:43:17
объект с итератором не подойдет под этот тип
почему же, если там указано что-то типа {[s: string]: Value}

Vladimir
09.08.2016
19:43:51
не вижу логики. Очевидно, что в левой части нельзя ставить аннотацию, потому что ее всегда можно вывести из правой части

Google

Aleh
09.08.2016
19:44:15
почему всегда ее можно вывести?

Vladimir
09.08.2016
19:45:01
эмм, но это очевидно так. Если справа Array<T>, то слева T

Aleh
09.08.2016
19:45:05
с такой логикой у const тоже не должно быть аннотаций)
а если any?

Vladimir
09.08.2016
19:45:49
да хз, это же вы тайпскрипт используете

Ярослав
09.08.2016
19:45:49

Vladimir
09.08.2016
19:45:55
во Flow можно
)

Ярослав
09.08.2016
19:46:23
при этом итерировать объект можно независимо от оператора индекса

Aleh
09.08.2016
19:47:13
итого, что может быть в объекте?

Ярослав
09.08.2016
19:48:09
итого, что может быть в объекте?
да пофигу что там может быть. Он может вообще не поддерживать оператор индекса, но поддерживать итератор. Это ортогональные операции

Aleh
09.08.2016
19:48:17
я все равно не понимаю, в чем разница между let a of someHell и например let a = someOtherHell()
почему в одном случае нельзя, а в другом можно)

Ярослав
09.08.2016
19:49:26
Читай про итераторы в ООП

Vladimir
09.08.2016
19:49:47
Object.values и должен давать Iterable<any>

Ярослав
09.08.2016
19:50:12
ANY

Vladimir
09.08.2016
19:50:26
вмсмысле Iterator

hlomzik
09.08.2016
19:50:48
да боже ж ты мой! да! может быть любой итератор, который вернет любую фигню. и я хочу, чтобы в этом цикле мне из итератора приходила строка, например. и плевать, что тайпскрипт при компиляции не проверит, точно ли итератор возвращает строку. он хотя бы проверит, что внутри у меня используется точно строка

Google

Vladimir
09.08.2016
19:51:05
хотя для {[s: string]: Value} можно сделать исключение

hlomzik
09.08.2016
19:51:30
да и для итераторов можно сделать обработку ситуаций. предполагать, что там T из { [s: string]: T }, а если там что-то хитрее, то сам укажешь

Aleh
09.08.2016
19:51:45

Ярослав
09.08.2016
19:52:20

Aleh
09.08.2016
19:52:46
оставлять any совсем отстойное поведение

hlomzik
09.08.2016
19:53:22
а итератор, наверное, в интерфейсе можно определить. тут не уверен, ну да не важно

Ярослав
09.08.2016
19:53:52
Лол

hlomzik
09.08.2016
19:54:04
проблема в том, что я ХОЧУ указать ТИП переменной, в которую кто-то там будет что-то пихать

Дмитрий
09.08.2016
19:54:14
"Пара слов о том, почему система типов в typescript — это боль"

hlomzik
09.08.2016
19:54:14
плевать на итератор и прочее

Ярослав
09.08.2016
19:54:33
Ну так ниже в теле цикла сделай ей каст в нужный тип

hlomzik
09.08.2016
19:54:34
почему при декомпозиции параметров возникают проблемы с TS — понятно
а здесь — непонятно
вот мой вопрос, который за эти часы не изменился

Vladimir
09.08.2016
19:55:17
все норм, если o - Iterable<string>

hlomzik
09.08.2016
19:55:26
не норм
The left-hand side of a 'for...of' statement cannot use a type annotation
это вот еще почему? типа активное автоопределение?

Google

hlomzik
09.08.2016
19:55:50
для тайпскрипта не норм

Vladimir
09.08.2016
19:55:52
потому что ts - говно
а по сути - норм

Ярослав
09.08.2016
19:56:51
Потому что этот тип никак нельзя вывести на этапе парсинга тайпскрипта. Так понятнее?

Vladimir
09.08.2016
19:57:03
почему нельзя? можно
но здесь речь не о выводе типа, а о том чтобы его руками указать
это просто не должно быть нужно (если справа не Iterable<any>)

hlomzik
09.08.2016
19:58:21
и в 99% вывести можно
а справа у меня Object.values, который тоже идиот
потому что для типов без указания индексного параметра он откатывается к any
а указание индексного параметра превращает объект со строгими ключами в хэш, для которого любой ключ подходит

Vladimir
09.08.2016
20:00:17
а что еще там может быть?

hlomzik
09.08.2016
20:00:24
где там?

Vladimir
09.08.2016
20:00:32
> @hlomzik
потому что для типов без указания индексного параметра он откатывается к any
там где any

hlomzik
09.08.2016
20:00:44
values<T>(o: { [s: string]: T }): T[];
values(o: any): any[];
вот определения из lib.es2017.object.d.ts

Vladimir
09.08.2016
20:01:21
ну все верно
лучше сделать вроде нечего

Google

hlomzik
09.08.2016
20:01:46
проработать работу с объектами

Vladimir
09.08.2016
20:02:11
как, например?

hlomzik
09.08.2016
20:02:27
а указание индексного параметра превращает объект со строгими ключами в хэш, для которого любой ключ подходит

Aleh
09.08.2016
20:02:33
ну да, у типа иметь операторы для получения полей

hlomzik
09.08.2016
20:03:13
в итоге для объекта типа { required: string[], optional: string[] } нельзя применять методы, принимающие объект как хэш

Vladimir
09.08.2016
20:03:32
естественно
это в этом же суть хэшей

hlomzik
09.08.2016
20:04:07
в чем?
Object.values пригоден только для абстрактных хэшей, в которых может быть тысяча произвольных полей?
вам можно, а вам нельзя?)

Vladimir
09.08.2016
20:05:03
он применим и объектам, просто ничего кроме any гарантировать нельзя

hlomzik
09.08.2016
20:05:30
я могу гарантировать, что в этом объекте всего 10 полей, и у них у всех такой вот тип :)
ладно, можно подумать еще над структурой

Vladimir
09.08.2016
20:05:43
но нет способа описать это

hlomzik
09.08.2016
20:05:44
проблема мелкая

Aleh
09.08.2016
20:05:57

hlomzik
09.08.2016
20:06:03
кажется, есть :) сейчас попробую

Ярослав
09.08.2016
20:06:10
https://github.com/Microsoft/TypeScript/issues/3500

hlomzik
09.08.2016
20:06:12
через enum

Vladimir
09.08.2016
20:06:14
гарантировать можно, только если можно это описать

Ярослав
09.08.2016
20:06:17
вот вам ответ от авторов

Aleh
09.08.2016
20:06:24
если у нас класс с 2 полями string и 1 number, то вполне логично на values кидать [string, string, number]