Created
July 25, 2018 03:12
-
-
Save edwingustafson/32d49031e52f79636a29df72a5b65ff3 to your computer and use it in GitHub Desktop.
Nominal typing using flavors/flavoring
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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