TypeScript中try/catch未生效:如何校验对象含指定类型全部属性?
问题解答
为什么try/catch未生效?
- TypeScript的类型注解是编译时检查,编译成JavaScript后,所有类型信息都会被移除,运行时程序完全不知道
myType的存在。 - 你调用
create({ test: '1' })时,虽然TypeScript在编译阶段会提示类型错误(如果开启严格校验),但强行编译运行后,这个对象没有body属性,访问data.body只会返回undefined——而访问对象不存在的属性并不会抛出异常,所以try/catch无法捕获到错误。
如何确保仅当data包含myType全部属性时才执行代码?
因为TypeScript类型不参与运行时校验,必须手动实现运行时类型检查,示例代码如下:
type myType = { isAdmin: boolean; body: string; } // 运行时类型校验函数,同时用类型断言让TS识别类型 function isMyType(data: unknown): data is myType { if (typeof data !== 'object' || data === null) { return false; } const target = data as myType; // 校验所有必填属性的类型是否符合要求 return typeof target.isAdmin === 'boolean' && typeof target.body === 'string'; } create(data: unknown) { try { if (!isMyType(data)) { throw new Error('数据不符合myType的要求'); } console.log("body:", data.body); } catch (error) { console.log("error:", error); } } create({ test: '1' }); // 会触发错误捕获
额外说明:如果你的TypeScript项目开启了strictNullChecks、noImplicitAny等严格模式,编译阶段就能拦截不符合类型的参数传入,但这种保障只在开发阶段有效——如果数据来自外部(比如API响应、用户输入),依然需要运行时校验来确保数据合法性。
内容的提问来源于stack exchange,提问作者ali
相关产品推荐
相关产品推荐

