Skip to content

Instantly share code, notes, and snippets.

@edwingustafson
Created July 25, 2018 03:12
Show Gist options
  • Save edwingustafson/32d49031e52f79636a29df72a5b65ff3 to your computer and use it in GitHub Desktop.
Save edwingustafson/32d49031e52f79636a29df72a5b65ff3 to your computer and use it in GitHub Desktop.
Nominal typing using flavors/flavoring
// https://spin.atomicobject.com/2018/01/15/typescript-flexible-nominal-typing/
type Flavor<K, T> = K & { __flavor?: T };
type CatalogNumber = Flavor<string, 'catalogNumber'>;
type CasNumber = Flavor<string, 'casNumber'>;
const pge2CatalogNumber: CatalogNumber = '14010';
const pge2CasNumber: CasNumber = '363-24-6';
// Functions (with dummy implementations) requiring specific flavored types
const validateCatalogNumber: (s: CatalogNumber) => boolean = (s) => true;
const validateCasNumber: (s: CasNumber) => boolean = (s) => true;
console.log(validateCatalogNumber(pge2CatalogNumber));
// Fails to compile, incompatible types
console.log(validateCasNumber(pge2CatalogNumber));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment