雰囲気で使わない @types/react の続編です。自分もそうなのですが、多くのプロジェクトで styled-components が利用されているかと思います。この時、お決まりの様に Props
型に className?: string
を差し込んでいました。
import * as React from 'react'
type Props = {
className?: string
label: string
onClick: (props?: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void
}
const View: React.FC<Props> = props => (
<p className={props.className}>
<button onClick={props.onClick}>{props.label}</button>
</p>
)
export default styled(View)`
background-color: #f00;
`
これを省略するために、掲題の通り、React.FC
型を拡張します。拡張といっても、別の型を用意して、declare module に新しい型を追加するだけです。まずは、React.FC
型の元定義を確認。
@types/react/index.d.ts
type FC<P = {}> = FunctionComponent<P>;
プロジェクトの任意の場所に、以下の通り定義を追加します。型名称は何でも良いのですが、FCX
型とします。Intersection Types で { className?: string }
を注入します。
src/type.ts
import * as React from 'react'
declare module 'react' {
type FCX<P = {}> = FunctionComponent<P & { className?: string }>
}
FCX型を使う
module の型定義に追加しているため、React.FCX
で参照できます。これで、冗長な className?: string
宣言を省略できる様になりました
import * as React from 'react'
type Props = {
label: string
onClick: (props?: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void
}
const View: React.FCX<Props> = props => (
<p className={props.className}> {/* No Error! */}
<button onClick={props.onClick}>{props.label}</button>
</p>
)
export default styled(View)`
background-color: #f00;
`