Obtenir le type d'une propriété d'un tapuscrit de classe à l'aide keyof opérateur
Comme indiqué dans la documentation de la Machine sur le keyof
opérateur, on peut obtenir une propriété d'une instance d'objet à l'aide de la fonction ci-dessous.
function getProperty<T, K extends keyof T>(o: T, name: K) {
return o[name];
}
Bien sûr, on peut obtenir le type de la propriété par le remplacement de return o[name]
en return typeof o[name]
. Est-il un moyen de récupérer le type de la propriété sans passer aucune instance de l'objet?
function getPropertyType<T>(name: keyof T) {
//something like T[name]?
}
- Selon Tapuscrit pas de buts numéro 5: "Ajouter ou de s'appuyer sur run-time type information dans les programmes, ou d'émettre un code différent sur la base des résultats du type" j'ai peur que ce ne serait pas possible que ça sonne comme le type de réflexion pour moi ce que vous essayez de faire. github.com/Microsoft/TypeScript/wiki/TypeScript-Design-Goals
- 😔 merci pour la réponse!
Vous devez vous connecter pour publier un commentaire.
Pas vraiment... si vous n'avez que:
Vous obtiendrez une valeur de retour de type
"string" | "number" | "boolean" | "symbol" | "undefined" | "object" | "function"
, parce que vous êtes à l'aide de la JavaScripttypeof
de l'opérateur à runtime, qui retourne une chaîne de caractères comme"object"
, pas la au moment de la compilation, du type " en caractères d'imprimerie.La machine utilise également le mot clé
typeof
que le moment de la compilation requête de type opérateur. Vous pouvez faire la différence en regardant les endroits où il apparaît. Le type de requêtetypeof
n'apparaît que dans les endroits où vous écrivez un type. Par exemple:Dans
b
, vous pouvez voir quetypeof a
apparaît à l'endroit où vous écrivez une expression de type, de sorte qu'il est un Tapuscrit type de requête, etArray<typeof a>
est évaluée commeArray<{foo: number}>
. D'autre part, dansc
,typeof a
apparaît à l'endroit où vous écrivez une expression de valeur, c'est donc le JavaScripttypeof
opérateur, et permettra d'évaluer à la chaîne"object"
au moment de l'exécution.Comme @k0pernikus mentionné, la Machine n'a pas (et n'a pas l'intention de), vous permettent d'obtenir au moment de la compilation des informations de type à l'exécution. Donc, il n'y a pas de
typeof
opérateur qui agit au moment de l'exécution et retourne au moment de la compilation de l'information.Bien sûr, si vous souhaitez que les informations de type d'une propriété au moment de la compilation, vous peut le faire, à l'aide de ce qu'on appelle les types de recherche. Nous allons examiner la valeur de retour de cette
getProperty()
fonction:Que
T[K]
dans une position signifie "le type de la propriété avec une clé de typeK
sur un objet de typeT
". Puisque c'est un type de fonctionnement, vous pouvez le faire au moment de la compilation, sans le déclarer toutes les valeurs de typeT
ouK
. Par exemple,Ici, vous êtes à la recherche de la
"flags"
clé du type deRegExp
objets et de reprendre lestring
type, et vous pouvez déclarer une valeur de typeRegExp['flags']
sans avoir une valeur de typeRegExp
n'importe où.Qui est le plus proche que je peux venir pour répondre à votre question sans plus d'informations à propos de ce dont vous avez besoin. Espérons que cela aide. Bonne chance!
class Foo { bar: string = "baz" }
et puistype FooBar = Foo["bar"]
, le typeFooBar
serastring
.Est-ce que vous cherchez?
et obtenir le type d'une propriété de l'objet en faisant:
qui est la même que la façon d'utiliser
Pick
en caractères d'imprimerie, et il peut de rapport d'erreur de compilation si il y a un invalidekey
passé.