TypeScript:如何向内置类添加静态方法

时间:2017-10-10 10:43:09

标签: typescript defineproperty class-extensions

无论如何,无论如何都要为DateStringArray等类型添加静态方法?

例如,我想将方法​​today添加到Date类,在JavaScript中我可以简单地向其添加属性,或者我可以使用Object.defineProperty:

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

但是我没有找到通知TypeScript这个新的静态成员。 我错过了什么或者我是否以错误的方式谷歌?

2 个答案:

答案 0 :(得分:7)

您必须扩充DateConstructor接口以添加静态属性:

declare global {
    interface DateConstructor {
        today: () => Date
    }
}   

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

同样为字符串和数组扩展StringConstructorArrayConstructor。请参阅declaration merging

答案 1 :(得分:1)

我使用此代码使用静态方法扩展Object。     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;
}

在main.ts中你必须像这样调用这个类

new ObjectExtensions();

然后你可以像这样使用它:

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