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

Angular 2:如何在传入不兼容类型时抛出错误而非强制转换

解决TypeScript中传入非预期类型时触发运行时错误的问题

哥们,我太懂你这困扰了!你用<number><any>"65"这种类型断言,以为能让运行时抛错,但其实TypeScript的类型断言只在编译阶段起作用,编译完这些断言就被彻底擦除了,运行时根本不会做任何类型检查,所以才会出现myMethod里拿到字符串却没提前报错的情况。

要实现“传错类型直接抛错,还不用在myMethod里写检查”的需求,给你几个实用方案:

1. 写个通用的运行时断言函数(最推荐)

封装一个专门做类型校验的断言函数,在调用myMethod之前先把参数校验一遍,不符合直接炸:

function assertIsNumber(value: unknown): asserts value is number {
  if (typeof value !== 'number') {
    throw new TypeError(`Expected a number, but got ${typeof value}`);
  }
}

class MyClass {
  constructor() {
    const dataFromJSON = "65"; // 模拟从接口拿的JSON数据
    assertIsNumber(dataFromJSON); // 这里直接触发运行时错误,不会走到myMethod
    this.myMethod(dataFromJSON);
  }

  myMethod(n: number) {
    console.log(typeof n);
    console.log(n + 1);
  }
}

这个函数不仅能在运行时抛错,TypeScript还会自动识别校验后的类型,调用myMethod时连编译警告都不会有,完美符合你的需求。

2. 用类型守卫做前置检查

如果你的项目开了严格模式,也可以写个类型守卫函数,判断参数类型不对就抛错:

function isNumber(value: unknown): value is number {
  return typeof value === 'number';
}

class MyClass {
  constructor() {
    const dataFromJSON = "65";
    if (!isNumber(dataFromJSON)) {
      throw new TypeError(`Invalid type: expected number, got ${typeof value}`);
    }
    this.myMethod(dataFromJSON);
  }

  myMethod(n: number) {
    // 安心写逻辑就行
  }
}

3. 针对JSON数据的批量校验(适合你的场景)

既然你是从网络拿JSON数据,改类型后要调试整个流程,强烈建议用Schema校验工具(比如zod或者ajv),在数据刚进入应用的时候就做全量校验,不用每个函数都加检查:

// 举个zod的例子,你自己安装就行
import { z } from "zod";

// 先定义你期望的数据结构
const ApiDataSchema = z.object({
  targetNumber: z.number(),
});

// 接口请求后直接校验
const rawData = await fetch('/your-api').then(res => res.json());
const validatedData = ApiDataSchema.parse(rawData); // 不符合结构直接抛错

// 之后用validatedData里的参数,类型完全安全
new MyClass().myMethod(validatedData.targetNumber);

这样只要接口返回的数据不符合你定义的类型,在进入业务逻辑前就会报错,调试整个数据流程的时候省心太多了。

最后再划个重点:TypeScript是编译时类型系统,运行时根本没有类型信息,所以想靠类型断言实现运行时校验是不可能的,必须通过运行时的校验逻辑来实现你要的错误触发效果。

内容的提问来源于stack exchange,提问作者lost faith in stackoverflow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:47:18