2017-07-04 2 views
2

J'ai le code tapuscrit suivant:Type de type typographique nécessitant un attribut quelconque d'un objet à définir: comment?

interface qux { 
    foo?: string; 
    bar?: number | string; 
} 

function foobar(x: qux) { ...; something_frobz(x); ...; } 

Problème: Je peux appeler foobar("hello, world"), même si cela provoque something_frobz se conduisent mal. Je voudrais attraper et rejeter les appels à foobar avec l'argument de la chaîne à la compilation, tout en modifiant la structure de qux aussi peu que possible. Quelle est la meilleure façon d'y arriver?

Ma propre solution est de faire un champ requis; ce champ a une valeur par défaut sensée, et la chaîne AFAIK n'a pas de champs avec le même nom. C'est un peu un hack, mais ça marche.

Une autre approche pourrait être d'avoir foobar prendre un type d'union de first-field-is-required | second-field-is-required | ... | hundredth-field-is-required, mais je dois maintenir N copies presque identiques de qux (N> 1) et qui ne va bien.

Y a-t-il quelque chose de mieux?

+1

Vérifiez cette question: [Soutenir certains (nominal) non structurel de type correspondant] (https://github.com/Microsoft/TypeScript/issues/202) –

Répondre

2

version Tapuscrit 2,2 - 2,3

Pour éviter le passage "primitives" comme paramètre, vous pouvez l'obliger à être un object:

function foobar(x: qux & object) { } 

foobar(''); //error 
foobar(1); //error 
foobar({a:1}); //error 

foobar({foo:'bar'}); //ok 

Version Tapuscrit> = 2.4object contrainte n'est plus nécessaire. Voir la réponse @ dbandstra pour plus d'informations.

+0

Très agréable. Existe-t-il un moyen de définir une interface telle que '& object' en fasse partie? Je peux faire 'interface blah {...}; export type foo = blah & object; 'mais puis-je le faire dans une seule déclaration de type/définition? –

+1

Malheureusement, ce n'est pas possible –

2

Je voudrais ajouter que la typographie 2.4 résout ce problème.

TypeScript 2.4 introduit le concept des "types faibles". Un type faible est un type qui ne contient que des propriétés tout-facultatives. [...] Dans TypeScript 2.4, c'est maintenant une erreur d'assigner quoi que ce soit à un type faible quand il n'y a pas de chevauchement dans les propriétés. Cela inclut des primitives telles que number, string et boolean.

https://blogs.msdn.microsoft.com/typescript/2017/06/27/announcing-typescript-2-4/#stricter-checks-on-weak-types