export const VariantTag = "_tag"; export type VariantTag = typeof VariantTag; export interface TaggedVariant { readonly [VariantTag]: TTag; } export type VariantFromTag< TVariant extends TaggedVariant, TTag extends TVariant[VariantTag], > = Extract; export namespace Variant { export function is< TVariant extends TaggedVariant, TTag extends TVariant[VariantTag], >( variant: TVariant, tag: TTag, ): variant is Extract { return variant[VariantTag] === tag; } }