2.0.4 • Published 4 years ago

@seancroach/ts-opaque v2.0.4

Weekly downloads
-
License
MIT
Repository
github
Last release
4 years ago

ts-opaque Build Status Version License

Easy-to-use library that implements opaque types in TypeScript!

Installation

# Install ts-opaque through npm:
$ npm install ts-opaque

# Or, if you prefer yarn:
$ yarn add ts-opaque

Motivation

An opaque type, in TypeScript, is a type whose true structure is obfuscated to the compiler at compile-time. These types can make your code more type safe, secure, easier to refactor, and faster!

While Flow has an opaque keyword for creating opaque types, TypeScript does not; this package is my solution.

Usage

import Opaque from "ts-opaque";

interface User {
	readonly id: Opaque<number, User>;
	name: string;
}

interface Post {
	readonly id: Opaque<number, Post>;
	readonly authorId: User["id"];
	title: string;
	body: string;
}

let myUser: User = {
	// Error, type 'number' is not assignable to type 'Opaque<number, User>'
	id: 1,
	name: "John Doe",
};

myUser = {
	id: 1 as User["id"],
	name: "John Doe",
};

let myPost: Post = {
	// Error, type 'number' is not assignable to type 'Opaque<number, Post>'
	id: 1,
	// Error, type 'number' is not assignable to type 'Opaque<number, User>'
	authorId: 1,
	title: "ts-opaque",
	body: "It's a pretty cool package.",
};

myPost = {
	id: 1 as Post["id"],
	authorId: myUser.id,
	title: "ts-opaque",
	body: "It's a pretty cool package.",
};

There are other types and helper function ts-opaque exports as well! Check out the API below.

API

Please view the full documentation here.

Related Works

Others have made fantastic packages to implement opaque types in TypeScript. While these implementations are flawless in their functionality, ts-opaque brands its opaque types with symbol keys, hiding them directly from your IDE's intellisense or its equivalent. ts-opaque is also distributed with helper functions and types to manipulate and use opaque types easily. Spread some love to these works:

License

This package is available as open source under the terms of the MIT License.