Pour une interface, on peut utiliser Partial<X>
, le Mapped Type pour dire "Autoriser toutes les propriétés de X, mais n'en attendre aucune".Existe-t-il un type `Partiel <any>` pour qu'un paramètre de fonction accepte `any` mais soit` void`?
Pour que ce qui suit provoque une erreur du compilateur:
interface X { foo: boolean }
function doSomething(x: Partial<X>) {
let aBoolean: boolean = x.foo; // ERROR: possibly undefined
}
doSomething({ foo: true }); // OK
doSomething({}); // OK
doSomething(true); // ERROR: Type 'boolean' has no properties in common with 'Partial<X>'
Je voudrais faire la même chose avec any
dire « cette fonction peut accepter quoi que ce soit en tant que paramètre, mais vous ne pouvez pas compter sur quoi que ce soit être là »
function doSomething(x: Partial<any>) {
let aBoolean: boolean = x.foo; // OK, but I wish it wasn't
}
doSomething({ foo: true }); // OK
doSomething({}); // OK
doSomething(true); // OK
doSomething(/* etc. */); // OK
Je voudrais que ma fonction d'accepter quoi que ce soit et tout comme un argument, mais à l'intérieur de la fonction que je ne devrais pas être en mesure d'accéder à toutes les propriétés de l'objet sans vérifier leur première. C'est même ok si à l'intérieur de la fonction x
a le type void
ou never
.
Je ne suis pas surpris Partial<any>
ne fonctionne pas comme je veux - je suis certainement pas demander « pourquoi ne pas Partial<any>
travail la façon dont je souhaite qu'il a fait ». Je demande:
Quel type puis-je utiliser pour le paramètre x
tel que:
- il accepte les arguments de tout/tous les types
- dans la fonction du type de
x
est quelque chose où chaque propriété est peut-être définie (oux
est de typevoid
, etc.)
Juste rendre 'x' optionnel? [Terrain de jeu TS] (https://www.typescriptlang.org/play/#src=const%20act%20%3D%20 (x% 3F% 3A% 20Partial% 3Cany% 3E)% 20% 3D% 3E% 20 !! x.foo% 3B% 0D% 0A% 0D% 0Aact (% 7B% 20foo% 3A% 20true% 20% 7D)% 3B% 20% 2F% 2F% 20OK% 0D% 0Aact (% 7B% 7D)% 3B% 20% 2F% 2F% 20OK% 0D% 0Aact (vrai)% 3B% 20% 2F% 2F% 20OK% 0D% 0Aact (% 2F *% 20etc% 20 *% 2F)% 3B% 20% 2F% 2F% 20OK) –
Il n'y a pas d'erreur quand vous faites '!! x.foo' dans cet exemple - ou si vous le changez en' {let bar: string = x.foo; } '. Est-ce que je manque quelque chose? – alexanderbird
Le point était que dans la fonction il n'y a aucune garantie des propriétés de 'x', et je voudrais que le type reflète cela. – alexanderbird