본문 바로가기

IT

Effective Typescript - 38 - any 타입은 가능한 좁은 범위에서만 사용하기

아래 예제는 함수 호출 시 any로 강제로 변환해야 하는 경우, any를 가능한 좁은 범위 내에서 사용하기 위한 방법을 설명한다.

interface Foo {
    _brand: 'foo'
}

interface Bar {
    _brand: 'bar'
}

function processBar(b: Bar){
    console.log(b);
}

function expressionReturningFoo(): Foo {
    /**  */
    return {_brand: 'foo'};
}

function f1(){
    const x: any = expressionReturningFoo(); // 비추
    processBar(x)
}

function f2(){
    const x = expressionReturningFoo();
    processBar(x as any) // 추천
}

위 예제에서 함수 호출시 as any 단언문을 사용하는 방식이 더욱 권장되는 이유는 함수 호출에만 영향을 미치기 때문에 다른 side effect를 남길 여지를 남기지 않기 때문이다. any 타입은 최대한 좁혀서 사용해야 하는 이유이기도 하다.

 

다음으로 아래 예제를 통해 객체와 관련한 any의 사용법을 알아보자.

interface Config {
    a: number,
    b: number,
    c: {
        key: string;
    }
}

const value = 1;

//비추천 하는 방식
const config: Config = {
    a: 1,
    b: 2,
    c: {
        key: value
    }
} as any

//추천 하는 방식
const config2: Config = {
    a: 1,
    b: 2,
    c: {
        key: value as any
    }
}

객체 전체를 as any로 단언하면, 의도하지 않은 나머지 속성까지 any로 취급되기 때문에, 필요한 특정 속성에만 as any 단언문을 사용하는 것이 안전하다.

 

* 의도하지 않은 타입 안전성의 손실을 피하기 위해서 any의 사용 범위, 영향 범위를 줄일수 있도록 항상 신경 써야 한다.

* 함수의 반환 타입이 any인 경우 타입 안정성이 나빠진다. 따라서 any 타입을 반환하면 절대 안 된다.

* 강제로 타입 오류를 제거하려면 any 대신 @ts-ignore를 사용하는 것이 차라리 낫다.