Skip to main content

Essential TypeScript Utility Packages for 2026

·PkgPulse Team
0

TypeScript's type system is powerful, but some tasks need libraries to be practical. These utility packages fill the gaps — from runtime validation to type manipulation to developer ergonomics.

Every package here is actively maintained, well-typed, and used in production by thousands of projects. Download data from PkgPulse.

Schema Validation

Zod

The TypeScript-first schema validation library. Define a schema once, get both runtime validation and static types.

  • Downloads: 14M/week
  • Size: 13KB (gzip)
  • Use case: Form validation, API input/output, config parsing
import { z } from 'zod';

const UserSchema = z.object({
  name: z.string().min(2),
  email: z.string().email(),
  age: z.number().int().positive().optional(),
});

type User = z.infer<typeof UserSchema>; // TypeScript type auto-generated

const result = UserSchema.safeParse(input);
if (result.success) {
  console.log(result.data); // Fully typed
}

Why it dominates: One schema definition gives you both TypeScript types and runtime validation. No more writing types AND validation rules separately.

Valibot

The lightweight alternative to Zod. Modular, tree-shakeable, 98% smaller in many cases.

  • Downloads: 400K/week
  • Size: 0.5-5KB (depending on features used)
  • Use case: Same as Zod, but when bundle size is critical
import * as v from 'valibot';

const UserSchema = v.object({
  name: v.pipe(v.string(), v.minLength(2)),
  email: v.pipe(v.string(), v.email()),
  age: v.optional(v.pipe(v.number(), v.integer(), v.minValue(1))),
});

type User = v.InferOutput<typeof UserSchema>;

When to choose over Zod: Client-side validation where bundle size matters. Valibot's tree-shaking means you only ship the validators you use.

Type Utilities

ts-reset

Fixes TypeScript's built-in types to be more useful. A single import that makes .filter(Boolean), .json(), and JSON.parse() return better types.

  • Downloads: 700K/week
  • Size: 0KB (types only, no runtime)
// Before ts-reset
const filtered = [1, undefined, 2].filter(Boolean);
// Type: (number | undefined)[] — still includes undefined!

// After ts-reset
const filtered = [1, undefined, 2].filter(Boolean);
// Type: number[] — correct!
// Before ts-reset
const data = JSON.parse(input);
// Type: any

// After ts-reset
const data = JSON.parse(input);
// Type: unknown — forces you to validate

Install it on every TypeScript project. Zero runtime cost, immediate type safety improvements.

type-fest

A curated collection of essential TypeScript utility types. If you've ever needed PartialDeep, SetRequired, CamelCase, or Simplify — it's here.

  • Downloads: 30M/week
  • Size: 0KB (types only)
import type { PartialDeep, CamelCase, SetRequired } from 'type-fest';

// Make all nested properties optional
type DeepPartialUser = PartialDeep<User>;

// Convert string to camelCase type
type Key = CamelCase<'user-profile-settings'>; // 'userProfileSettings'

// Make specific optional fields required
type UserWithEmail = SetRequired<User, 'email'>;

ts-pattern

Exhaustive pattern matching for TypeScript. Like a supercharged switch statement that the compiler verifies is complete.

  • Downloads: 1M/week
  • Size: 3KB (gzip)
import { match, P } from 'ts-pattern';

type Shape =
  | { type: 'circle'; radius: number }
  | { type: 'rect'; width: number; height: number };

const area = match(shape)
  .with({ type: 'circle' }, ({ radius }) => Math.PI * radius ** 2)
  .with({ type: 'rect' }, ({ width, height }) => width * height)
  .exhaustive(); // Compile error if a case is missing

Date & Time

date-fns

Modular date utility library. Import only the functions you need — tree-shaking keeps your bundle small.

  • Downloads: 18M/week
  • Size: 2-10KB (per function, gzipped)
import { format, addDays, differenceInDays } from 'date-fns';

format(new Date(), 'yyyy-MM-dd'); // '2026-03-04'
addDays(new Date(), 7); // Next week
differenceInDays(endDate, startDate); // Days between

Day.js

Moment.js replacement with the same API but at 2KB. If you want a simple, familiar API:

  • Downloads: 16M/week
  • Size: 2.9KB (gzip)
import dayjs from 'dayjs';

dayjs().format('YYYY-MM-DD');
dayjs().add(7, 'day');
dayjs(endDate).diff(startDate, 'day');

Environment & Configuration

dotenv

Load environment variables from .env files. Still the standard after all these years.

  • Downloads: 35M/week
  • Size: 2KB

@t3-oss/env-nextjs

Type-safe environment variables for Next.js. Combines Zod validation with environment variable loading.

  • Downloads: 500K/week
import { createEnv } from '@t3-oss/env-nextjs';
import { z } from 'zod';

export const env = createEnv({
  server: {
    DATABASE_URL: z.string().url(),
    STRIPE_SECRET_KEY: z.string().startsWith('sk_'),
  },
  client: {
    NEXT_PUBLIC_APP_URL: z.string().url(),
  },
  runtimeEnv: {
    DATABASE_URL: process.env.DATABASE_URL,
    STRIPE_SECRET_KEY: process.env.STRIPE_SECRET_KEY,
    NEXT_PUBLIC_APP_URL: process.env.NEXT_PUBLIC_APP_URL,
  },
});

// env.DATABASE_URL is guaranteed to be a valid URL string

Unique ID Generation

nanoid

Tiny, secure, URL-friendly unique ID generator. Smaller and faster than UUID.

  • Downloads: 22M/week
  • Size: 0.5KB (gzip)
import { nanoid } from 'nanoid';

nanoid(); // "V1StGXR8_Z5jdHi6B-myT" (21 chars, URL-safe)
nanoid(10); // "IRFa-VaY2b" (custom length)

cuid2

Collision-resistant IDs optimized for horizontal scaling and security. The successor to cuid.

  • Downloads: 800K/week
import { createId } from '@paralleldrive/cuid2';

createId(); // "tz4a98xxat96iws9zmbrgj3a"

HTTP & Data Fetching

ky

Tiny HTTP client built on fetch. Cleaner API than native fetch with retries, JSON shortcuts, and hooks.

  • Downloads: 2M/week
  • Size: 3KB (gzip)
import ky from 'ky';

const data = await ky.get('https://api.example.com/data').json<User[]>();
// Automatic JSON parsing, typed response

ofetch

Universal fetch library from the UnJS ecosystem. Works in Node.js, Deno, Bun, and browsers.

  • Downloads: 8M/week
  • Size: 3KB (gzip)
import { ofetch } from 'ofetch';

const data = await ofetch<User[]>('/api/users', {
  retry: 3,
  retryDelay: 1000,
});

String & Data Manipulation

slugify

Convert strings to URL-friendly slugs.

  • Downloads: 3M/week
  • Size: 1KB
import slugify from 'slugify';
slugify('Hello World!', { lower: true }); // 'hello-world'

superjson

Serialize and deserialize JavaScript values that JSON.stringify can't handle — dates, maps, sets, BigInts, and more.

  • Downloads: 3M/week
  • Size: 4KB
import superjson from 'superjson';

const data = { date: new Date(), set: new Set([1, 2, 3]) };
const json = superjson.stringify(data);
const parsed = superjson.parse(json); // Dates and Sets restored

Our Curated Stack

If you're starting a new TypeScript project, here's our recommended utility stack:

NeedPackageSize
ValidationZod (or Valibot for small bundles)13KB / 0.5KB
Type helperstype-fest + ts-reset0KB (types only)
Pattern matchingts-pattern3KB
Datesdate-fns2-10KB
HTTP clientky or ofetch3KB
IDsnanoid0.5KB
Env validation@t3-oss/env-nextjs

Total runtime impact: ~22KB gzipped. That's a complete utility layer for less than a single React component library.

Browse all these packages on PkgPulse to compare health scores, download trends, and alternatives.

The 2026 JavaScript Stack Cheatsheet

One PDF: the best package for every category (ORMs, bundlers, auth, testing, state management). Used by 500+ devs. Free, updated monthly.