typescriptdefinepropertyclass-extensions

How to add static methods to built-in classes?


Is there anyhow anyway to add some static method to types like Date, String, Array, etc?

For example I want to add method today to Date class and in JavaScript I can simply add a property to it or maybe I use Object.defineProperty:

Date.today = function(){
    let date = new Date;
    date.setHours(0,0,0,0);
    return date;
}

Object.defineProperty(Date, 'today', { get() { ... }});

But I didn't find anyway to inform TypeScript about this new static member. Am I missing something or Did I google it the wrong way?


Solution

  • You have to augment the DateConstructor interface to add static properties:

    declare global {
        interface DateConstructor {
            today: () => Date
        }
    }   
    
    Date.today = function(){
        let date = new Date;
        date.setHours(0,0,0,0);
        return date;
    }
    

    Similarly extend StringConstructor and ArrayConstructor for string and arrays. See declaration merging.