如何在typescript中的现有类型中添加属性?

时间:2016-11-29 21:55:15

标签: typescript

我正在尝试为javascript'Date'原型添加属性。

在javascript中,我只是这样做:

Object.defineProperty(Date.prototype, "fullYearUTC", {
    get: function () { return this.getUTCFullYear(); },
    enumerable: true,
    configurable: true
});

我以为我只能在打字稿中执行以下操作:

class Date
{
    get fullYearUTC(): number { return this.getUTCFullYear() }
}

但我收到了错误

Cannot redeclare block-scoped variable 'Date'.

为什么这不起作用?

(请不要评论您是否认为这样做是个好主意。这个问题与此无关。)

2 个答案:

答案 0 :(得分:5)

你不能创建一个名为Date的类,你可以拥有自己的日期对象来扩展它:

class MyDate extends Date {
    get fullYearUTC(): number {
        return this.getUTCFullYear();
    }
}

但是如果你想修改现有的Date,你需要继续按照你的javascript代码做的事情。
至于将其添加到ts类型,您需要将其用作接口:

interface Date {
    readonly fullYearUTC: number;
}

或者您可以扩充全局命名空间:

declare global {
    interface Date {
        readonly fullYearUTC: number;
    }
}

答案 1 :(得分:4)

在打字稿中,如果要添加成员,则可以使用交集类型:

type DateWithNewMember <T> = Partial<T> & { newMember: boolean }

用法:

dates: DateWithNewMember<Date>[];

您可以使用联合体类型:

class newDateClass { readonly fullYearUTC: number; }

date: Date | newDateClass