Skip to main content

Chat CLI (TypeScript)

The familiar CLI app, now with types


Overview​

This example takes the Chat CLI and adds TypeScript type annotations. You'll see how types serve as documentation and catch errors before runtime.

Why this matters:

  • Types communicate intent to other developers (and AI assistants)
  • Catch bugs at compile time, not runtime
  • Better autocomplete and editor support
  • Foundation for larger applications

What You'll Learn​

  • Type Annotations: Declaring what data looks like
  • Interfaces: Defining shapes for objects
  • Discriminated Unions: Handling different message types
  • Type Compilation: How TypeScript becomes JavaScript

Prerequisites​

  • Completed Chat CLI
  • Node.js installed
  • Basic understanding of the CLI version

Project Structure​

13-chat-cli-typescript/
├── package.json
├── tsconfig.json # TypeScript configuration
└── src/
├── types.ts # Message, User, Conversation types
└── messages.ts # Typed message operations

Key Types​

// types.ts
interface Message {
id: string;
sender: string;
content: MessageContent;
timestamp: string;
}

type MessageContent =
| { type: 'text'; text: string }
| { type: 'image'; url: string; alt?: string }
| { type: 'system'; event: string };

Why Discriminated Unions?​

The type field lets TypeScript know exactly what properties are available:

function renderMessage(content: MessageContent) {
switch (content.type) {
case 'text':
return content.text; // TypeScript knows .text exists
case 'image':
return `[Image: ${content.alt}]`; // TypeScript knows .url and .alt exist
case 'system':
return `** ${content.event} **`;
}
}

Quick Start​

cd examples/13-chat-cli-typescript
npm install
npm run build # Compile TypeScript
npm start # Run the compiled JavaScript

Curriculum Alignment​

This example aligns with:

  • Module 04: Types as Communication — Using types to express intent

Next Steps​

Ready for a modern frontend framework? Continue to Chat React SPA.


Source Code​

View the complete source: examples/13-chat-cli-typescript/