Morteza Tourani
Morteza Tourani

Reputation: 3536

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?

Upvotes: 14

Views: 7928

Answers (2)

Oleg Polezky
Oleg Polezky

Reputation: 1132

I use this code to extend Object with static method. export class ObjectExtensions { }

declare global {
    interface ObjectConstructor {
        safeGet<T>(expresstion: () => T, defaultValue: T): T;
    }
}

Object.safeGet = function <T>(expresstion: () => T, defaultValue: T): T {
    try {
        const value = expresstion();
        if (value != null) return value;

    } catch (e) {
    }
    return defaultValue;
}

In main.ts you have to call this class like this

new ObjectExtensions();

And then you can use it like this:

Object.safeGet<number>(() => data.property.numberProperty);

Upvotes: 1

Saravana
Saravana

Reputation: 40594

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.

Upvotes: 21

Related Questions