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

TypeScript中如何判断字符串是否属于指定string literal类型

解决思路

TypeScript的类型仅存在于编译阶段,运行时无法直接判断类型,因此必须要有运行时的校验逻辑。你可以通过「从运行时常量派生TS类型」的方式,避免手动维护两套逻辑导致的不一致问题,同时自动获得拼写校验能力。


具体实现

步骤1:将联合类型的取值统一为唯一数据源

不要先手动写string literal联合类型,而是先定义运行时可用的常量数组,再从数组派生类型,保证类型和运行时校验的取值完全同步:

// 所有MyColor的取值只维护这一个数组即可,用as const固定值类型
const MY_COLORS = ['primary', 'secondary', 'accent'] as const;
// 从数组自动提取联合类型,不需要手动枚举
type MyColor = typeof MY_COLORS[number];

步骤2:实现带类型收窄的校验函数

用类型谓词定义类型守卫函数,判断后TS会自动收窄变量类型:

function isMyColor(color: string): color is MyColor {
  return MY_COLORS.includes(color as MyColor);
}

步骤3:在组件中直接使用

interface MyComponentProps {
  color: MyColor | string;
}

const MyComponent = (props: MyComponentProps) => {
  let className = '';
  let style: React.CSSProperties = {};
  if (isMyColor(props.color)) {
    className = `bg-${props.color}`;
  } else {
    style = { backgroundColor: props.color };
  }

  return (
    <div
      className={className}
      style={style}
    >Hello!</div>
  );
}

export default MyComponent

为什么能避免拼写/遗漏问题

原来的写法是手动维护「类型定义」和「校验数组」两套独立逻辑,TS不知道两者需要对齐,因此不会报错。现在改为从常量数组派生类型:

  • 如果你在数组中拼写错误,比如把secondary写成secomdary,后续代码中用到color="secondary"的时候TS会直接报错,提示不存在该取值,马上就能发现问题
  • 新增/删除取值只需要改MY_COLORS数组,类型会自动同步,不会出现遗漏

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 06:24:03