대수 타입은 여러 개의 타입을 합성하여 새롭게 만들어낸 타입을 뜻한다.
대수 타입의 종류로는 합집합과 교집합 타입이 있다.
let a: string | number | boolean;
a = 1;
a = "hello";
a = true;
let arr: (number | string | boolean)[] = [1, "hello", true];
type Dog = {
name: string;
color: string;
};
type Person = {
name: string;
language: string;
};
type Union1 = Dog | Person; // 타입에 타입 할당
let union1: Union1 = { // Dog 타입만 사용
name: "",
color: "",
};
let union2: Union1 = { // Person 타입만 사용
name: "",
language: "",
};
let union3: Union1 = { // 모든 프로퍼티 사용 가능
name: "",
color: "",
language: "",
};
이 때, 공통된
name:""
프로퍼티 하나만 사용하는 것은 합집합 어디에도 포함되지 않는 타입이기 때문에 사용이 불가하다.🙅🏻♀️
⭐️⭐️ 위 그림에서의 교집합은,
프로퍼티의 교집합이 아닌"값의 교집합"을 뜻한다. 즉, A와 B 두 타입의 모든 조건을 동시에 충족해야 하므로 모든 프로퍼티를 포함하는 타입이 생성되게 된다.만약, 공통된
name:""
프로퍼티를 교집합으로 만들고 싶다면 인터페이스와 상속 개념을 통해 구현해볼 수 있다.interface BaseType { name: string; } // BaseType의 프로퍼티를 모두 상속 (name 프로퍼티 자동으로 생김) interface Dog extends BaseType { color: string; } interface Person extends BaseType { language: string; }
위에서 설명한 것과 같이, 교집합은 두 타입의 모든 프로퍼티를 포함하는 타입을 생성한다.
type Dog1 = {
name: "";
};
type Person1 = {
age: "";
};
type Intersection1 = Dog1 & Person1;
let intersectionVar: Intersection1 = {
name: "",
age: "",
};
하지만 원시 타입의 교집합은 다르다. 아래 예시를 보면 어떤 값도 number 이면서 동시에 string일 수 없기 때문에 원시 타입의 교집합은 공존할 수 없다.
let variable: number & string; // = never
타입스크립트는 변수에 타입을 선언하면 프로그램이 실행되기 이전에 타입 검사를 수행하는 점진적 타입 시스템이다. 이 때 타입을 선언하지 않아도 초기값을 기준으로 자동으로 타입을 추론해주기도 한다.
let a = 10;
let b = "hello";
let c = {
id: 1,
name: "aaa",
profile: {
nickname: "winter",
},
};
let { id, name, profile } = c;
function func(message = "hello") {
return "hello";
}
let d; // any
d = 10; // 아직 any (값이 할당될 때 any -> number로 진화)
d.toFixed(); // number
d = "string"; // 다시 any (값이 할당될 때 any -> string로 진화)
d.toUpperCase(); // string
const num = 10; // num:10
const str = "hello"; // str:"hello"
let arr = [1, "string"]; // let arr: (string | number)[]
타입 추론 시 범용적으로 변수를 사용할 수 있도록 좀 더 넓은 타입으로 추론해 주는 것을 '타입 넓히기' 라고 한다.