다만 한 가지 특이한 점이 있습니다. null/undefined를 제외한 원시 자료형과 비어 있지 않은 객체를 & 연산할 때는 never가 되지 않습니다.
type H = { a: 'b' } & number;
// type H = { a: 'b' } & number
type I = null & { a: 'b' };
// type I = never
type J = {} & string;
// type J = string
• 즉, 타입 H는 never가 아닙니다. 객체 타입과 원시값은 겹치는 부분이 없으므로 never가 되는 게 원칙인데, 왜 타입 H는 never가 아닐까요? 이는 예외 사항이라고 보면 됩니다. 타입스크립트에서 종종 활용하는 브랜딩이라는 기법인데요. 2.28절에서 이 특성을 활용하는 방법을 배웁니다.
• 타입 I는 null과 객체의 교집합이라 never가 됩니다.
• 타입 J는 never가 아니라 string입니다. 헷갈리면 안 됩니다. {}는 객체를 의미하는 타입이 아니라 null과 undefined를 제외한 모든 값을 의미하는 타입이므로 string과의 교집합을 구하면 string이 됩니다.