typescript

Use when working with TypeScript projects, tooling, and ecosystem. Covers the type system, project configuration, package management, CLI development, and library packages. USE FOR: TypeScript language features, choosing build tools, package managers, project structure, type system guidance, runtime selection DO NOT USE FOR: specific tool configuration details (use the sub-skills: project-system, package-management, cli, packages)

Safety Notice

This listing is imported from skills.sh public index metadata. Review upstream SKILL.md and repository scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "typescript" with this command: npx skills add tyler-r-kendrick/agent-skills/tyler-r-kendrick-agent-skills-typescript

TypeScript

Overview

TypeScript is a statically typed superset of JavaScript that compiles to plain JavaScript. It adds optional type annotations, interfaces, generics, and advanced type-level programming to JavaScript, enabling safer refactoring, better tooling, and self-documenting code. TypeScript has become the default choice for professional JavaScript development across frontend frameworks, backend services, CLIs, and serverless functions.

Knowledge Map

typescript/
├── project-system/       # tsconfig.json, build tools, bundlers, compilation
├── package-management/   # npm, yarn, pnpm, bun, workspaces, publishing
├── cli/                  # Commander, yargs, oclif, ink, chalk, CLI tooling
└── packages/             # Popular libraries (Express, Next.js, Zod, Prisma, etc.)

Choosing Guide

ProblemSub-SkillNotes
Configure tsconfig.json or compiler optionsproject-systemCovers target, module, strict, paths, and all compiler flags
Choose or configure a bundler (Vite, esbuild, etc.)project-systemBuild tool comparison with speed, features, and config examples
Set up monorepo with project referencesproject-systemComposite projects, tsc --build, path aliases
Choose a package manager (npm, pnpm, yarn, bun)package-managementFeature comparison, lockfiles, disk usage, monorepo support
Configure workspaces for a monorepopackage-managementnpm/yarn/pnpm/bun workspace patterns and turborepo integration
Publish a package to npmpackage-managementPublishing workflow, provenance, package.json exports
Build a CLI toolcliCommander, yargs, oclif, ink for TUI, packaging strategies
Add interactive prompts or terminal stylingcliinquirer, prompts, chalk, ora, listr2
Choose or use a specific librarypackagesExpress, Fastify, Next.js, Zod, Prisma, tRPC, and more

TypeScript Version Landscape

VersionKey Features
4.0Variadic tuple types, labeled tuple elements, class property inference from constructors
4.1Template literal types, key remapping in mapped types, recursive conditional types
4.2Leading/middle rest elements in tuples, stricter in operator checks
4.3override keyword, template literal type improvements, static index signatures
4.4Control flow analysis of aliased conditions, symbol and template literal index signatures
4.5Awaited type, tail-recursive conditional types, type modifiers on import names
4.6Control flow analysis for destructured discriminated unions, --target es2022
4.7extends constraints on infer, instantiation expressions, moduleSuffixes
4.8Improved intersection reduction, --build mode --watch, template literal narrowing
4.9satisfies operator, in narrowing for unlisted properties, auto-accessors
5.0Decorators (TC39 standard), const type parameters, --moduleResolution bundler
5.1Easier implicit returns for undefined, unrelated types for getters/setters, @param JSDoc linking
5.2using declarations (explicit resource management), decorator metadata
5.3Import attributes, --resolution-mode in /// <reference>, narrowing in switch (true)
5.4NoInfer utility type, preserved narrowing in closures, Object.groupBy / Map.groupBy
5.5+Inferred type predicates, isolatedDeclarations, regex syntax checking

Core Language Features Quick Reference

Type System Fundamentals

// Union types — value can be one of several types
type Result = "success" | "error" | "pending";
type ID = string | number;

// Intersection types — combine multiple types
type Employee = Person & { employeeId: string };

// Generics — parameterized types
function first<T>(arr: T[]): T | undefined {
  return arr[0];
}

// Conditional types — type-level if/else
type IsString<T> = T extends string ? true : false;

// Mapped types — transform properties
type Readonly<T> = { readonly [K in keyof T]: T[K] };
type Optional<T> = { [K in keyof T]?: T[K] };

// Template literal types — string manipulation at the type level
type EventName<T extends string> = `on${Capitalize<T>}`;
type ClickEvent = EventName<"click">; // "onClick"

// satisfies operator — validate type without widening
const palette = {
  red: [255, 0, 0],
  green: "#00ff00",
} satisfies Record<string, string | number[]>;

// const assertions — narrow to literal types
const routes = ["home", "about", "contact"] as const;
type Route = (typeof routes)[number]; // "home" | "about" | "contact"

// Discriminated unions — tagged union pattern
type Shape =
  | { kind: "circle"; radius: number }
  | { kind: "rectangle"; width: number; height: number };

function area(shape: Shape): number {
  switch (shape.kind) {
    case "circle":
      return Math.PI * shape.radius ** 2;
    case "rectangle":
      return shape.width * shape.height;
  }
}

Key Utility Types

UtilityPurposeExample
Partial<T>Make all properties optionalPartial<User>
Required<T>Make all properties requiredRequired<Config>
Readonly<T>Make all properties readonlyReadonly<State>
Pick<T, K>Select specific propertiesPick<User, "id" | "name">
Omit<T, K>Remove specific propertiesOmit<User, "password">
Record<K, V>Object type with key/value typesRecord<string, number>
Exclude<T, U>Remove types from a unionExclude<Status, "deleted">
Extract<T, U>Keep only matching union membersExtract<Event, { type: "click" }>
NonNullable<T>Remove null and undefinedNonNullable<string | null>
ReturnType<T>Extract function return typeReturnType<typeof fetch>
Parameters<T>Extract function parameter typesParameters<typeof setTimeout>
Awaited<T>Unwrap Promise typesAwaited<Promise<string>>
NoInfer<T>Prevent inference on a type parameterNoInfer<T> in default args

Runtime Options

RuntimeKey StrengthsTypeScript Support
Node.jsLargest ecosystem, widest deployment, mature toolingVia tsc, ts-node, tsx, esbuild, or swc
DenoBuilt-in TypeScript, secure by default, web-standard APIsNative — no build step required
BunFastest startup, built-in bundler/test runner/package managerNative — runs .ts files directly
Cloudflare WorkersEdge computing, V8 isolates, global deploymentVia Wrangler with esbuild under the hood

Choosing a Runtime

  • Building a production server or API? Node.js has the broadest library support and hosting options.
  • Want built-in TypeScript with no config? Deno runs .ts natively with LSP and formatter included.
  • Need maximum startup speed or an all-in-one tool? Bun combines runtime, bundler, package manager, and test runner.
  • Deploying at the edge? Cloudflare Workers provide sub-millisecond cold starts globally.

Best Practices

  1. Enable strict mode in every project. It enables strictNullChecks, noImplicitAny, strictFunctionTypes, and other flags that catch real bugs.

  2. Avoid any — it disables all type checking. Use unknown when the type is truly unknown, then narrow with type guards.

  3. Prefer unknown over any for values of uncertain type:

    function parse(input: unknown): Config {
      if (typeof input === "object" && input !== null && "port" in input) {
        return input as Config;
      }
      throw new Error("Invalid config");
    }
    
  4. Use type narrowing instead of type assertions:

    // Prefer this
    if (typeof value === "string") {
      console.log(value.toUpperCase());
    }
    // Over this
    console.log((value as string).toUpperCase());
    
  5. Use branded types for domain identifiers to prevent mixing:

    type UserId = string & { __brand: "UserId" };
    type OrderId = string & { __brand: "OrderId" };
    
    function getUser(id: UserId): User { /* ... */ }
    // getUser(orderId) — compile error!
    
  6. Use satisfies to validate object shapes without widening types.

  7. Use const assertions for literal tuples and objects that should not be widened.

  8. Use discriminated unions for state machines and variant types instead of optional properties.

  9. Enable noUncheckedIndexedAccess to force undefined checks on dynamic property access.

  10. Keep any out of library boundaries — validate external data at the edge with Zod, io-ts, or similar runtime validators.

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

Coding

typescript

No summary provided by upstream source.

Repository SourceNeeds Review
Coding

dev

No summary provided by upstream source.

Repository SourceNeeds Review
Coding

python

No summary provided by upstream source.

Repository SourceNeeds Review
Coding

devcontainer

No summary provided by upstream source.

Repository SourceNeeds Review