Deepkit Runtime Types // Deepkit Enterprise TypeScript Framework (original) (raw)
Rich runtime type system for TypeScript with reflection, serialization, validation, and many more features. Works in any JavaScript runtime without code generation step. Plugins available for TypeScript official compiler tsc
, Vite, Bun, and Webpack.
Features
Runtime Types
Makes TypeScript types available in any JavaScript runtime.
Validation
With powerful validation of your TypeScript types, without code-generation step.
Serialisation
Fast and flexible serialisation from and to JSON, database, BSON, and more.
Reflection
Introspect all types via standardised in runtime and unlock TypeScript at runtime.
Automatic Type-Guards
Type-Guards and Type-Assertions in runtime, automatically from your types.
Highly Customizable
Add your own custom type annotation, serializers, naming strategies, and more.
Runtime TypeScript Types
Deepkit Type provides a rich runtime type system for TypeScript. It allows you to use your TypeScript types in any JavaScript runtime, like Node.js, Deno, or the browser.
import { MinLength, stringifyResolvedType, typeOf } from '@deepkit/type';
type Username = string & MinLength<3>;
interface User { username: Username; password: string; created: Date; }
const type = typeOf(); console.log('Type introspection', type); console.log('Type stringify', stringifyResolvedType(type));
Type Cast
Real type casting in runtime for TypeScript. This is not a type assertion, but a real type cast. It converts the value to the correct type.
Whenever you load data from a database, HTTP request, JSON, or any other source, you can use cast
to convert the data to the correct type.
import { cast } from '@deepkit/type';
interface User { username: string; logins: number; created: Date; }
const user = cast({ username: 'Peter', logins: '3', created: '2020-01-01' });
Reflection API
Easy to use reflection API to introspect your types. This is especially useful for building generic libraries that work with any TypeScript type.
With the reflection API you can get all properties of classes, interfaces, or functions, properties, all methods, their parameters, and more.
import { ReflectionClass } from '@deepkit/type';
class User { logins: number = 1; created: Date = new Date;
constructor(public username: string) {
}
}
const reflection = ReflectionClass.from(User);
reflection.getMethodParameters('constructor'); for (const p of reflection.getProperties()) { p.name; p.type; p.isOptional(); p.getVisibility(); }
Serialization
Serialize data to JSON, BSON, or any other format. The serialization is very fast and flexible. You can use it to serialize data for HTTP responses, databases, queues, files, or any other use case.
Highly configurable and extensible. You can add your own custom types, custom serializers, custom naming strategy, and more.
Use serialize
to convert your data to a plain JavaScript object, and cast
to convert it back.
import { serialize, cast } from '@deepkit/type';
interface User { username: string; logins: number; created: Date; }
const jsonObject = serialize({ username: 'Peter', logins: 3, created: new Date, });
const user = cast(jsonObject);
Type Object Serialization
Deepkit Type provides a special serialization format for TypeScript types. This is useful if you want to send your TypeScript types to another JavaScript runtime, like the browser, or a Node.js worker.
This makes it possible to store the inherently circular TypeScript type object in a JSON.
import { serializeType, deserializeType, cast } from '@deepkit/type';
interface User { username: string; logins: number; created: Date; }
const typeObject = serializeType(typeOf());
const type = deserializeType(typeObject);
const o = cast(data, undefined, undefined, undefined, type);
Remapping
As a data mapper, Deepkit Type can convert your data from one shape to another.
Support for custom naming strategies. You can use this to convert your property names to camelCase, snake_case, or any other naming strategy.
import { cast, MapName, underscoreNamingStrategy} from '@deepkit/type';
interface User { username: string; firstName: string; group: string & MapName<'group_id'>; }
const jsonObject = { username: 'pete', first_name: 'Peter', group_id: 'admin' };
const user = cast(data, undefined, undefined, underscoreNamingStrategy);
Type Guards
TypeScript type guards in runtime. Whenever you accept untrusted data or any
, you can use is
to check if the data is of a specific type.
Type Assertion with assert
to check the data and throw an error if it is not of the expected type.
import { is, assert} from '@deepkit/type';
interface User { username: string; firstName: string; group: string & MapName<'group_id'>; }
const user = await fetch('/user/1'); if (is(user)) {
user.username;
}
assert(user);
1. What is the primary purpose of the Deepkit Type library?
The primary use-case of Deepkit Runtime Types is to make TypeScript types available in runtime and enable with it a big range of use-cases. Many of them like validation and serialisation is already covered in Deepkit Runtime Types.
2. How does Deepkit Type integrate with existing TypeScript projects
Deepkit Type integrates with existing TypeScript projects by providing a plugin for either TypeScript compiler (which is compatible with Angular, React, ts-node, etc), or as Vite, Webpack, or Bun plugin. Once installed, Deepkit Type can be used right away in your TypeScript code without any code generation steps.
3. What kind of validation can I perform using Deepkit Type?
Deepkit Type provides a powerful validation engine that can validate any data structure against a given type. It supports almost all TypeScript types, including generics, unions, intersections, mapped types, conditionals, index access, and more.
4. What kind of serialization can I perform using Deepkit Type?
Deepkit Type provides a powerful serialization engine that can serialize any data structure into a target structure. It comes with JSON and BSON serializer and can be extended with custom serializers. It supports almost all TypeScript types, including generics, unions, intersections, mapped types, conditionals, index access, and more.
5. How does it compare to Zod, io-ts, and other validation libraries?
Deepkit Type is a full-featured TypeScript runtime type system that can be used for validation, serialization, and more. It is not only a validation library, but a full-featured runtime type system that can be used for much more.
While you define your schemas in Zod & co using a custom DSL with an expensive type inference step, Deepkit Type uses just TypeScript types and enriches the type system with Type Annotations to allow to define validation constraints. This way it's much more powerful as it allows the expressiveness of TypeScript types and does not force you to learn a new DSL.