A report summary can group rows, count statuses, and print a compact result.

summary case Accumulating into a typed summary object is a common pattern for scripts and small services.

Report Summary Case

includeFailure
report.ts
Replay: real traced execution (multi-file project)
type Row = {
    status: "pass" | "fail";
};

type Summary = {
    pass: number;
    fail: number;
};

function summarize(rows: Row[]): Summary {
    const summary: Summary = { pass: 0, fail: 0 };

    for (const row of rows) {
        summary[row.status] += 1;
    }

    return summary;
}

const includeFailure: boolean = true;
const rows: Row[] = [
    { status: "pass" },
    { status: includeFailure ? "fail" : "pass" },
    { status: "pass" }
];
const summary: Summary = summarize(rows);

console.log(`pass=${summary.pass};fail=${summary.fail}`);
type Row = {
    status: "pass" | "fail";
};

type Summary = {
    pass: number;
    fail: number;
};

function summarize(rows: Row[]): Summary {
    const summary: Summary = { pass: 0, fail: 0 };

    for (const row of rows) {
        summary[row.status] += 1;
    }

    return summary;
}

const includeFailure: boolean = false;
const rows: Row[] = [
    { status: "pass" },
    { status: includeFailure ? "fail" : "pass" },
    { status: "pass" }
];
const summary: Summary = summarize(rows);

console.log(`pass=${summary.pass};fail=${summary.fail}`);
  1. includeFailure ← true, rows ← [object Object],[object Object],[object Object]

    17    return summary;18}1920const includeFailure→ true: boolean = true;  //@includeFailure=false21const rows→ [object Object],[object Object],[object Object]: Row[] = [22    { status: "pass" },23    { status: includeFailuretrue ? "fail" : "pass" },24    { status: "pass" }25];26const summary: Summary = summarize(rows[object Object],[object Object],[object Object]);
  2. summary ← [object Object], summary[row.status] ← 2

    7    fail: number;8};910function summarize(rows[object Object],[object Object],[object Object]: Row[]): Summary {11    const summary→ [object Object]: Summary = { pass: 0, fail: 0 };1213    for (const row of rows) {14        summary[row.status] += 1;15    }1617    return summary[object Object];18}
    values this step2summary[row.status]
  3. summary ← [object Object]

    24    { status: "pass" }25];26const summary→ [object Object]: Summary = summarize(rows[object Object],[object Object],[object Object]);2728console.log(`pass=${summary.pass2};fail=${summary.fail1}`);
    outputpass=2;fail=1
  1. includeFailure ← false, rows ← [object Object],[object Object],[object Object]

    17    return summary;18}1920const includeFailure→ false: boolean = false;21const rows→ [object Object],[object Object],[object Object]: Row[] = [22    { status: "pass" },23    { status: includeFailurefalse ? "fail" : "pass" },24    { status: "pass" }25];26const summary: Summary = summarize(rows[object Object],[object Object],[object Object]);
  2. summary ← [object Object], summary[row.status] ← 3

    7    fail: number;8};910function summarize(rows[object Object],[object Object],[object Object]: Row[]): Summary {11    const summary→ [object Object]: Summary = { pass: 0, fail: 0 };1213    for (const row of rows) {14        summary[row.status] += 1;15    }1617    return summary[object Object];18}
    values this step3summary[row.status]
  3. summary ← [object Object]

    24    { status: "pass" }25];26const summary→ [object Object]: Summary = summarize(rows[object Object],[object Object],[object Object]);2728console.log(`pass=${summary.pass3};fail=${summary.fail0}`);
    outputpass=3;fail=0