A tagged response shape lets code handle successful data and errors predictably.

tagged response A discriminated response object keeps success and error handling in one explicit branch.

API Response Case

requestOk
response.ts
Replay: real traced execution (multi-file project)
type ApiResponse =
    | { ok: true; value: number }
    | { ok: false; error: string };

function label(response: ApiResponse): string {
    if (response.ok) {
        return `value:${response.value}`;
    }

    return `error:${response.error}`;
}

const requestOk: boolean = true;
const response: ApiResponse = requestOk
    ? { ok: true, value: 42 }
    : { ok: false, error: "missing" };

console.log(label(response));
type ApiResponse =
    | { ok: true; value: number }
    | { ok: false; error: string };

function label(response: ApiResponse): string {
    if (response.ok) {
        return `value:${response.value}`;
    }

    return `error:${response.error}`;
}

const requestOk: boolean = false;
const response: ApiResponse = requestOk
    ? { ok: true, value: 42 }
    : { ok: false, error: "missing" };

console.log(label(response));
  1. requestOk ← true, response ← [object Object]

    10    return `error:${response.error}`;11}1213const requestOk→ true: boolean = true;  //@requestOk=false14const response→ [object Object]: ApiResponse = requestOktrue15    ? { ok: true, value: 42 }16    : { ok: false, error: "missing" };1718console.log(label(response[object Object]));
  2. function label(response: ApiResponse): string

    2    | { ok: true; value: number }3    | { ok: false; error: string };45function label(response[object Object]: ApiResponse): string {6    if (response.ok) {
  3. if (response.ok)

    5function label(response: ApiResponse): string {6    if (response.oktrue) {7        return `value:${response.value42}`;8    }
  4. console.log(label(response));

    15    ? { ok: true, value: 42 }16    : { ok: false, error: "missing" };1718console.log(label(response[object Object]));
    outputvalue:42
  1. requestOk ← false, response ← [object Object]

    10    return `error:${response.error}`;11}1213const requestOk→ false: boolean = false;14const response→ [object Object]: ApiResponse = requestOkfalse15    ? { ok: true, value: 42 }16    : { ok: false, error: "missing" };1718console.log(label(response[object Object]));
  2. function label(response: ApiResponse): string

    2    | { ok: true; value: number }3    | { ok: false; error: string };45function label(response[object Object]: ApiResponse): string {6    if (response.ok) {7        return `value:${response.value}`;8    }910    return `error:${response.errormissing}`;11}
  3. console.log(label(response));

    15    ? { ok: true, value: 42 }16    : { ok: false, error: "missing" };1718console.log(label(response[object Object]));
    outputerror:missing