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

TypeScript类型守卫报错求助:代码语法是否有误或需改tsconfig?

问题分析与修复方案

代码语法问题(无需修改tsconfig)

你的代码报错是由几个语法逻辑问题导致的,和tsconfig配置无关,具体问题及修复如下:

1. 未定义的speed变量

函数内直接使用的speed未声明,你实际需要修改的是传入的animal自身的speed属性,需改为animal.speed。

2. 可选属性可能为undefined

flyingSpeed和crawlingSpeed是可选属性,可能不存在(值为undefined),直接与数字相加会触发类型错误,需要处理这种情况,比如给默认值0。

修复后的完整代码

interface Bird {
  type: "bird";
  speed: number;
  flyingSpeed?: number;
}
interface Snail {
  type: "snail";
  speed: number;
  crawlingSpeed?: number;
}

function accelerateAnimal(animal: Snail | Bird): void {
  switch (animal.type) {
    case "bird":
      // 处理可选属性可能为undefined的情况,默认加0
      animal.speed = animal.speed + (animal.flyingSpeed ?? 0);
      break;
    case "snail":
      animal.speed = animal.speed + (animal.crawlingSpeed ?? 0);
      break;
    default:
      // 添加穷尽检查,避免遗漏类型分支
      const _exhaustiveCheck: never = animal;
      throw new Error(`Unknown animal type: ${_exhaustiveCheck}`);
  }
}

accelerateAnimal({type: "bird", speed: 0, flyingSpeed: 3});

补充说明

  • 你通过switch判断animal.type已经是有效的类型守卫,TypeScript会自动在对应case块中将animal收窄为对应类型(Bird或Snail),这部分写法是正确的。
  • 可选属性的?:标记用法无误,报错并非源于该标记。

内容的提问来源于stack exchange,提问作者Alb Rick Bi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 06:42:41