Employee
와 Boss
각각을 브랜치(branch)라 부른다. 다음 객체를 보자. 이 객체는 어떤 브랜치에 속하는가?whoAmI
객체는 Employee
타입으로 볼 수도 있고 Boss
타입으로 볼 수도 있다. 다르게 표현하면, whoAmI
는 Employee
집합과 Boss
집합의 교집합에 속한다.Employee
와 Boss
타입을 다음처럼 정의한다면 어떻게 될까? 각각의 브랜치, 즉 유니온 타입을 구성하는 타입마다 고유한 리터럴 타입 속성을 추가하는 것이다.type
속성을 갖는다. 'Boss'
타입이면서 'Employee'
타입인 문자열은 없다. 따라서 동시에 Employee
타입이면서 Boss
타입인 값은 존재할 수 없다. 즉 Employee
집합과 Boss
집합의 교집합은 공집합이다.type
속성처럼, 특정 속성을 통해 값이 속하는 브랜치를 식별할 수 있다는 이유로 식별 가능한 유니온(discriminated union type)또는 태그된 유니온(tagged union)이라는 이름을 갖는다. 브랜치를 식별하기 위해 쓰이는 type
속성은 식별자(discriminator) 또는 태그(tag)라 불린다.Bool
타입은 2개의 값, Num
타입은 3개의 값을 갖는다.SumType
은 몇 개의 값을 가질까?SumType
은 2 + 3 = 5 개의 값을 갖는다. 합 타입이라는 이름은 이렇듯 각 브랜치가 갖는 값의 수를 합친 만큼의 값을 갖는 타입이라는 데에서 유래했다.switch
-case
제어 구조와 타입 좁히기의 힘을 빌려 비슷한 효과를 흉내낼 수 있다. kind
속성을 식별자로 갖는 다음 서로소 유니온 타입을 생각해보자.Shape
타입의 값을 받아 면적을 반환하는 함수를 다음과 같이 구현할 수 있다.s.kind
를 식별자로 사용해 각각의 case
문 내에서 s
의 타입을 성공적으로 좁혀낼 수 있다. 또한, 세 가지 case
문을 통해 가능한 모든 경우를 이미 처리했음을 알고 있으므로 default
브랜치가 없이도 이 함수의 반환 타입이 number
라는 사실을 이해한다. number
타입을 반환해야 하는데 undefined
를 반환하는(즉 반환문이 없는) 경우가 있으므로 무언가 잘못되었음을 알려주는 것이다.switch
-case
를 사용해 언어가 지원하지 않는 패턴매칭을 흉내 낼 수 있다. 실제로 이 패턴은 redux를 비롯해 여러 인기 있는 라이브러리에서 쓰인다.