TGViewer
WebDev+ | Веб-разработка WebDev+ | Веб-разработка @webdev_plus · 7.9K subscribers
Post #1182 1.11K
Типобезопасные переходы между состояниями с корректным автодополнением

// Type-safe state transitions

type IdleState = {
status: "idle";
connect: () => ConnectedState;
};

type ConnectedState = {
status: "connected";
send: (data: string) => ConnectedState;
disconnect: () => IdleState;
};

function createApi(): IdleState {
return {
status: "idle",
connect() {
const id = `${Date.now()}`;
// establish connection
return {
status: "connected",
send(data) {
// send data
console.log(`${data} (${id})`);
return this;
},
disconnect() {
// close connection
return createApi();
},
};
},
};
}

// Usage
const api = createApi();

api.connect().send("Hello world!").disconnect();
// ✅ Works!

api.send("Send without connect");
// ❌ TypeScript Error: Property 'send' does not exist


@WebDev_Plus
More from @webdev_plus
  1. Oct 8, 2026Как работают очереди в контексте HTTP-запросов Разбираются основные стратегии очередей: FI…
  2. Oct 7, 2026Разработчики Next.js: добавьте эти 4 строки в ваш .vscode/settings.json, чтобы сразу прока…
  3. Oct 7, 2026Полезное расширение для Chrome «Responsive Viewer» Помогает веб-разработчикам и дизайнерам…
  4. Oct 6, 2026Laravel / PHP: как предпочитаете отправлять письма — описывать их прямо в месте вызова или…
  5. Oct 6, 2026Этот HTML-косяк непростителен. Не использовать атрибут inputmode в элементах input — серьё…
  6. Oct 5, 2026Работает!? Не трогай 🎯
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →