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

如何在TypeScript中统计对象内warning状态的出现次数?

在TypeScript中统计对象内指定status值的出现次数

首先修正你代码里的几个细节:

  • warning 和 oki 需为字符串(如 "warning")或枚举值,否则会被视为未定义变量报错
  • 对象属性间要添加逗号,比如street: "test"后需补逗号
  • 你的TestObject接口未定义subobj3,可以将其设为可选属性,或统一子对象类型

先补全完整的类型定义:

// 定义status的可选值类型
type StatusType = "warning" | "oki";

// 统一子对象的接口
interface SubObject {
  status: StatusType;
  time: number;
}

export interface TestObject {
  name: string;
  street: string;
  subobj1: SubObject;
  subobj2: SubObject;
  subobj3?: SubObject; // 可选属性,对应示例里的subobj3
}

方法一:固定结构的手动统计

如果TestObject结构固定,只有明确的几个子对象(如subobj1、subobj2、subobj3),可以直接逐个判断:

function countWarningStatus(obj: TestObject): number {
  let count = 0;
  
  if (obj.subobj1.status === "warning") count++;
  if (obj.subobj2.status === "warning") count++;
  // 可选属性用可选链操作符避免报错
  if (obj.subobj3?.status === "warning") count++;
  
  return count;
}

这种方式类型安全性最高,TS会自动检查每个子对象的属性是否合法。

方法二:通用遍历统计

如果后续可能新增更多同结构子对象(如subobj4、subobj5),可以用遍历对象属性的方式实现,更灵活:

function countWarningStatus(obj: TestObject): number {
  let count = 0;
  
  // 遍历对象的所有属性值
  for (const value of Object.values(obj)) {
    // 判断当前值是否是包含status的子对象
    if (typeof value === "object" && value !== null && "status" in value) {
      // 类型断言让TS识别为SubObject
      const subObj = value as SubObject;
      if (subObj.status === "warning") {
        count++;
      }
    }
  }
  
  return count;
}

这种方式无需修改函数就能适配新增的子对象,只要新增属性符合SubObject结构即可。

测试示例对象:

const testObj: TestObject = {
  name: "test",
  street: "test",
  subobj1: {
    status: "warning",
    time: 11
  },
  subobj2: {
    status: "oki",
    time: 12
  },
  subobj3: {
    status: "warning",
    time: 13
  }
};

console.log(countWarningStatus(testObj)); // 输出:2

内容的提问来源于stack exchange,提问作者user1938143

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 04:35:26