@typescript_ru

Страница 39 из 669
Aleh
09.08.2016
18:44:19
чет тупанул)

Если ты его укажешь, то тайпскрипт не сможет его нормально проверить. То есть по сути это будет кастинг любого типа к тому, который ты указываешь
ну, если ts знает, что в этом объекте есть какой-то value, который не подходит под тип, то логичнее тогда и кинуть ошибку

Ярослав
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
Вполне логичное объяснение

Ярослав
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
почему же, если там указано что-то типа {[s: string]: Value}
я понял. Вы думаете, что это показывает какие типы могут быть в объекте, но на самом деле, это показывает что может быть аргументом в операторе индекса ([]) и что результатом этого оператора

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

)

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

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

во Flow можно
что вполне логично

Ярослав
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:52:46
Но ведь нельзя это предполагать ?
если тип именно такой, то можно, если нет, тогда нужно указывать явно

оставлять any совсем отстойное поведение

hlomzik
09.08.2016
19:53:22
Но ведь нельзя это предполагать ?
во-первых, можно, почему нет? всегда можно откатиться к any

а итератор, наверное, в интерфейсе можно определить. тут не уверен, ну да не важно

Ярослав
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]

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