#angular #rxjs #subscribe
#угловатый #rxjs #Подписка
Вопрос:
Я пробую некоторые функции RxJS в Angular и скопировал некоторый код из учебника (ссылка). Мой проект настроен в «строгом» режиме. Приложение просто регистрирует координаты щелчка в консоли (я сделал Stackblitz: link)
Как локально, так и в Stackblitz приложение работает, НО локально моя среда разработки отображает ошибку. В строке 25 AppComponent, внутри subscribe
, onClick
подчеркнуто, и я получаю « No overload matches this call
«. Проблема, по-видимому, связана с определением типа MouseEvent
в строке 12. Если я изменю его на any
, ошибка исчезнет.
Мои предположения:
- код работает, потому что при переносе TS в JS типизация теряется (так эффективно, как если бы у меня было
any
в моем последнем вызове) - Stackblitz не показывает ошибку, потому что его проверки ограничений не так эффективны, как проверки из VSCode
Мои вопросы:
- верны ли мои предположения?
- как я должен написать свой код, чтобы НЕ получить ошибку IDE? Должен ли я использовать какое-то приведение к «любому»? Разве это не соответствовало бы цели использования «строгого» режима?
Ответ №1:
Вы можете сделать это следующим образом:
const eventListener = <K extends keyof DocumentEventMap>(type: K) =>
bindCallback<K, DocumentEventMap[K]>(document.addEventListener)(type);
Stackblitz: https://stackblitz.com/edit/angular-ivy-pzxguu?file=src/app/app.component.ts
Вместо этого вы также можете использовать fromEvent
from rxjs:
import { fromEvent } from 'rxjs';
...
fromEvent(document, 'click').subscribe(...);
Комментарии:
1. ммм, но вся цель этого примера — использовать «bindCallback». Чтобы использовать «FromEvent», мне нужно было бы избавиться от «bindCallback», насколько я вижу (?)
2. спасибо, Майк, я попробую это позже. И вы бы сказали, что мои предположения (особенно те, которые касаются переноса) верны?
3. Еще раз привет. Я попробовал ваш фрагмент, но я не могу привести его к чему-либо «рабочему». Теперь я получаю сообщение об ошибке непосредственно при «подписке». Я не уверен, что понимаю, что он делает. Возможно, пример кода, который я взял из Medium, был не самым лучшим, теперь я понимаю, что статье 2 года, и, похоже, все немного изменилось. Я думаю, я посмотрю на какой-нибудь новый материал для изучения RxJS. Не могли бы вы просто сказать мне, были ли мои предположения правильными? тогда я мог бы принять ваш ответ (в идеале рабочий stackblitz или объяснение того, что вы сделали, также было бы здорово, если это не требует слишком многого)
4. Прошу прощения, я допустил опечатку, сейчас я обновляю и тоже добавлю stackblitz
5. Ваши предположения по существу верны. Единственное, что проверка ошибок выполняется с помощью typescript, а не VSCode / stackblitz, так что на самом деле stackblitz имеет менее строгую конфигурацию tsconfig.json