Template Literal Types with Typescript

16 August 2021

Contents

    Template literal types provide us a way to combine string types or enums in Typescript.

    In the below example, we can make use of a string type called Action and an enum called Resource to define a type which is a combination of an action combined with a resource

    type Action = 'UPDATE' | 'CREATE' | 'DELETE'
    
    enum Resource {
      Person = 'Person',
      Product = 'Product',
      Sale = 'Sale'
    }
    
    // the `Lowercase` type concerts all string type options to lowercase
    type ResourceAction = `${Resource}.${Action}`
    

    Such that the ResourceAction type is now defined as:

    
    type ResourceAction = 
      "Person.UPDATE" 
      | "Person.CREATE" 
      | "Person.DELETE" 
      | "Product.UPDATE" 
      | "Product.CREATE" 
      | "Product.DELETE" 
      | "Sale.UPDATE" 
      | "Sale.CREATE" 
      | "Sale.DELETE"
    

    Now, if you're like me - you probably want your types to be consistent in some way. For this purpose, we can use the Lowercase type as follows:

    type ResourceActionLowercase = Lowercase<`${Resource}.${Action}`>
    

    Which results in the following types:

    type ResourceActionLowercase = 
      "person.update" 
      | "person.create" 
      | "person.delete" 
      | "product.update" 
      | "product.create" 
      | "product.delete" 
      | "sale.update" 
      | "sale.create" 
      | "sale.delete"