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;
}
}
