You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Storybook装饰器示例中Story参数的TypeScript类型应如何指定?

Storybook 装饰器中 Story 参数的正确类型标注方案

为什么标注 any 依然通不过 linter 校验

  • 大多数团队启用的 TypeScript 代码检查规则中,包含禁止显式使用any的校验项,这种写法本身就会触发规则报错,和类型标注的实际对错无关。
  • 直接使用any会丢失所有类型校验保护,既不符合项目代码规范要求,也无法在开发阶段识别组件传参、渲染逻辑的潜在问题。

正确的类型实现方式

Storybook 核心包中已经内置了适配装饰器场景的类型定义,不需要手动自定义复杂的参数类型,直接导入内置类型使用即可:

  • 兼容全版本的通用写法:从@storybook/react模块导入StoryFn类型,直接标注到装饰器的Story参数上。
  • Storybook 7+ 版本的优化写法:从@storybook/react模块导入Decorator类型,通过satisfies语法标注整个装饰器函数,TypeScript 会自动推导Story参数的类型,不需要手动单独标注,完全满足linter对参数必须有明确类型的要求。

修正后的代码示例

通用兼容写法(适配所有Storybook主版本):

import type { StoryFn } from '@storybook/react';

export const Primary = {
  decorators: [
    (Story: StoryFn) => (
      <div style={{ margin: '3em' }}>
        <Story />
      </div>
    )
  ]
};

Storybook 7+ 优化写法:

import type { Decorator } from '@storybook/react';

export const Primary = {
  decorators: [
    (Story) => (
      <div style={{ margin: '3em' }}>
        <Story />
      </div>
    ) satisfies Decorator
  ]
};

官方示例中省略类型标注,是因为默认场景下TypeScript可以自动推导参数类型。在开启严格校验规则的项目中,无论选择手动标注内置类型,还是通过类型推导明确参数类型,都不需要编写自定义的参数类型,也完全可以通过校验。另外你原写法中Primary.decorators的链式赋值存在语法逻辑问题,正确方式是在Story配置对象中直接声明decorators字段,不需要对未初始化的对象做属性链式赋值。

注:原代码中直接给参数标注Story: any的写法除了触发linter规则报错外,还会丢失组件props的类型提示,不建议使用。


内容的提问来源于stack exchange,提问作者Wayneio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.28 07:06:03