feat(dev): add `Distinct` type

Useful for creating types that are stored as other types (usually
primitives) but are represented as distinct in the type system.
Canonical example exists in documentation.
This commit is contained in:
Rickard Andersson 2023-08-03 11:01:01 +03:00
parent 41e24a1e4f
commit b55c88fec5
1 changed files with 17 additions and 0 deletions

17
src/types.ts Normal file
View File

@ -0,0 +1,17 @@
/**
* A module for utility types that could be used in pretty much every module.
*/
/**
* Allows one to create a type that is stored as an underlying type but is distinct from it in the
* type system.
*
* @example
* // Creates a distinct `UUID` type from a `string` which can then be expected and only passed
* // with either a `UUID` constructor or a value that comes from elsewhere as a constructed `UUID`.
* type UUID = Distinct<"UUID", string>;
* function UUID(uuid: string): UUID {
* return uuid as UUID;
* }
*/
export type Distinct<Tag, Type> = Type & { readonly __distinct_tag: Tag };