개발 공부 일지/TypeScript

[TS] any 타입 - 편리함과 위험함 사이

dev-hpk 2024. 11. 15. 12:24

any 타입은 TypeScript에서 가장 강력하면서도 동시에 논란이 많은 타입 중 하나입니다. 편리할 수 있지만, 잘못 사용하면 코드의 안정성과 가독성을 크게 떨어뜨릴 수 있습니다. any 타입의 역할과 왜 최대한 사용을 지양해야 하는지에 대해 알아보겠습니다.

 

목차

1. any 타입이란?

2. any 타입의 장점

3. any 타입 사용해도 될까?

4. any 타입 대체하는 방법

추천글

위의 목차를 클릭하면 해당 글로 자동 이동 합니다.

 

1. any 타입이란?

any는 TypeScript의 최상위 super(모든 것을 허용하는) 타입입니다. 변수를 any 타입으로 지정하면 그 변수는 모든 타입을 허용하고, 타입 검사를 건너뛰기 때문에 자바스크립트와 동일하게 작동하게 됩니다. 이는 TypeScript가 엄격한 타입 시스템을 제공하는 이유와 반대로 작동하며, 다음과 같은 특징을 가집니다.

let value = 10; // value: number로 타입 추론
value = "Hello"; // ✖
value = true;    // ✖

 

위 예제에서 value는 number 타입으로 타입이 추론되어, 이후 string, boolean 등 number가 아닌 다른 타입으로도 재할당 할 수 없습니다.

let value: any = 10;
value = "Hello"; // ✔
value = true;    // ✔

 

위 예제에서 value에 number 타입인 10을 할당했지만 any 타입으로 지정했기 때문에, 이후 string과 boolean 등 어떤 타입으로든 재할당이 가능합니다. 이처럼 any는 타입 안정성을 포기하면서 유연성을 제공합니다.

 

2. any 타입의 장점

any 타입이 반드시 나쁜 것은 아닙니다. 실제로 다음과 같은 상황에서는 any가 유용할 수 있습니다.

 

  • 빠른 프로토타입 작성: 프로젝트 초기 단계에서, 복잡한 타입 정의 없이 빠르게 프로토타입을 작성해야 할 때 any를 사용할 수 있습니다.
  • 서드파티 라이브러리 사용: 일부 서드파티 라이브러리에서 타입 정의가 미비한 경우 any를 통해 에러를 방지하고 라이브러리를 빠르게 적용할 수 있습니다.
  • 점진적 마이그레이션: 기존의 자바스크립트 코드베이스를 TypeScript로 변환할 때 모든 타입을 명확히 지정하는 것이 어려운 경우, 점진적 변환을 위해 any를 임시로 사용할 수 있습니다.

 

 

3. any 타입 사용해도 될까?

any는 유연성을 제공하지만, 남용하면 TypeScript를 사용하는 근본적인 목적을 훼손하게 됩니다. TypeScript를 사용하는 주요 목적은 코드의 안정성과 가독성을 높이는 데 있습니다. any 타입을 무분별하게 사용하면 다음과 같은 부작용이 발생할 수 있습니다.

 

1. 타입 안전성 손실

any를 사용하면 TypeScript의 타입 검사 기능이 무력화되기 때문에, 런타임 오류가 발생할 가능성이 커집니다.

let value: any = 10;
console.log(value.toUpperCase());

 

위 예제는 any 타입으로 지정한 value에 number 타입의 10을 할당했습니다. 정적 타입 검사에서는 에러가 발생하지 않지만, 런타임에서 확인해 보면 아래와 같은 에러가 발생합니다.

 

any를 사용하면 컴파일러가 타입 검사를 건너뛰므로 코드가 타입 안전성을 잃게 됩니다. 이는 자바스크립트의 동적 타입 시스템과 다를 바가 없어져, TypeScript를 쓰는 이유를 무색하게 만듭니다.

 

2. 가독성 저하

any는 타입이 불명확하기 때문에 코드의 의미를 파악하기 어려워집니다. 특히 대규모 프로젝트에서는 any가 많아질수록 코드가 무엇을 하려는지 이해하기 힘들어지고, 이를 유지보수하는 개발자에게 큰 부담이 됩니다.

 

4. any 타입 대체하는 방법

TypeScript는 다양한 유틸리티 타입과 안전한 타입 추론 기능을 제공하므로 이를 활용하면 됩니다.

 

1. unkown 타입

unknown 타입은 any와 유사하게 모든 타입의 값을 할당할 수 있지만, 타입 검사를 통과하지 않으면 사용할 수 없습니다. 이는 안전성을 확보하면서 유연성을 제공합니다.

let value: unknown = "Hello";
if (typeof value === "string") {
  // 런타임에서 타입을 검사하고 통과한 경우만 실행하기 때문에 에러 ✖
  console.log(value.toUpperCase());
}

 

2. 유니언 타입 또는 제네릭 사용

타입이 여러 개일 가능성이 있다면 유니언 타입이나 제네릭을 사용하는 것도 좋은 방법입니다. 이를 통해 다양한 타입을 허용하면서도 안전성을 유지할 수 있습니다.

function formatValue(input: string | number) {
  if (typeof input === "string") {
    console.log(input.toUpperCase());
  } else {
    console.log(input.toFixed(2));
  }
}

formatValue('string'); // ✔
formatValue(100); // ✔

 

3. 구체적인 타입 사용

가능한 경우, any 대신 구체적인 타입을 지정하여 코드의 안정성을 높입니다.

interface User {
  id: number;
  name: string;
}

let user: User = { id: 1, name: "Kim" };

 

 

 

 

any 타입은 꼭 필요한 경우에만 제한적으로 사용하고, 가능한 한 구체적인 타입, unknown, 유니언 타입, 제네릭 등을 통해 타입 안전성을 확보하는 것이 좋습니다. 만약 타입을 명확히 지정하기 어렵다면 any 타입을 사용하고, 추후 명확한 타입을 지정해 주는 방식으로 any 타입의 사용을 최대한 지양해보세요.

 

 

 

[TS] 타입 추론과 타입 단언

타입스크립트(TypeScript)는 정적 타입 시스템을 통해 코드의 안전성을 높이고, 버그를 줄이는 데 유용한 언어입니다. 그중에서도 타입 추론과 타입 단언은 TypeScript의 강력한 기능입니다. 목차 1.

dev-hpk.tistory.com

 

 

[TS] 타입스크립트의 유용한 유틸리티 타입

타입스크립트를 사용하다 보면 여러 타입 변환이나 특정 속성만을 추출하고 싶은 상황이 자주 생깁니다. 이때 유용하게 활용할 수 있는 것이 타입스크립트가 제공하는 유틸리티 타입입니다.  

dev-hpk.tistory.com