2024년 3월 4일 작성

TypeScript Any Type - Type Check 우회하기

TypeScript의 Any Type은 모든 종류의 값이 할당 가능한 가장 유연한 type으로, Type Check를 우회할 수 있습니다.

any Type : TypeScript의 Type Check 기능 우회하기

  • TypeScript에서 any type은 가장 유연한 type으로, 어떤 종류의 값도 할당할 수 있습니다.
    • 문자열, 숫자, 배열, 객체 등 어떤 type이든 any type 변수에 할당 가능합니다.
  • any type을 사용하면, 해당 변수에 대한 compile time type check를 compiler가 수행하지 않습니다.
    • TypeScript의 type 검사 기능을 일시적으로 끌 수 있습니다.
    • 이는 동적 type 언어의 특징을 유지하면서 TypeScript를 사용하고자 할 때 유용합니다.
      • 예를 들어, JavaScript와의 호환성을 유지하면서 점진적으로 TypeScript를 도입하거나, type 정보가 없는 library를 사용할 때.
  • 그러나 any type은 TypeScript의 핵심 가치인 type 안정성을 손상시킬 수 있기 때문에, 가능한 사용을 최소화하는 것이 좋습니다.
    • any type은 TypeScript의 type system을 우회하기 때문에, code 내에서 type 관련 오류가 발생할 가능성을 증가시킵니다.
    • code의 type 안정성과 유지 보수성을 유지하기 위해서는 any type 대신 더 구체적이고 명확한 type(unknown, generic, union type 등)을 사용하는 것이 바람직합니다.
      • 특히 type 안정성이 중요한 project에서는 any type의 사용을 피하는 것이 좋습니다.
let notSure: any = 4;
notSure = "maybe a string instead";
notSure = false;    // okay, definitely a boolean

let looselyTyped: any = {};
let d = looselyTyped.a.b.c.d;    // any type을 사용하면, 모든 하위 속성도 자동으로 any type이 됨

any Type 사용 최소화 전략

  • any type은 TypeScript의 type check를 우회할 수 있는 유연한 도구이지만, type 안정성을 저해할 수 있으므로 신중하게 사용해야 합니다.
  • TypeScript의 다양한 type system 기능을 활용하여 any 사용을 최소화하고, project의 type 안정성과 가독성을 향상시키는 것이 좋습니다.
  • any type을 사용하고 있다면 점진적으로 구체적인 type으로 변경해 나가야 합니다.

any Type 대신 고려할 수 있는 Type들

unknown Type

  • unknown type은 any와 비슷하게 모든 종류의 값을 할당할 수 있지만, unknown type에 할당된 변수는 사용하기 전에 해당 변수의 type을 확인해야 합니다.
    • unknown type 변수 사용 전 type을 확인하는 과정은, type 안정성을 높이는 데 도움이 됩니다.
let value: unknown;
value = "Hello";    // OK
value = 123;    // OK

if (typeof value === "string") {
    console.log(value.toUpperCase());    // type check 후 사용
}

Generic Type

  • 함수나 class 등에서 입력 type을 미리 정의하지 않고, 사용 시점에 type을 결정할 수 있습니다.
  • generic을 사용하면 유연함을 유지하면서도 type 안정성을 향상시킬 수 있습니다.
function identity<T>(arg: T): T {
    return arg;
}

let output = identity("myString");    // output은 string type

Union Type

  • 두 개 이상의 type 중 하나일 수 있는 변수의 type을 지정할 때 사용합니다.
  • union type은 any type보다 type을 더 명확하게 제한할 수 있습니다.
let myVar: number | string;
myVar = "Hello";    // OK
myVar = 123;    // OK

any Type 사용을 막는 Compiler Option : noImplicitAny

  • noImplicitAny option은 TypeScript의 type checker가 변수, 매개 변수, 반환 값 등의 type을 자동으로 any로 추론하지 못하게 막습니다.
    • 개발자가 명시적으로 type을 선언하지 않았을 때, compiler가 오류를 발생시킵니다.
  • noImplicitAny option을 통해 any type의 사용을 줄이고, TypeScript의 type 추론(type inferenece) 기능에 의존하지 않는 명확한 type 선언을 장려할 수 있습니다.
{
    "compilerOptions": {
        "noImplicitAny": true
    }
}
  • tsconfig.json file에서 noImplicitAny option을 true로 설정하여 활성화할 수 있습니다.

목차