hvordan legger du til en egenskap til en eksisterende type i TypeScript?


Jeg prøver å legge til en egenskap på JavaScript 'Date'-prototype.

i javascript ville jeg bare gjort dette:

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

Jeg trodde jeg bare kunne gjøre følgende i TypeScript:

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

men jeg får feilen

Cannot redeclare block-scoped variable 'Date'.

hvorfor fungerer ikke dette?

(vær så snill å ikke kommentere om du synes dette er en god idé eller ikke. Dette spørsmålet handler ikke om det.)

Svar #1

Snittype

I TypeScript, hvis du vil legge til medlemmer, kan du bruke en krysstype:

type DateWithNewMember = T & { newMember: boolean }

Hvor T er typen du vil legge til medlem til.

Bruk det da slik:

dates: DateWithNewMember<Date>[];

Unionstype

Du kan bruke Union-type:

class newDateClass {
   readonly fullYearUTC: number;
}

Bruk det da slik:

date: Date | newDateClass

Svar #2

Du kan ikke lage en klasse med navnet Date, du kan ha ditt eget datoobjekt som utvider den:

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

Men hvis du vil endre den eksisterende Date må du fortsette å gjøre det du gjorde med javascript-koden din.
Når det gjelder å legge det til i ts-typen, må du bruke det som et grensesnitt:

interface Date {
    readonly fullYearUTC: number;
}

Eller du kan utvide det globale navneområdet:

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

Relaterte artikler