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

TypeScript可选联合字符串类型默认值的React.FC类型校验异常

解决TypeScript可选联合字符串类型默认值不触发类型错误的问题

问题原因

你遇到的情况是因为React.FC泛型的类型推断特性:当不给函数参数显式指定类型时,TypeScript会结合解构默认值自动扩展变量类型,把bar的类型推断为'a' | 'b' | 's',不会严格校验默认值是否符合原接口的联合类型。

可行解决方案

1. 给解构对象显式指定接口类型

在解构时直接给整个对象标注IBar类型,强制TypeScript按照接口校验默认值:

interface IBar {
  bar?: 'a' | 'b'
}

const Foo: React.FC<IBar> = (props) => {
  const {
    bar = 's' // 这里会触发类型错误,符合预期
  }: IBar = props;

  return <div />
}

2. 使用函数参数默认值替代解构默认值

直接在函数参数层面设置默认值,此时TypeScript会严格按照React.FC泛型传入的IBar接口校验默认值:

interface IBar {
  bar?: 'a' | 'b'
}

const Foo: React.FC<IBar> = ({ bar = 's' }) => { // 这里直接报错,因为's'不属于'a'|'b'
  return <div />
}

3. 放弃React.FC,直接定义函数参数类型

如果不需要React.FC提供的额外特性(比如children默认类型),可以直接给函数参数指定类型,既避免冗余又保证类型校验:

interface IBar {
  bar?: 'a' | 'b'
}

const Foo = ({ bar = 's' }: IBar) => { // 这里触发类型错误
  return <div />
}

总结

前两种方法保留了React.FC的使用,第三种更简洁。核心是让TypeScript严格依据IBar接口校验默认值的类型,避免自动扩展类型导致的校验失效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 12:35:23