Comprehensive TypeScript guidance covering compiler configuration, advanced types, utility types, type guards, strict mode workflows, and documentation patterns; use when configuring tsconfig, designing complex generics, making illegal states unrepresentable, fixing type errors, or writing testable and maintainable type-safe APIs.
Overall
score
99%
Does it follow best practices?
Validation for skill structure
Type-first development means defining types before implementation. This workflow ensures type safety from the start and lets the compiler guide completeness.
// 1. Define data model first
interface User {
id: string;
email: string;
name: string;
createdAt: Date;
}
type CreateUserRequest = Omit<User, 'id' | 'createdAt'>;
type UpdateUserRequest = Partial<CreateUserRequest>;
// 2. Define function signatures
async function createUser(req: CreateUserRequest): Promise<User>;
async function updateUser(id: string, req: UpdateUserRequest): Promise<User>;
async function getUser(id: string): Promise<User | null>;
// 3. Implement to satisfy types
async function createUser(req: CreateUserRequest): Promise<User> {
const id = crypto.randomUUID();
const createdAt = new Date();
const user: User = { ...req, id, createdAt };
await db.users.insert(user);
return user;
}Code-First (avoid):
// Implementation first, types inferred
function processData(data) {
if (data.status === 'active') {
return data.items.map(i => i.value);
}
return [];
}Type-First (preferred):
// Types first, implementation second
type Status = 'active' | 'inactive';
interface DataItem {
value: number;
}
interface Data {
status: Status;
items: DataItem[];
}
function processData(data: Data): number[] {
if (data.status === 'active') {
return data.items.map(i => i.value);
}
return [];
}Types are compile-time only. Use Zod to bridge compile and runtime:
import { z } from 'zod';
// Schema as source of truth
const UserSchema = z.object({
id: z.string().uuid(),
email: z.string().email(),
name: z.string().min(1),
createdAt: z.date(),
});
// Infer TypeScript type from schema
type User = z.infer<typeof UserSchema>;
// Validate at runtime boundaries
function parseUser(data: unknown): User {
return UserSchema.parse(data);
}Install with Tessl CLI
npx tessl i pantheon-ai/typescript-advanced@0.1.1references