본문 바로가기

IT

Effective Typescript - 32 - 유니온의 인터페이스보다는 인터페이스의 유니온을 사용하기

유니온 타입의 속성을 가지는 인터페이스를 작성 중입니까? 그렇다면, 인터페이스의 유니온 타입을 사용하는 것이 더 낫지 않은지 검토가 필요합니다.

 

벡터를 그리는 프로그램을 작성 중이고, 특정한 기하학적 타입을 가지는 계층의 인터페이스를 정의한다고 가정해 보고 어떤 방식으로 인터페이스를 설계하는 것이 유리한지 고민해봅시다.

// 비추 - 비정상적이 조합의 값이 허용되는 구조
interface Layer {
    layout: FillLayout | LineLayout | PointLayout;
    point: FillPaint | LinePaint | PointPatin;
}

// 추천
interface FillLayer {
    layout : FillLayout;
    paint: FillPaint;
}

interface LineLayer {
    layout: LineLaout;
    paint: LinePaint;
}

interface PointLayer {
    layout: PointLayout;
    paint: PointPaint;
}

아래는 위 예제 프로그램의 태그된 유니온의 관점에서 어떤 식으로 인터페이스를 설계하는 것이 유리한지를 보여줍니다. 

인터페이스 내 속성들을 유니온으로 가져가는 것보다는 하나의 타입을 만들 때, 여러 인터페이스를 유니온으로 작성하는 것이 타입을 좁히는데 더욱 편리합니다.

// 비추천 (유니온의 인터페이스)
interface Layer {
    type : 'fill' | 'line' | 'point'
    layout : FillLayout | LineLayout | PointLayout;
    paint: FillPaint | LinePaint | PointPatin;
}

//추천 (인터페이스의 유니온 방식)
interface FillLayer {
    type : 'fill';
    layout: FillLayout;
    paint: FillPaint;
}
interface LineLayer {
    type : 'line';
    layout: LineLayout;
    paint: LinePaint;
}
interface PointLayer {
    type : 'point';
    layout: PointLayout;
    paint: PointPaint;
}

type Layer = FillLayer | LineLayer | PointLayer; //추천 (인터페이스의 유니온 방식)

* 유니온 타입의 속성을 여러개 가지는 인터페이스에서는 속성 간의 관계가 분명하지 않을 수 있기 때문에 잠재적 버그가 많아질 수 있으므로 지양해야 한다.

* 유니온의 인터페이스보다 인터페이스의 유니온이 더 정확하고 타입스크립트 타입 추론이 좀 더 정확해진다.

* 타입스크립트가 제어 흐름을 분석할 수 있도록 타입에 태그를 넣는 것을 추천한다. 태그 된 유니온은 타입스크립트에서 일상적인 패턴이다.