Website-Suche

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 Typ T[K] bedeutet immer noch den Lesen-Typ von K auf T

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.

Verwandte Artikel