It is a really good feature coming with TypeScript 5.0. We could infer type of object as general as shown in line 8 in below code, so, to infer more-specific type, we had to add as const as shown in line 11.
TypeScript 5.0 makes it easier with adding const in front of type parameter declaration in line 13 in below code.
Use case
Assume that Person type has hobbies , and i just want to infer passed values from hobbies field.
Below two code blocks are doing same job and the only difference is below second code block uses variadic tuple. Check the below links for more details.
type HttpMethod = "GET" | "POST" | "PUT" | "DELETE";
const sendRequest = (url: string, method: HttpMethod) => {
switch (method) {
case 'DELETE':
break;
case 'GET':
break;
case 'POST':
break;
case 'PUT':
break;
default:
const exhaustiveCheck: never = method; // ✅ no error
throw new Error(`Unhandled case: ${exhaustiveCheck}`);
}
};
type Fruit = 'banana' | 'orange' | 'mango';
function exhaustiveCheck(param: never): never {
throw new Error('should not reach here')
}
function makeDessert(fruit: Fruit) {
switch (fruit) {
case 'banana': return 'Banana Shake'
case 'orange': return 'Orange Juice'
}
exhaustiveCheck(fruit) // 🚫 ERROR! `mango` is not assignable
}
Exhaustiveness checking is a good feature when you use switch block. Assume that you need to check a value of variable which data type is union type as shown below screenshot.
Shape is a discriminatedunion which consists of three types named Circle, Square and Triangle.
kind field is shared in Circle, Square and Triangle types so that if developer forgets to use any of kind field value in switch block, TypeScript will error in coding-time.
Notice that there is a red line in line 347, it is due to missing triangle case in switch block.
This is the error shown in the code.
After adding triangle case in line 346, the error disappeared.