Ist es möglich, eine Mapped Art zu schreiben, die eine Klasse in eine Schnittstelle verwandelt minus die Methoden der Klasse oder irgendwelche zum prototype
zugeordneten Eigenschaften. EG,Typoskript: Mapped Arten: Klasse Schnittstelle ohne Methoden
class Dog {
name: string;
age: number;
bark() {}
get dogYears(): number {
return this.age * 7;
}
}
type InterfaceOf<T> = { /* ??? */ };
type IDog = InterfaceOf<Dog>;
// equivalent to
interface IDog {
name: string;
age: number;
}
Warum muss ich dies tun wollen? Ich bin auf der Suche nach json Objekte in Klassen „deserialisieren“. ZB führe ich eine Abfrage aus, um Hunde aus der Datenbank zu holen, danach möchte ich sie in Klassenobjekte instanziieren, vielleicht unter Verwendung der class-transformer Bibliothek.
function queryDogs(): Promise<{ name: string, age: string }[]>;
function deserialize<T>(cls: (new() => T), input: InterfaceOf<T>): T;
function deserialize<T>(cls: (new() => T), inputs: InterfaceOf<T>[]): T[];
class Dog {
@Type(() => String)
name: string;
@Type(() => Number)
age: number;
bark() {}
get dogYears(): number {
return this.age * 7;
}
}
const dbDogs = await queryDogs();
const dogs: Dog[] = deserialize(Dog, dogs);
Es wäre schön, wenn die deserialize
Funktion weiß, ob die Eingabe die richtige Form war deserialisiert in die Dog-Klasse werden. Ich hatte gehofft, es an der Dog
Klasse aussehen könnte, die ihm gegeben ist, es in die entsprechende Schnittstelle zu verwandeln.
Danke für die detaillierte Antwort und die Warnung. Ich habe meine Frage mit einem Beispiel aktualisiert, wie ich es benutzen könnte. Ich habe das Gefühl, dass mein Anwendungsfall nicht ganz in dieses Warnszenario fällt. Vielleicht sollten Typoskript-Dekoratoren auf diese Weise ähnliche Warnungen erhalten? – sparebytes
Ich würde auch gerne vorschlagen, dass es auch die 'Wählen Sie 'Ansatz, der als der' Remove' Ansatz fast so schmerzhaft ist. Ein weiteres Problem mit den 'Pick'- und' Remove'-Ansätzen ist, dass sie für verschachtelte Klassen zusammenbrechen, zB wenn die 'Hund'-Klasse eine 'Eigentümer'-Eigenschaft von' Mensch' hat –
sparebytes