6
5

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.

React で型の named import は辞めよう

Last updated at Posted at 2019-02-10

React コーディング全てではなく、主に SyntheticEvent 型を継承している DOM 周りの型に限っては、named import を避けるべきです。一見エラーにならない様に感じる次のコードですが、onClick にバインディングする行でエラーが発生します。

import React from 'react'
import { MouseEvent } from 'react'
type Props = {
  handleClick: (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void
}
const Component: React.FC<Props> = props => (
  <div>
    <button onClick={props.handleClick}></button>  // Error
  </div>
)

型名称の衝突

React.MouseEvent<T = Element, E = NativeMouseEvent> と定義元にある様に、Generics 2番目は、Native の Event型を期待しています。例えばブラウザ向けのプロジェクトの場合、それは lib.dom.d.ts で global定義されている MouseEvent を指します。

そのため、@types/react から named import した MouseEvent と衝突してしまい、エラーになってしまっていた、という訳です。SyntheticEvent 型を継承している @types/react 提供型と、lib.dom.d.ts で global定義 されている型はこんなに被っています。

x ClipboardEvent
x CompositionEvent
x DragEvent
x PointerEvent
x FocusEvent
FormEvent
InvalidEvent
ChangeEvent
x KeyboardEvent
x MouseEvent
x TouchEvent
x UIEvent
x WheelEvent
x AnimationEvent
x TransitionEvent

そのコンテキストで多様し冗長だから、という理由で型を named import すると、無駄に時間を溶かしてしまうかもしれないので注意しましょう。非常にややこしいですね。

6
5
0

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
6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?