type-brandy
Version:
Nominal typing for TypeScript
17 lines (16 loc) • 711 B
TypeScript
interface Flavoring<Kind extends string> {
readonly __kind__?: Kind;
}
interface Branding<Base, Kind extends string> {
readonly __base__: Base;
readonly __kind__: Kind;
}
type Flavor<Base, Kind extends string> = Base & Flavoring<Kind>;
type Brand<Base, Kind extends string> = Base & Branding<Base, Kind>;
type AnyBrand = Brand<unknown, string>;
type BaseOf<B extends AnyBrand> = B['__base__'];
type Brander<Brand extends AnyBrand> = (value: BaseOf<Brand>) => Brand;
type BrandValidator<Brand extends AnyBrand> = (value: BaseOf<Brand>) => void;
declare function make<Brand extends AnyBrand>(validator?: BrandValidator<Brand>): Brander<Brand>;
export type { Flavor, Brand, Brander };
export { make };