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

如何在React组件的哈希映射/字典中实现类型收窄?

用哈希映射实现TypeScript类型收窄的问题与最佳实践

我想避开条件代码块,只通过哈希映射/字典实现类型收窄。我的组件接收来自同一数据源的混合数据结构,不同组件负责渲染不同视觉变体,数据里的category字段用来指定对应的渲染组件。

类型与组件示例

enum Category {
  "Foo",
  "Bar"
}

type Card = {
  category: Category.Foo,
  message: string;
} | {
  category: Category.Bar,
  active: boolean;
}

const CardCategoryFoo = ({ data }: { data: Extract<Card, { category: Category.Foo }> }) => 
  <div>Foo: {data.message}</div>;

const CardCategoryBar = ({ data }: { data: Extract<Card, { category: Category.Bar }> }) => 
  <div>Bar: {data.active ? "Active" : "Inactive"}</div>;

条件判断实现类型收窄(可行)

// 类型收窄生效的场景
const Page1 = ({ data }: { data: Card }) => {
  if (data.category === Category.Foo) {
    return <CardCategoryFoo data={data} />;
  }

  if (data.category === Category.Bar) {
    return <CardCategoryBar data={data} />;
  }

  return null;
}

哈希映射尝试失败场景

// 类型收窄失效的场景
const Page2 = ({ data }: { data: Card }) => {
  const cardDictionary = {
    [Category.Foo]: <CardCategoryFoo data={data} />,
                                  // ^ TypeScript报错
    [Category.Bar]: <CardCategoryBar data={data} />,
                                  // ^ TypeScript报错
  };

  return cardDictionary[data.category] ?? null;
}

能否通过简单方案继续使用哈希映射解决该问题?


替代方案调研

调研后发现简单方案可能无法满足需求(相关TypeScript官方Issue)。其中一种方案是使用类型断言,但我不想每次都依赖as Something语法。

那么覆盖所有场景的最佳实践模式是什么?继续用if/else条件判断?还是改用switch语句?此场景下的最佳建议是什么?

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 12:44:53