19
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

TypeScriptのaddEventListenerで苦しんだところまとめ

Last updated at Posted at 2018-02-12

やろうとしたこと

TypeScriptでaddEventListener。
イベントリスナーにおいて、イベント発生元(今回はinput type=file)の情報を取得しようとした。

const image1 =
      document.getElementById('image1');
image1!.addEventListener(
  'change',
  (event) => {
    this.handleInputChange(event.target.files![0]);
  },
  false,
);

問題1

以下のエラーが発生。

TS2339: Property 'files' does not exist on type 'EventTarget'.

問題1の解決

以下の記事でEventをwrapする方法をご教示いただき、上記のエラーは解消。
https://qiita.com/wamei/items/43753e03821964719f31

問題2

EventTargetの型の問題は解決するものの、次は以下のエラーが発生。

TS2345: Argument of type '(event: HTMLElementEvent<HTMLInputElement>) => void' is not assignable to parameter of type 'Ev
entListenerOrEventListenerObject'.
  Type '(event: HTMLElementEvent<HTMLInputElement>) => void' is not assignable to type 'EventListenerObject'.
    Property 'handleEvent' is missing in type '(event: HTMLElementEvent<HTMLInputElement>) => void'.

(未だにTypeScriptのエラーメッセージは慣れない。)

どうやらTypeScript v2.6から追加されたStrict function typesに起因するものらしい。

問題2の解決①

tsconfigに以下の設定を加えることでも回避可能です。

"strictFunctionTypes": false

問題2の解決②

とはいえせっかくなのでお作法に則りエラーを解決したく思い調べて見た所、以下の記法で解決することができました。

image1!.addEventListener(
  'change',
  {handleEvent: (event: HTMLElementEvent<HTMLInputElement>) => {
    this.handleInputChange(event.target.files![0]);
  }},
  false,
);

見栄えが悪いので、addEventListenerの第二引数はオブジェクトとして切り出して定義した方がいいかもしれませんね。

まとめ

あまり掘り下げられておりませんが、一旦備忘録として残しておきます。
認識が誤っている箇所などございましたら、ご指摘頂けますと助かります。

19
14
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?