typescript에서 &는 And와 비슷한 개념이고 |는 or와 비슷한 개념이다.. 뭐 여기까지만 대충 알고 있었다. 이게 내가 아는 세상의 전부였는데..그런데..
typescript의 구조적 타이핑을 집합적 관점에서 해석할 수도 있었다. 처음에는 이해하기가 아주 어렵고 혼란의 도가니였지만, 내 승부욕을 자극해버렸지 뭐야. 오타쿠해버렸지뭐야 그 결과 드디어 이해라는 것을 해버렸다~!
실무에서 필요할 법한 내용은 딱히 아닐 수도 있을 것 같다 (? 아닌가?) 하지만 이해하고 나니 정말 흥미로운 내용이어서 꼭 포스팅을 하고 싶어졌다.
지난 포스팅에서는 덕 타이핑과 구조적 타이핑에 대해 다루었다.
구조적 타이핑은 새가 날개도 있고 꽥꽥 울면 일단 오리라고 해석하는 덕 타이핑과 비슷한 개념이다. (정적 타이핑인지 동적 타이핑인지의 차이)
일단 type A가 가진 모든 key를 type B도 가지고 있다면, 구조적 타이핑에서는 일단 type B가 type A라고 해석한다. 이것이 집합적 관점에서의 typescript를 이해하는 데 중요한 개념이다.
interface Person {
name: string;
age: number;
job: string;
}
interface Jobs {
job: string;
dreamJob: string;
keyof (Person & Jobs) = keyof Person | keyof Jobs
key의 관점에서 합집합이라는 건 이해하기 쉽다.
interface PersonWithJobs {
name: string;
age: number;
job: string;
dreamJob: string;
}
근데 이게 어째서 구조적 타이핑 관점에서는 교집합이라는 것인가?
A ∩ B는 A의 부분집합이다.
A ∩ B는 B의 부분집합이다.
->
A & B는 A의 부분집합이다.
A & B는 B의 부분집합이다.
->
구조적 타이핑 관점에서
Person은 name, age, job를 원소로 가지고 있는 모든 집합이다.
PersonWithJobs (= Person & Jobs)은 name, age, job, dreamJob을 원소로 가지고 있는 모든 집합이다.
->
PersonWithJobs은 Person의 부분집합이다.
PersonWithJobs은 Jobs의 부분집합이다.
->
PersonWithJobs은 Person과 Jobs의 교집합이다.
이렇게 &가 구조적 타이핑 관점에서는 교집합을 의미함을 알게 되었다.
key의 관점에서는 key를 싸그리 모아놓은 합집합의 개념이지만, 구조적 타이핑의 관점에서는 특정 타입의 모든 key를 가지고 있기만 하면 일단 해당 type이라고 보기 때문에 교집합의 개념인 것이다.
여기까지 이해하는데 정말 오래걸렸다;;;
keyof (Person | Job) = keyof Person & keyof Job
역시나 key의 관점에서 교집합이라는 건 이해하기 쉽다.
interface Job {
job: string;
}
근데 이게 어째서 구조적 타이핑 관점에서는 합집합이라는 것인가?
A는 A ∪ B의 부분집합이다.
B는 A ∪ B의 부분집합이다.
->
A는 A | B의 부분집합이다.
B는 A | B의 부분집합이다.
->
구조적 타이핑 관점에서
Person은 name, age, job를 원소로 가지고 있는 모든 집합이다.
Job (= Person | Jobs)은 job을 원소로 가지고 있는 모든 집합이다.
->
Person은 Job의 부분집합이다.
Jobs는 Job의 부분집합이다.
->
Job은 Person과 Jobs의 합집합이다.
여기서도 역시 key의 관점에서는 교집합이지만, 구조적 타이핑 관점에서는 합집합이라는 것이 중요하다.
재미있는 집합적 관점에서의 typescript 포스팅 끝~