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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 18:45:31