TypeScript
Union Types
WebDevLee
2023. 7. 7. 23:54
타입스크립트의 Union Types에 대해 정리하였습니다.
< Defining Unions >
Unions allow us to define multiple allowed type members by separating each type member with a vertical line character |
Example)
let ID: string | number;
// number
ID = 1;
// or string
ID = '001';
console.log(`The ID is ${ID}.`);
: Union Types is more flexible than a single primitive type, but much more specific than the any type.
< Type Narrowing >
we may want to perform different logic in the function’s body that does one thing for strings and another for numbers.
Type narrowing is when TypeScript can figure out what type a variable can be at a given point in our code.
Example)
function getMarginLeft(margin: string | number) {
// margin may be a string or number here
if (typeof margin === 'string') {
// margin must be a string here
return margin.toLowerCase();
} else {
// margin must be a number here
}
< Inferred Union Return Types >
TypeScript can infer types in many cases so that we don't have to manually write them.
Example)
function getBook() {
try {
return getBookFromServer();
} catch (error) {
return `Something went wrong: ${error}`;
}
}
: TypeScript inferes the return type a the union Book | string.
< Unions and Arrays >
Unions are even more powerful when used in combination with arrays.
- To create a union that supports multiple types for an array's values, wrap the union in parentheses ( ), then use array notation [ ]
Example)
const dateNumber = new Date().getTime(); // returns a number
const dateString = new Date().toString(); // returns a string
const timesList: (string | number)[] = [dateNumber, dateString];
< Common Key Value Pairs >
When we put type members in a union, TypeScript will only allows us to use the common methods and properties that all members of the union share.
: Any properties or methods that are not shared by all of the union's members won't be allowed and will produce a TypeScript ereror.
Example)
const batteryStatus: boolean | number = false;
batteryStatus.toString(); // No TypeScript error
batteryStatus.toFixed(2); // TypeScript error
: boolean and number both share .toString(), but don't share .toFixed()
type Goose = {
isPettable: boolean;
hasFeathers: boolean;
canThwartAPicnic: boolean;
}
type Moose = {
isPettable: boolean;
hasHoofs: boolean;
}
const pettingZooAnimal: Goose | Moose = { isPettable: true };
console.log(pettingZooAnimal.isPettable); // No TypeScript error
console.log(pettingZooAnimal.hasHoofs); // TypeScript error
: Since .hasHoofs is only a property on Moose, we cannot call that method on pettingZooAnimal.
< Unions with Literal Types >
We can use literal types with TypeScript with TypeScript unions. Literal type unions are useful when we want to create distinct states within a program.
Example)
type Color = 'green' | 'yellow' | 'red';
function changeLight(color: Color) {
// ...
}