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

