앞서 primitive를 intersection하면 동시에 충족하지 못하기 때문에 never 타입이 된다고 했다. 하지만 객체는 동시에 충족시킬 수 있다.
type Person = {
name: string;
age: number;
};
type Company = {
company: string;
companyRegistrationNumber: number;
};
type PersonAndCompany = Person & Company;
const taeyeon: PersonAndCompany = {
name: '태연',
age: 32,
company: 'SM',
companyRegistrationNumber: 1,
};
intersection은 Person 타입과 Company 타입을 모두 충족해야 한다. 그래서 extension 한 것과 동일한 결과를 갖는다. 실제로 extension을 할 때도 intersection을 해줬다.
재밌는 건 union과 intersection을 섞을 수 있다는 것이다.
type Pet = {
petName: string;
petAge: number;
};
type CompanyOrPet = Person & (Company | Pet);
const companyOrPet: CompanyOrPet = {
// Person
name: '태연',
age: 32,
// 여기까지는 Person 타입에 해당한다. 꼭 필수 타입이다.
// Company
company: 'SM 엔터',
companyRegistrationNumber: 1123,
// Pet
petName: '모서리',
petAge: 1,
};
CompanyOrPet 타입으로 선언하게 되면 일단 Person 타입은 무조건 충족해야 한다. 그리고 Company를 충족하고, Pet을 아예 안 넣어도 된다. 또한, Pet을 충족하고, Company를 안 넣어도 된다.
그리고 Company를 충족하고, Pet에서 하나의 프로퍼티만 넣어줘도 되고, 반대도 마찬가지다.