Search code examples
typescripttypescript-genericsstrict

Typescript create uber-strict types


If I create a custom type such as:

type LowercaseString = string

And then use it in a function like this:

function displayLowercaseString(input: LowercaseString) {
  ...
}

displayLowercaseString('UPPERCASE')

The above example compiles perfectly and runs, since 'UPPERCASE' is of type string and so is LowercaseString

My question is, is it possible to have a TS error such as type string does not match LowercaseString so that I am forced to put every string through a function like this before using it in displayLowercaseString:

function stringToLowercase(input: string): LowercaseString {
  return input.toLowercase as LowercaseString
}

Solution

  • You can use a branded type :

    type LowercaseString = string & { __brand: 'lower' };
    
    
    function stringToLowercase(input: string): LowercaseString {
      return input.toLowerCase() as LowercaseString
    }
    
    function displayLowercaseString(input: LowercaseString) {
    }
    
    const uppercaseString = 'UPPERCASE';
    displayLowercaseString(uppercaseString) // nope 
    displayLowercaseString(stringToLowercase(uppercaseString)) // ok
    

    Playground