169 похожих чатов

Всем привет! когда уместно/оправданно использование оператора as ?? насколько я понимаю

этот оператор говорит TS что программист берет на себя ответственность

28 ответов

18 просмотров

const users = [] as User[] users.push(user) // ✅ users.push(5) // 🛑

а const users: User[] = [] не тоже самое делает?

type User = { id: number; name: string } type UsersMap = { [id: number]: User } declare const users: User[] const usersMap = users .reduce((acc, user) => ({ ...acc, [user.id]: user }), {} as UserMap)

то же самое, но немного иначе. в некоторых кейсах (как в примере выше) — не то же самое

не всегда переменная объявляется

да, в этом случае, как я понимаю, без as не обойтись

zamir- Автор вопроса

ммм, вот оно как, спасибо

это мощная штука в ловких руках. и очень опасная в неумелых) если нужно помочь тайпскрипту узнать о типах там, где он не может их вычислить (как в примере выше с редьюсом), то as очень хорош. но обращаться с ним нужно аккуратно — можно не заметить и внести расхождение между статическими типами и рантаймом

Есть какие-то рекомендации по этой теме?

zamir- Автор вопроса

ну я , стараюсь не использовать ее ваще, но в который раз в библиотеках выжу как используют и задумался

важно понимать, зачем используют и что это даёт

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

Всё-таки тут не очень понял, как это работает. До сих пор многое в TS вызывает вопросы (да и опыта в нём почти ноль). В этой песочнице накидал два варианта: 1. Без использования reduce 2. Ваш вариант, в немного более оптимальной форме. Для обоих вариантов допустил ошибку - вместо id использую name. Кажется, что во втором случае просто as недостаточно, либо я просто не до конца понял ваш посыл.

у объектов ключи - всегда строки, может из-за этого не ругается?

fromEntries возвращает всегда объект с обычными ключами

Хз.. Я даже не знал, что вот так можно сделать User['id']

а вот второй вариант — хм

ну да, это же JS. Где нужны ключи "не строки", лучше использовать Map (для этого его и придумали)

Эм.. Может я вас не так понял, но я говорил вот об этом

Это я не так понял, значит :D

Разве мы как раз в этом случае не занимаемся обманом? Ведь ключи объекта всегда строки.

В случае с Map всё действительно отрабатывает отлично для обоих вариантов.

мэй би. не задумывался

да, но TS следит, чтобы если ключи были числами, то числами и оставались

Признаюсь, я не очень понял мысль.. В примере в обоих случаях, ключи будут строками.

А почему никто не упомянул, что в редьюс можно указать дженерик - будет тот же эффект, но без as

🤷‍♂️

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Карта сайта