Pour ce faire, nous utiliserons l'option never
(introduit dans TypeScript 2.0) qui représente des valeurs qui ne devraient pas exister.
La première étape consiste à écrire une fonction :
function assertUnreachable(x: never): never {
throw new Error("Didn't expect to get here");
}
Utilisez-le ensuite dans le default
(ou de manière équivalente, en dehors du commutateur) :
function getColorName(c: Color): string {
switch(c) {
case Color.Red:
return 'red';
case Color.Green:
return 'green';
}
return assertUnreachable(c);
}
À ce stade, vous verrez une erreur :
return assertUnreachable(c);
~~~~~~~~~~~~~~~~~~~~~
Type "Color.Blue" is not assignable to type "never"
Le message d'erreur indique les cas que vous avez oublié d'inclure dans votre commutateur exhaustif ! Si vous avez omis plusieurs valeurs, vous verrez apparaître une erreur concernant, par exemple, les cas suivants Color.Blue | Color.Yellow
.
Notez que si vous utilisez strictNullChecks
vous en aurez besoin return
devant le assertUnreachable
(sinon, c'est facultatif).
Tu peux être un peu plus fantaisiste si tu veux. Si vous utilisez une union discriminée, par exemple, il peut être utile de récupérer la propriété discriminante dans la fonction d'assertion à des fins de débogage. Cela ressemble à ceci :
// Discriminated union using string literals
interface Dog {
species: "canine";
woof: string;
}
interface Cat {
species: "feline";
meow: string;
}
interface Fish {
species: "pisces";
meow: string;
}
type Pet = Dog | Cat | Fish;
// Externally-visible signature
function throwBadPet(p: never): never;
// Implementation signature
function throwBadPet(p: Pet) {
throw new Error('Unknown pet kind: ' + p.species);
}
function meetPet(p: Pet) {
switch(p.species) {
case "canine":
console.log("Who's a good boy? " + p.woof);
break;
case "feline":
console.log("Pretty kitty: " + p.meow);
break;
default:
// Argument of type 'Fish' not assignable to 'never'
throwBadPet(p);
}
}
Il s'agit d'un modèle intéressant, car vous bénéficiez d'une sécurité à la compilation pour vous assurer que vous avez traité tous les cas prévus. Et si vous obtenez une propriété vraiment hors du champ d'application (par exemple, un appelant JS a créé une nouvelle propriété de type species
), vous pouvez afficher un message d'erreur utile.
5 votes
Je voulais juste informer les gens qu'il y a une solution en deux lignes de @Carlos Gines si vous faites défiler la page assez loin.
2 votes
La technologie TypeScript
noImplicitReturns
peut vous aider dans ce domaine.