kakasoo

한 가지 인스턴스로만 이루어진 순수한 배열로 타입을 확정하기 본문

프로그래밍/NestJS

한 가지 인스턴스로만 이루어진 순수한 배열로 타입을 확정하기

카카수(kakasoo) 2022. 7. 5. 22:01
반응형

여러 가지 엔티티의 칼럼이나 프로퍼티를 통일시켜, 하나의 함수를 여러 엔티티가 공유할 수 있게 작성하고 싶다. 그렇지만, 파라미터로 오는 타입들이 다른 경우, 이렇게 만드는 게 쉽지 않다. 이런 경우에는 직접 커스텀한 함수로 타입을 보호해줄 수 있는 방법이 필요하다.

 

public format(value: Foo[] | Bar[]) {
    const isFooArray = isArrayOf(isInstanceOf(Foo));

    if (isFooArray(value)) {
        // true block
        for (const foo of value) {
            const f: Foo = foo; // okay
        }
    } else {
        // false block
        for (const bar of value) {
            const b: Bar = bar; // okay
        }
    }
}

 

이처럼, Foo와 Boo로만 이루어진 두 배열 중 어느 한 쪽이 들어오는지를 체크하는, isFooArray 조건을 정의해 사용할 수 있다. 이 조건은 Foo의 인스턴스로 이루어진 배열인지 체크하는, 두 함수의 합성으로 이루어진다.

 

const isArrayOf = <T>(elemGuard: (x: any) => x is T) =>
    (arr: any[]): arr is Array<T> => arr.every(elemGuard);
const isInstanceOf = <T>(ctor: new (...args: any) => T) =>
    (x: any): x is T => x instanceof ctor;
반응형