type State = "locked" | "unlocked"; class CredentialManager { private readonly state?: S; unlock(this: CredentialManager<"locked">, master_key: string) { return this as unknown as CredentialManager<"unlocked">; } set(this: CredentialManager<"unlocked">, key: string, value: any) { // ... } get(this: CredentialManager<"unlocked">, key: string): string | undefined { // ... return undefined; } lock(this: CredentialManager<"unlocked">): CredentialManager<"locked"> { return this as unknown as CredentialManager<"locked">; } } function main2() { let pw_locked = new CredentialManager<"locked">(); let pw_unlocked = pw_locked.unlock("psst"); pw_unlocked.set("foo", "bar"); let val = pw_unlocked.get("foo"); pw_locked = pw_unlocked.lock(); }