📖
React × TypeScript × Storybook で、CSF 2 の型を付ける
以下のような、 addon-controls
を使った Storybook の CSF ファイルがある場合、 args
は対象コンポーネントの props
の型であってほしいが、当然 any
になってしまう。
todo.stories.tsx
import { Todo } from './Todo'
export default {
title: 'Todo',
component: Todo
}
const Template = args => <Todo {...args} />
export const Default = Template.bind({})
Default.args = {
title: 'コードを書く',
done: false
}
そのような場合は、以下のように @storybook/react
パッケージから型をインポートすればOK
(Prop
は Todo
コンポーネントのプロパティ定義が export されてるものとする)
todo.stories.tsx
import { Prop, Todo } from './Todo'
import { Story, Meta } from '@storybook/react
export default {
title: 'Todo',
component: Todo
} as Meta
const Template: Story<Prop> = args => <Todo {...args} />
export const Default = Template.bind({})
Default.args = {
title: 'コードを書く',
done: false
}
環境によっては、 Template.bind({})
の戻り値が、 Template
の型を引き継がずに any
担ってしまうことがある。その場合は tsconfig
に以下を追加することで、解決できる。
tsconfig.json
"strictBindCallApply": true
参考
Discussion