Skill: typescript

SkillAI & models

Advanced TypeScript patterns for type-safe, maintainable code using sophisticated type system features. Use when building type-safe APIs, implementing complex domain models, or leveraging TypeScript's advanced type capabilities.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the Skill: typescript skill

What this skill tells your AI

The instructions your AI receives, as published by blockmatic/basilic in .agents/skills/typescript-v6/SKILL.md and read by ahel’s review.

Scope

  • Applies to: TypeScript 6.0+ type system features, type-safe APIs, complex domain models, inference, compile-time guarantees
  • Does NOT cover: Basic syntax, framework-specific patterns, runtime validation (use Zod separately)

Assumptions

  • Folder major tracks package.json typescript (this repo: @typescript/typescript6 ^6), not npm view typescript (may already be 7)
  • 6.0 is the last JavaScript-based compiler; 7.0 is native (Go). @typescript/native may sit beside tsc; it is not this skill’s major
  • Strict mode ("strict": true)
  • Target ES2020+ (6.0 defaults trend toward esnext / es2025)
  • Options deprecated in 6.0 can be ignored with "ignoreDeprecations": "6.0" until 7.0 removes them. Prefer fixing deprecations: https://devblogs.microsoft.com/typescript/announcing-typescript-6-0/

Principles

  • Use conditional types for type selection based on conditions
  • Use mapped types for systematic object type transformations
  • Use type guards (value is Type) for runtime checking with type narrowing
  • Use discriminated unions for type-safe state machines with exhaustiveness checking
  • Use branded types to prevent primitive mixing
  • Prefer unknown over any for type safety
  • Use type guards over type assertions (as Type)
  • Keep types composable and shallow (avoid deep nesting)
  • Mark immutable data structures as readonly

Constraints

MUST

  • Enable strict mode ("strict": true in tsconfig.json)
  • Use unknown instead of any for untyped values
  • Use type guards (value is Type) instead of type assertions when possible

SHOULD

  • Use type for unions/utilities, interface for object shapes
  • Keep types composable and shallow
  • Mark immutable data structures as readonly
  • Use branded types to prevent primitive mixing
  • Address 6.0 deprecations before adopting TypeScript 7 native

AVOID

  • Using any (use unknown with type guards)
  • Type assertions without validation
  • Overusing generics (only when types truly vary)
  • Deep type nesting (slow compilation, hard to debug)
  • Import assertions (assert { type: ... }); use with import attributes

Interactions

  • Works with zod for runtime validation with type inference
  • Complements next for type-safe API routes
  • Complements fastify for type-safe route schemas

Patterns

Mapped Types

Transform object types systematically:

type Partial<T> = { [P in keyof T]?: T[P] }
type Readonly<T> = { readonly [P in keyof T]: T[P] }
type Pick<T, K extends keyof T> = { [P in K]: T[P] }

Type Guards

Runtime type checking with type narrowing:

function isString(value: unknown): value is string {
  return typeof value === 'string'
}

function isSuccess(result: Result): result is Success {
  return result.status === 'success'
}

Branded Types

Create nominal types for type safety:

type UserId = string & { readonly __brand: 'UserId' }
type PostId = string & { readonly __brand: 'PostId' }

function createUserId(id: string): UserId {
  return id as UserId
}

Discriminated Unions

Type-safe state machines with exhaustiveness checking:

type LoadingState =
  | { status: 'idle' }
  | { status: 'loading' }
  | { status: 'success'; data: string[] }
  | { status: 'error'; error: Error }

References

Resources

Signals

GitHub stars
89
Forks
11
Last commit
Sep 2026
Advanced
Catalog kind
skill
Gateway key
typescript-v6
Source
github.com/blockmatic/basilic