Để làm điều này, chúng tôi sẽ sử dụng neverkiểu (được giới thiệu trong TypeScript 2.0) đại diện cho các giá trị "không nên" xảy ra.
Bước đầu tiên là viết một hàm:
function assertUnreachable(x: never): never {
throw new Error("Didn't expect to get here");
}
Sau đó, sử dụng nó trong defaulttrường hợp (hoặc tương đương, bên ngoài công tắc):
function getColorName(c: Color): string {
switch(c) {
case Color.Red:
return 'red';
case Color.Green:
return 'green';
}
return assertUnreachable(c);
}
Tại thời điểm này, bạn sẽ thấy lỗi:
return assertUnreachable(c);
~~~~~~~~~~~~~~~~~~~~~
Type "Color.Blue" is not assignable to type "never"
Thông báo lỗi cho biết các trường hợp bạn quên đưa vào công tắc toàn diện của mình! Nếu bạn bỏ qua nhiều giá trị, bạn sẽ thấy lỗi về ví dụ Color.Blue | Color.Yellow.
Lưu ý rằng nếu bạn đang sử dụng strictNullChecks, bạn sẽ cần nó returntrước assertUnreachablecuộc gọi (nếu không thì tùy chọn).
Bạn có thể nhận được một chút huyền ảo nếu bạn thích. Ví dụ: nếu bạn đang sử dụng liên minh phân biệt đối xử, nó có thể hữu ích để khôi phục thuộc tính phân biệt trong hàm xác nhận cho mục đích gỡ lỗi. Nó trông như thế này:
interface Dog {
species: "canine";
woof: string;
}
interface Cat {
species: "feline";
meow: string;
}
interface Fish {
species: "pisces";
meow: string;
}
type Pet = Dog | Cat | Fish;
function throwBadPet(p: never): never;
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:
throwBadPet(p);
}
}
Đây là một mô hình hay vì bạn có được sự an toàn về thời gian biên dịch để đảm bảo rằng bạn đã xử lý tất cả các trường hợp bạn mong đợi. Và nếu bạn nhận được một thuộc tính thực sự nằm ngoài phạm vi (ví dụ: một số trình gọi JS được tạo mới species), bạn có thể đưa ra một thông báo lỗi hữu ích.