typia Documentation

Super-fast/easy runtime validators and serializers via transformation

5,863 stars TypeScript TypeScript 1 file ยท ~2,334 tokens #agentic-ai#ajv#checker#fast#generator#hacktoberfest#json#json-schema
RAW Doc

1. Project Overview & Quickstart (samchon/typia)

Typia






typescript
// RUNTIME VALIDATORS
export function is<T>(input: unknown): input is T; // returns boolean
export function assert<T>(input: unknown): T; // throws TypeGuardError
export function assertGuard<T>(input: unknown): asserts input is T;
export function validate<T>(input: unknown): IValidation<T>; // detailed

// JSON FUNCTIONS
export namespace json {
  export function schema<T>(): IJsonSchemaUnit<T>; // JSON schema
  export function assertParse<T>(input: string): T; // type safe parser
  export function assertStringify<T>(input: T): string; // safe and faster
}

// AI FUNCTION CALLING HARNESS
export namespace llm {
  // collection of function calling schemas + validators/parsers
  export function application<Class>(): ILlmApplication<Class>;
  export function structuredOutput(): ILlmStructuredOutput;
  // lenient json parser + type coercion
  export function parse<T>(str: string): T;
}

// PROTOCOL BUFFER
export namespace protobuf {
  export function message<T>(): string; // Protocol Buffer message
  export function assertDecode<T>(buffer: Uint8Array): T; // safe decoder
  export function assertEncode<T>(input: T): Uint8Array; // safe encoder
}

// RANDOM GENERATOR
export function random<T>(g?: Partial): T;

typia is a transformer library supporting below features:

  • Super-fast Runtime Validators
  • Enhanced JSON schema and serde functions
  • LLM function calling harness
  • Protocol Buffer encoder and decoder
  • Random data generator

[!NOTE]

  • Only one line required, with pure TypeScript type
  • Runtime validator is 20,000x faster than class-validator
  • JSON serialization is 200x faster than class-transformer
  • LLM function calling harness turns 6.75% โ†’ 100% accuracy

Write the type on the left, and typia compiles it into the validator on the right โ€” at build time, with no schema and no runtime reflection.

Setup

Install typia with the ttsc toolchain.

bash
# install
npm i typia
npm i -D ttsc typescript

# build
npx ttsc

# run a script directly
npx ttsx src/index.ts

You must use ttsc and ttsx. The stock tsc, ts-node, and tsx cannot apply the typia transform, so they will not work.

For bundler integration (Vite, Next.js, Webpack, Rollup, esbuild, ...), use @ttsc/unplugin.

Transformation

If you call typia function, it would be compiled like below.

This is the key concept of typia, transforming TypeScript type to a runtime function. The typia.is<T>() function is transformed to a dedicated type checker by analyzing the target type T in the compilation level.

This feature enables developers to ensure type safety in their applications, leveraging TypeScript's static typing while also providing runtime validation. Instead of defining additional schemas, you can simply utilize the pure TypeScript type itself.

typescript
//----
// examples/checkString.ts
//----
import typia, { tags } from "typia";
export const checkString = typia.createIs<string>();

//----
// examples/checkString.js
//----
import typia from "typia";
export const checkString = (() => {
  return (input) => "string" === typeof input;
})();

Sponsors

Thanks for your support.

Your donation encourages typia development.

Playground

You can experience how typia works by playground website:

Guide Documents

Check out the document in the website:

๐Ÿ  Home

๐Ÿ“– Features

๐Ÿ”— Appendix

Inspired By

2. Official Technical Reference & Guides (samchon/website)

AssemblyScript's Website

The site is built with VuePress and reuses its default theme to ease upgrading to newer versions.

The more important files are:

Editor component

Markdown files can make use of a custom editor component using the editor language tag, like so:

text
```editor
#!optimize=size&runtime=none&noAssert&explicitStart&enable=simd,reference-types
export function add(a: i32, b: i32): i32 {
  return a + b
}

#!html
<script>
loader.instantiate(module_wasm, { /* imports */ })
  .then(({ exports }) => {
    console.log(exports.add(1, 2))
  })
</script>
```

The first line is an optional shebang indicating selected compiler options. Available options are:

  • optimize = string
    Optimization preset to use. Valid presets are speed, size and none
  • noAssert
    Replaces assertions with just their value without trapping.
  • debug
    Enables debug information in emitted binaries.
  • runtime = string
    Specifies the runtime variant to include in the program. Valid variants are full, half, stub and none.
  • noExportMemory
    Does not export the memory to the host.
  • importMemory
    Imports the memory from the host.
  • exportTable
    Exports the function table to the host.
  • importTable
    Imports the function table from the host.
  • explicitStart
    Exports an explicit start function to call.
  • memoryBase = integer
    Sets the start offset of emitted memory segments.
  • tableBase = integer
    Sets the start offset of emitted table elements.
  • use = string
    Comma separated list of global aliases, e.g. to switch the default 'Math' implementation used: Math=JSMath
  • enable = string
    Comma-separated list of future WebAssembly features to enable. Valid features are sign-extension, bulk-memory, simd, threads and reference-types.

The current source and associated compiler options can be serialized into a base64 blob this way. For example, when the ๐Ÿ”— button is clicked, document.location.hash is updated with that blob and the then-sharable link is copied to clipboard.

Building

To work on the site locally, install the dependencies and start a development server serving at localhost:8080:

sh
npm install
npm start

To build the site to dist, i.e. to verify that it works as expected:

sh
npm run build

Distribution files can also be served instead of using the development server with:

sh
npm run serve

The page is automatically deployed on pushes to the repository, plus at least once a day to sync contributors and sponsors.