Storybook 提供了集成的 TypeScript 体验,包括零配置设置和 API、插件和故事的内置类型。
Storybook 的配置文件(即 main.ts
)定义为用 TypeScript 编写的 ESM 模块,它为你提供了支持现有框架的基础配置,同时在你编辑器中启用更严格的类型检查和自动完成。下面是一个简化的配置文件。
有关更多详细信息和其他属性,请参阅 main 配置 API 参考。
Storybook 构建时即可与各种第三方库协作,让你能够安全地访问和记录组件的元数据(例如,props),而无需任何其他配置。它依赖于 react-docgen
,这是一个快速且高度可定制的解析器,用于处理 TypeScript 文件以推断组件的元数据并自动生成类型,从而提高性能和类型安全性。如果需要为特定用例场景自定义默认配置,则可以调整 Storybook 配置文件并提供所需的选项。下面列出了可用的选项以及如何使用它们的示例。
选项 | 描述 |
---|
check | 适用于基于 Webpack 的项目。 启用 Storybook 中的类型检查
typescript: { check: true }, |
checkOptions | 需要启用 check 选项。 配置 fork-ts-checker-webpack-plugin 插件
typescript: { checkOptions: {},}, |
reactDocgen | 配置 Storybook 使用的 TypeScript 解析器。 可用选项:react-docgen (默认)、react-docgen-typescript 、false typescript: { reactDocgen: 'react-docgen'}, |
reactDocgenTypescriptOptions | 需要将 reactDocgen 选项设置为 react-docgen-typescript 。 根据构建器配置 react-docgen-typescript-plugin 插件
typescript: { reactDocgen: 'react-docgen-typescript', reactDocgenTypescriptOptions: {},}, |
skipCompiler | 禁用通过编译器解析 Typescript 文件
typescript: { skipCompiler:false,}, |
Storybook 提供了零配置 TypeScript 支持,允许你使用此语言编写故事,无需其他配置。你可以使用此格式来提高类型安全性并完成代码。例如,如果你正在测试 Button
组件,则可以在你的故事文件中执行以下操作
上面的示例结合了 TypeScript 的强大功能和导出的泛型类型(Meta
和 StoryObj
),以告诉 Storybook 如何推断组件的元数据以及组件输入(例如,props)的类型。这可以通过让你的 IDE 显示 Storybook 注入的属性来极大地改善开发人员体验。
假设您正在使用 TypeScript 4.9+ 的项目中工作,您可以更新组件故事以使用新的 satisfies
运算符,以确保对组件故事进行更严格的类型检查。例如
现在,当您定义一个故事或更新现有故事时,系统会自动通知您缺少必需的 arg
。但是,您不限于在组件级别使用 satisfies
运算符。如果需要,您也可以在故事级别使用它。例如
开箱即用,Storybook 几乎支持所有已经使用 TypeScript 4.9 或更高版本的框架的 satisfies
运算符。但是,由于 Angular 和 Web Components 框架的限制,在应用此运算符以获得额外的类型安全时,您可能会遇到问题。这主要是由于这两个框架的当前实现方式,使得 Storybook 几乎无法确定组件属性是否必需。如果您遇到此问题,请在 GitHub Discussions 上提交支持请求。
如果您的项目依赖于第三方库并且未生成预期的类型,从而阻止您准确记录组件,则可以调整 Storybook 配置文件中的 reactDocgen
配置选项以改用 react-docgen-typescript
并包含所需的选项。例如
如果您正在使用 React 项目,则使用 react-docgen
库会自动为您的组件启用类型推断,以提高构建速度和类型安全性。但是,您可能会遇到某些选项无法按预期工作的情况(例如,Enums
、React 的 forwardRef
)。这主要是由于 react-docgen
包的实现方式,使得 Storybook 难以推断组件的元数据并自动生成类型。要解决此问题,您可以更新 Storybook 配置文件中的 typescript
配置选项以改用 react-docgen-typescript
。例如
如果您仍然遇到问题,我们建议您使用默认的沟通渠道(例如,GitHub 讨论)联系社区。