Holen Sie den Typ des Getters/Setters einer Klassen-Eigenschaft in TypeScript
Da TypeScript-Klassenattribute seit Version 4.3 Getter und Setter unterschiedlicher Typen haben können, weiß ich nicht, wie man korrekt die Typen eines Getters und Setters einer Eigenschaft erhält.
===
Da eine Klassen-Eigenschaft als Variable betrachtet wird, kann ich nicht richtig unterscheiden, ob die gegebene Eigenschaft einen Getter oder/und Setter hat und ihren Typ (da Parameters<I> und ReturnType<I> nur bei einer Funktion/Methode funktionieren).
Einige Ideen des erwarteten Ergebnisses:
class Foo {
get bar(): number { /** ... */ }
set bar(baz: string) { /** ... */ }
}
type GetterOfFooBar = GetterOf<typeof Foo.prototype.bar>; // number
type SetterOfFooBar = SetterOf<typeof Foo.prototype.bar>; // string
class Foo {
get bar(): number { /** ... */ }
}
type GetterOfFooBar = GetterOf<typeof Foo.prototype.bar>; // number
type SetterOfFooBar = SetterOf<typeof Foo.prototype.bar>; // never
Antwort #1
Jegliche Verwendung des Typsystems, um den Eigenschaftstyp eines Varianten-Zugriffs zu beobachten, wird zu dem Typ führen, den Sie lesen, nicht zu dem Typ, den Sie schreiben. Das bedeutet, dass GetterOf<T> einfach ist, aber SetterOf<T> unmöglich ist.
Dies scheint nicht sehr gut dokumentiert zu sein. Es wird in der Diskussion von microsoft/TypeScript#53417 unter microsoft/TypeScript#53594 erwähnt:
Wir wählen immer die Lesetypen aus.
sowie die Implementierungshinweise unter microsoft/TypeScript#42425:
Das Typsystem bleibt bei anderen Operationen vollständig kovariant! Dies hat einige Effekte, die nicht sofort ersichtlich sein mögen: ... Typen mit varianten Gettern/Settern werden effektiv auf ihre
get-Seite reduziert, wenn sie durch gemappte Typen gehen ... Der TypT[K]bedeutet immer noch den Lesen-Typ vonKaufT
Es gibt eine Anfrage bei microsoft/TypeScript#43729, die es ermöglichen soll, den Typ des Setters abzufragen. Es ist auch möglich, dass, wenn die Anfrage bei microsoft/Typescript#43826, Varianten-Accessoren in gemappten Typen und Indexsignaturen zu unterstützen, umgesetzt wird, der Setter-Typ isoliert und somit abgefragt werden kann. Aber momentan ist dies kein Teil der Sprache.