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
相关产品推荐
相关产品推荐

