any 와 unknown type 의 차이점은?

Hyun Jin·2024년 9월 4일
  • ChatGPT 답변 기록

anyunknown의 상세 설명 및 차이점

TypeScript에서 anyunknown은 모두 모든 타입의 값을 허용하는 유사한 기능을 제공하지만, 그 목적과 사용 방식에 중요한 차이점이 있습니다. 이 차이점은 타입 안전성타입 추론에 있어서 크게 영향을 미칩니다.


1. any 타입

  • 설명:

    • any는 TypeScript에서 모든 타입의 값을 허용하는 타입입니다. 사실상 컴파일러에게 "이 값에 대해 타입 검사를 하지 않겠다"고 선언하는 것으로 볼 수 있습니다.
    • any 타입을 사용하면 타입스크립트의 타입 체크 기능이 사실상 무력화됩니다. 따라서 어떤 값에 대해 타입을 알 수 없거나, 특정 상황에서 타입 검사를 피해야 하는 경우 사용됩니다.
  • 특징:

    • any 타입의 값은 어떤 타입의 값에도 할당할 수 있고, 반대로 어떤 타입으로도 할당될 수 있습니다.
    • any 타입의 값에 대해서는 어떠한 작업도 제한 없이 수행할 수 있습니다. 즉, 타입스크립트는 any 타입의 값에 대해 어떠한 경고도 표시하지 않습니다.
  • 장점:

    • 코드를 빨리 작성할 때, 혹은 타입 정의를 아직 알 수 없을 때 유용할 수 있습니다.
  • 단점:

    • 타입 안정성이 보장되지 않으므로, 런타임 오류가 발생할 가능성이 높습니다.
    • 컴파일 타임에 타입 검사를 하지 않으므로, 타입스크립트를 사용하는 주요 이점을 상실하게 됩니다.
  • 예시:

    let value: any;
    
    value = 123;         // number 타입
    value = "hello";     // string 타입
    value = { x: 10 };   // 객체 타입
    
    // 아무런 오류 없이 사용 가능하지만 안전하지 않음
    value.someMethod();  // 오류 발생 가능성 있음 (타입 검사하지 않음)

2. unknown 타입

  • 설명:

    • unknown은 TypeScript에서 모든 타입의 값을 허용하지만, 그 자체로는 어떠한 작업도 수행할 수 없게 막아주는 타입입니다. 즉, 타입 안전성을 유지하면서도 타입을 모를 때 사용할 수 있는 타입입니다.
    • unknown은 타입스크립트에서 any와 달리 타입 검사가 필요할 때 강제합니다. 즉, 값의 타입을 확인한 후에만 그 값에 대한 작업을 허용합니다.
  • 특징:

    • unknown 타입은 어떤 값이라도 할당할 수 있지만, 그 값에 대해 조작하거나 메서드를 호출하기 전에 타입 검사를 해야 합니다.
    • unknown 타입의 값에 대해 작업을 수행하려면, 타입을 명확하게 좁히거나 명시적으로 캐스팅해야 합니다.
  • 장점:

    • unknown은 안전하게 타입을 알 수 없는 값을 다룰 수 있는 방법을 제공합니다.
    • 타입 체크를 강제하여 타입 안정성을 유지하면서도 타입을 동적으로 확인하고 처리할 수 있습니다.
  • 단점:

    • 값을 사용하기 전에 항상 타입 체크가 필요하므로, 코드가 다소 복잡해질 수 있습니다.
  • 예시:

    let value: unknown;
    
    value = 123;         // number 타입
    value = "hello";     // string 타입
    value = { x: 10 };   // 객체 타입
    
    // 타입 검사를 하지 않으면 오류 발생
    // value.someMethod(); // Error: 'someMethod' does not exist on type 'unknown'.
    
    // 타입 검사 후 안전하게 사용 가능
    if (typeof value === "string") {
      console.log(value.toUpperCase()); // 안전하게 string 메서드 사용 가능
    }

3. anyunknown의 차이점

특성anyunknown
타입 검사타입 검사를 하지 않음타입 검사를 해야만 조작 가능
타입 안전성타입 안전성 없음타입 안전성을 보장
값의 사용제한 없이 사용 가능사용하기 전에 타입을 좁히거나 검사해야 함
컴파일러의 경고타입 오류 경고 없음잘못된 사용 시 컴파일러가 경고
사용 목적빠른 개발이나 특정 작업에 필요할 때안전한 타입 처리가 필요할 때
할당 가능성모든 값에 할당 가능모든 값에 할당 가능
메서드 호출모든 메서드 호출 가능타입 확인 후에만 메서드 호출 가능

4. 사용 시점 요약

  • any 사용:
    • 개발 중에 빠르게 프로토타입을 작성할 때.
    • 타입 정의가 아직 불완전하거나 확실하지 않을 때.
    • 타입 안전성이 필요하지 않은 부분(가능하면 지양해야 함).
  • unknown 사용:
    • 안전하게 모든 타입을 처리하고, 타입 확인 후에 작업을 수행하고자 할 때.
    • API 호출, 사용자 입력 등 외부에서 전달된 값을 다룰 때.
    • 타입스크립트의 타입 안전성을 유지하면서도 동적으로 타입을 확인해야 할 때.

결론

any는 빠른 개발을 위해 편리하지만, 타입스크립트의 주요 이점인 타입 안전성을 잃게 만듭니다. 반면, unknown은 모든 타입을 허용하지만, 타입을 확인하지 않고는 값을 사용할 수 없기 때문에 타입 안전성을 보장할 수 있습니다.

따라서, 가능하면 unknown을 사용하는 것이 더 안전하며, 타입스크립트의 목적에 맞는 개발을 할 수 있게 도와줍니다. any는 매우 제한된 상황에서만 사용하는 것이 좋습니다.


추가 질문 : unknown 타입의 값을 console.log의 인자로 사용할 수 있는가?

네, console.log는 모든 타입을 받아들이는 함수이기 때문에, unknown 타입의 값을 별다른 타입 변환 없이 인자로 넘길 수 있습니다. console.log는 값의 타입에 상관없이 이를 문자열로 변환하여 출력하기 때문에 unknown 타입도 문제가 되지 않습니다.

예시:
typescript
코드 복사
let value: unknown;

value = "Hello, world!";
console.log(value); // 출력: Hello, world!

value = 42;
console.log(value); // 출력: 42

value = { key: "value" };
console.log(value); // 출력: { key: 'value' }
이 코드에서는 unknown 타입의 value가 여러 타입으로 할당되었고, console.log는 각 값을 문제없이 출력합니다.

요약:
console.log는 모든 타입을 받아들일 수 있는 함수이기 때문에, unknown 타입의 값을 그대로 인자로 넘길 수 있습니다.
타입 확인이나 변환 없이도 unknown 값을 console.log로 출력할 수 있습니다.

profile
새싹 프론트엔드 개발자

0개의 댓글