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

TypeScript: How to add static methods to built-in classes

有没有办法为 DateStringArray 等类型添加一些静态方法?

例如我想将方法​​ today 添加到 Date class 并且在 JavaScript 中我可以简单地添加一个 属性 或者我使用 Object.defineProperty:

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

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

但无论如何我都没有通知 TypeScript 这个新的静态成员。 我是漏掉了什么还是我 google 弄错了?

您必须扩充 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

我使用此代码通过静态方法扩展对象。 导出 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 中你必须这样称呼 class

new ObjectExtensions();

然后你可以这样使用它:

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