A small union type can model the allowed states in a workflow.

State Transition Case

state.ts
type Status = "draft" | "review" | "published";

function advance(status: Status): Status {
    if (status === "draft") {
        return "review";
    }

    if (status === "review") {
        return "published";
    }

    return "published";
}

const current: Status = ;
const next: Status = advance(current);

console.log(`next=${next}`);
type Status = "draft" | "review" | "published";

function advance(status: Status): Status {
    if (status === "draft") {
        return "review";
    }

    if (status === "review") {
        return "published";
    }

    return "published";
}

const current: Status = ;
const next: Status = advance(current);

console.log(`next=${next}`);
state transition Returning a new state from a function keeps workflow changes explicit and typed.