Určete návratový typ konstruktoru třídy v TypeScriptu
Snažím se vytvořit třídu, která implementuje objekt Date, ale s nějakým rozdílem v tom, že Date analyzuje řetězcový argument bez „Z“ na konci, jako new Date("2022-01-01T00:00:00").
Podaří se mi vytvořit třídu, která funguje dobře, ale chci, aby proměnná vytvořená touto třídou byla inferována jako Date, ne LocalDate.
Snažil jsem se udělat jeho rozhraní, ale neuspěl jsem. Máte nějaký nápad, jak specifikovat návratový typ konstruktoru?
(Chci zachovat strukturu třídy - ne strukturu funkce)
class LocalDate extends Date {
constructor(value: number | string | Date);
constructor(
year: number,
month: number,
date?: number,
hours?: number,
minutes?: number,
seconds?: number,
ms?: number,
);
constructor(...args: any[]) {
if (!args?.length) {
super();
} else if (args?.length === 1) {
const value = args[0];
typeof value === 'string' && !value.endsWith('Z') && !!new Date(value)
? super(
new Date(value + 'Z').getTime() +
new Date().getTimezoneOffset() * MINUTE_AS_MILLISECOND,
)
: super(value);
} else {
super(args[0], args[1], ...args.slice(1));
}
}
}
const VARIABLE = new LocalDate() // I want this to be inferred as Date
Odpověď č. 1
Mít konstruktor třídy, který vrací jiný typ než typ své třídy, není jen velmi špatná praxe v TypeScriptu, je to ve skutečnosti z pochopitelných důvodů nemožné:
https://www.typescriptlang.org/docs/handbook/2/classes.html#constructors
Konstruktory nemohou mít anotace návratového typu - vždy se vrací typ instance třídy