этот оператор говорит TS что программист берет на себя ответственность
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 не обойтись
ммм, вот оно как, спасибо
это мощная штука в ловких руках. и очень опасная в неумелых) если нужно помочь тайпскрипту узнать о типах там, где он не может их вычислить (как в примере выше с редьюсом), то as очень хорош. но обращаться с ним нужно аккуратно — можно не заметить и внести расхождение между статическими типами и рантаймом
Есть какие-то рекомендации по этой теме?
ну я , стараюсь не использовать ее ваще, но в который раз в библиотеках выжу как используют и задумался
важно понимать, зачем используют и что это даёт
хз. я не могу выразить этот опыт нормальными словами. только “опираться на здравый смысл” и “следить за тем, как в системе преобразуются и используются типы”
Всё-таки тут не очень понял, как это работает. До сих пор многое в TS вызывает вопросы (да и опыта в нём почти ноль). В этой песочнице накидал два варианта: 1. Без использования reduce 2. Ваш вариант, в немного более оптимальной форме. Для обоих вариантов допустил ошибку - вместо id использую name. Кажется, что во втором случае просто as недостаточно, либо я просто не до конца понял ваш посыл.
у объектов ключи - всегда строки, может из-за этого не ругается?
Хз.. Я даже не знал, что вот так можно сделать User['id']
а вот второй вариант — хм
ну да, это же JS. Где нужны ключи "не строки", лучше использовать Map (для этого его и придумали)
Это я не так понял, значит :D
Разве мы как раз в этом случае не занимаемся обманом? Ведь ключи объекта всегда строки.
В случае с Map всё действительно отрабатывает отлично для обоих вариантов.
мэй би. не задумывался
да, но TS следит, чтобы если ключи были числами, то числами и оставались
Признаюсь, я не очень понял мысль.. В примере в обоих случаях, ключи будут строками.
А почему никто не упомянул, что в редьюс можно указать дженерик - будет тот же эффект, но без as
🤷♂️
Обсуждают сегодня