我正在尝试做一些非常简单的事情,只需在鼠标悬停时记录 event.clientX,这是模块代码:

import { Observable, Subject } from 'rxjs';
import StarSky from './starsky';
import constants from '../constants/index';

const HERO_Y = constants.HERO_Y(StarSky.canvas);

export const StarShip = Observable.fromEvent(StarSky.canvas,'mousemove')
  .map((event)=> {
    return {
      x: event.clientX,
      y: HERO_Y
    }
  })
  .startWith({
    x: StarSky.canvas.width /2,
    y: HERO_Y
  })

然后我后来订阅了,喜欢这样:
StarShip.subscribe(x =>  console.log(x));

发生的事情是 typescript 编译器不断抛出这种特殊类型的错误:
Property clientX does not exist on type {}

我猜是因为它仍然是一个空的 Rx 主题,并且 clientX 还没有存在,因为它需要通过鼠标悬停进行初始化。这有点愚蠢,因为如果我删除 .clientX ,并将 event 留在那里作为 x ,它会毫无问题地注销。

如何解决这种不兼容性并解决此错误?

编辑:

我很抱歉,刚刚发现解决方案是放置类型声明
(event: MouseEvent) => { ... }

像这样。

最佳答案



这是因为 observable 没有输入:

Observable.fromEvent(StarSky.canvas,'mousemove')

您可以添加注释作为通用参数:
Observable.fromEvent<MouseEvent>(StarSky.canvas,'mousemove')

或者像你所做的那样回调。

10-06 02:57