8

私は非常に単純なことをしようとしています.マウスオーバーで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) => { ... }

ちょうどこのような。

4

1 に答える 1

16

「タイプ {} にプロパティ clientX が存在しません」

これは、オブザーバブルが型指定されていないためです。

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

注釈をジェネリック パラメータとして追加できます。

Observable.fromEvent<MouseEvent>(StarSky.canvas,'mousemove')

または、あなたが行ったようにコールバック。

于 2016-05-03T02:50:04.830 に答える