Size: a a a

JavaScript — русскоговорящее сообщество

2020 May 26

AK

Alex Kaz in JavaScript — русскоговорящее сообщество
Иван
не устану повторять. для этого есть тип unknown
можно поподробнее? я правда не очень понимаю как приведение типа от unknown к чему-то еще может упростить жизнь. может подтянуть типы под либу будет лучше?
источник

И

Иван in JavaScript — русскоговорящее сообщество
Alex Kaz
можно поподробнее? я правда не очень понимаю как приведение типа от unknown к чему-то еще может упростить жизнь. может подтянуть типы под либу будет лучше?
any — это буквально что угодно. Функция, которая принимает что угодно и возвращает что угодно, в то же время все примитивы и все возможные объекты со всеми возможными полями. К any ты можешь обратиться как угодно и взять оттуда что угодно.

Unknown — неизвестный тип. Чтобы обратиться к unknown.foo, сначала нужно явно проверить в рантайме, что у это сущности есть поле foo. Чтобы сделать unknown(), нужно явно проверить в рантайме, что это функция.

В этом различие. Any позволяет делать что угодно без проверок, unknown не позволяет делать ничего, пока ты явно не проверишь, что обращение будет безопасным.
источник

И

Иван in JavaScript — русскоговорящее сообщество
Alex Kaz
как будто ts избавляет тебя от проверки типов самому. ты же можешь писать юнионы в типах аргументво функции, которые проверять должен внутри.
Ну да. И ts говорит тебе человеческим языком, где нужно проверить, где не сходится, где нужно сделать явное приведение. Если ты не используешь any, конечно же)
источник

И

Иван in JavaScript — русскоговорящее сообщество
Иван
any — это буквально что угодно. Функция, которая принимает что угодно и возвращает что угодно, в то же время все примитивы и все возможные объекты со всеми возможными полями. К any ты можешь обратиться как угодно и взять оттуда что угодно.

Unknown — неизвестный тип. Чтобы обратиться к unknown.foo, сначала нужно явно проверить в рантайме, что у это сущности есть поле foo. Чтобы сделать unknown(), нужно явно проверить в рантайме, что это функция.

В этом различие. Any позволяет делать что угодно без проверок, unknown не позволяет делать ничего, пока ты явно не проверишь, что обращение будет безопасным.
если продолжить рассуждать на эту тему, то any и unknown в некотором смысле прямо противоположны.

any говорит компилятору “забей хуй, мне не нужна твоя помощь, я умнее тебя и всех тут собравшихся. я знаю, что делаю. выключаем тайпскрипт”.

а unknown, в свою очередь, говорит компилятору “чёт страшно, я вот вообще не уверен в этом коде, поэтому давай, помогай на полную катушку. включай все ограничения, что у тебя есть, чтобы я не наебался”
источник

AK

Alex Kaz in JavaScript — русскоговорящее сообщество
Иван
any — это буквально что угодно. Функция, которая принимает что угодно и возвращает что угодно, в то же время все примитивы и все возможные объекты со всеми возможными полями. К any ты можешь обратиться как угодно и взять оттуда что угодно.

Unknown — неизвестный тип. Чтобы обратиться к unknown.foo, сначала нужно явно проверить в рантайме, что у это сущности есть поле foo. Чтобы сделать unknown(), нужно явно проверить в рантайме, что это функция.

В этом различие. Any позволяет делать что угодно без проверок, unknown не позволяет делать ничего, пока ты явно не проверишь, что обращение будет безопасным.
const valueUnknown: unknown = undefined;
const valueObject = valueUnknown as { value: number };
console.log(valueObject.value);

будет здесь ошибка компиляции ts -> js?
источник

И

Иван in JavaScript — русскоговорящее сообщество
Alex Kaz
можно поподробнее? я правда не очень понимаю как приведение типа от unknown к чему-то еще может упростить жизнь. может подтянуть типы под либу будет лучше?
и “либа” тут ни при чём. ответ от сервера — это unknown. потому что сегодня по этому урлу бэк отдаёт массив юзеров, а завтра будет отдавать ассоциативный массив юзеров. модуль, который разрабатывает сосед по парте на js — это unknown. потому что нет аннотаций типов, статически невозможно вычислить, что будет отдавать функция someModule.getUser() — юзера, null или строку
источник

И

Иван in JavaScript — русскоговорящее сообщество
Alex Kaz
const valueUnknown: unknown = undefined;
const valueObject = valueUnknown as { value: number };
console.log(valueObject.value);

будет здесь ошибка компиляции ts -> js?
не будет
источник

И

Иван in JavaScript — русскоговорящее сообщество
Alex Kaz
const valueUnknown: unknown = undefined;
const valueObject = valueUnknown as { value: number };
console.log(valueObject.value);

будет здесь ошибка компиляции ts -> js?
ты же явно своими руками скастовал к объекту
источник

AK

Alex Kaz in JavaScript — русскоговорящее сообщество
Иван
не будет
тогда я не понимаю твоего мессаджа по поводу any vs unknown
источник

И

Иван in JavaScript — русскоговорящее сообщество
Alex Kaz
тогда я не понимаю твоего мессаджа по поводу any vs unknown
const valueUnknown: unknown = undefined;
const valueObject = valueUnknown
console.log(valueObject.value);


вот тут будет ошибка
источник

И

Иван in JavaScript — русскоговорящее сообщество
Alex Kaz
тогда я не понимаю твоего мессаджа по поводу any vs unknown
const valueUnknown: any = undefined;
const valueObject = valueUnknown
console.log(valueObject.value);


а тут — нет
источник

AK

Alex Kaz in JavaScript — русскоговорящее сообщество
Иван
и “либа” тут ни при чём. ответ от сервера — это unknown. потому что сегодня по этому урлу бэк отдаёт массив юзеров, а завтра будет отдавать ассоциативный массив юзеров. модуль, который разрабатывает сосед по парте на js — это unknown. потому что нет аннотаций типов, статически невозможно вычислить, что будет отдавать функция someModule.getUser() — юзера, null или строку
ты меня, конечно, извини, но весь смысл этой статический типизации состоит в том, чтобы знать, что там делает сосед по парте. и по хорошему, структуры с бека также должны быть тмизированы
источник

RS

Rustam Sahatov in JavaScript — русскоговорящее сообщество
Я вот, кстати, не вижу выхода, кроме как использовать any там, где данные динамически создаются из инпутов(которые тоже динамически генерятся). Потому что хз че я получу
источник

AK

Alex Kaz in JavaScript — русскоговорящее сообщество
Иван
ты же явно своими руками скастовал к объекту
специально для тебя
const valueAny: any = undefined;
type ObjType<T> = T extends any ? T: never;
const valueObject: ObjType<{ value: number }> = valueAny;
console.log(valueObject.value);
источник

И

Иван in JavaScript — русскоговорящее сообщество
Alex Kaz
ты меня, конечно, извини, но весь смысл этой статический типизации состоит в том, чтобы знать, что там делает сосед по парте. и по хорошему, структуры с бека также должны быть тмизированы
я же специально написал: “сосед по парте пишет на js”. ну вот такой он молодец. или это third-party код. или это индусы-аутсорсеры
структуры с бэка — это конечно да. только как ты можешь гарантировать без проверки в рантайме, что бэк следует описанным структурам? что не раскатили новую версию бэка, забыв подсунуть схемы фронту?

тут, конечно, важно вовремя остановиться в недоверии ко всем и вся (к схемам, бэку, соседу), но суть, я думаю, понятна
источник

И

Иван in JavaScript — русскоговорящее сообщество
Rustam Sahatov
Я вот, кстати, не вижу выхода, кроме как использовать any там, где данные динамически создаются из инпутов(которые тоже динамически генерятся). Потому что хз че я получу
совершенно точно известно, что ты получишь. это unknown
источник

RS

Rustam Sahatov in JavaScript — русскоговорящее сообщество
Иван
совершенно точно известно, что ты получишь. это unknown
Лол
источник

..

. . in JavaScript — русскоговорящее сообщество
что значит это значение перед массивом или объектом
источник

RS

Rustam Sahatov in JavaScript — русскоговорящее сообщество
Я это знаю
источник

RS

Rustam Sahatov in JavaScript — русскоговорящее сообщество
Поэтому тупо any использую
источник