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 すると、無駄に時間を溶かしてしまうかもしれないので注意しましょう。非常にややこしいですね。