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

Spo*_*man 3 typescript

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

在javascript中,我只是这样做:

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

我以为我只能在打字稿中做以下事情:

class Date
{
    get fullYearUTC(): number { return this.getUTCFullYear() }
}
Run Code Online (Sandbox Code Playgroud)

但我得到了错误

Cannot redeclare block-scoped variable 'Date'.
Run Code Online (Sandbox Code Playgroud)

为什么这不起作用?

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

小智 17

交叉口类型

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

type DateWithNewMember <T> = Partial<T>
   & { newMember: boolean }
Run Code Online (Sandbox Code Playgroud)

然后像这样使用:

dates: DateWithNewMember<Date>[];
Run Code Online (Sandbox Code Playgroud)

联合类型

您可以使用联合类型:

class newDateClass {
   readonly fullYearUTC: number;
}
Run Code Online (Sandbox Code Playgroud)

然后像这样使用:

date: Date | newDateClass
Run Code Online (Sandbox Code Playgroud)


Nit*_*mer 5

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

class MyDate extends Date {
    get fullYearUTC(): number {
        return this.getUTCFullYear();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

interface Date {
    readonly fullYearUTC: number;
}
Run Code Online (Sandbox Code Playgroud)

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

declare global {
    interface Date {
        readonly fullYearUTC: number;
    }
}
Run Code Online (Sandbox Code Playgroud)