Part3_AdvancedType
김용현
책 읽기

Study

Untitled

3.1.1 any 타입

  • any 타입은 자바스크립트에 존재하는 모든 값을 오류 없이 받을 수 있다.
  • 타입을 명시하지 않는 것과 동일한 효과.
  • 타입스크립트에서 any 타입을 어쩔 수 없이 사용해야 할 때
    • 개발 단계에서 임시로 값을 지정해야 할 때
    • 어떤 값을 받아올지 또는 넘겨줄지 정할 수 없을 때
    • 값을 예측할 수 없을 때 암묵적으로 사용

3.1.2 unknown 타입

  • unknown 타입은 any 타입과 유사하게 모든 타입의 값이 할당될 수 있다.
  • 그러나 any를 제외한 다른 타입으로 선언된 변수에는 unknown 타입 값을 할당할 수 없다.
  • unknown 타입은 이름처럼 무엇이 할당될지 아직 모르는 상태의 타입을 말한다.

3.1.3 void 타입

  • 함수가 어떤 값을 반환하지 않는 경우에는 void를 지정하여 사용한다고 생각하면 된다.

3.1.4 never 타입

  • never 타입은 값을 반환할 수 없는 타입을 말한다.
  • 자바스크립트에서 값을 반환할 수 없는 2가지 예
    • 에러를 던지는 경우
    • 무한히 함수가 실행되는 경우

3.1.5 Array 타입

  • 타입스크립트에서 배열 타입을 명시하는 것만으로 배열의 길이까지는 제한할 수 없다. 그러나 튜플은 배열 타입의 하위 타입으로 기존 타입스크립트의 배열 기능에 길이 제한까지 추가한 타입 시스템이라고 볼 수 있다.
  • 튜플은 배열의 특정 인덱스에 정해진 타입을 선언하는 것과 같다.

3.1.6 enum 타입

  • enum 타입은 열거형이라고도 부르는데 타입스크립트에서 지원하는 특수한 타입이다.
  • 문자열이 아닌 열거형을 타입으로 했을때 얻을 수 있는 효과
    • 타입 안정성
    • 명확한 의미 전달과 높은 응집력
    • 가독성
  • 숫자로만 이루어져 있거나 타입스크립트가 자동으로 추론한 열거형은 안전하지 않은 결과를 낳을 수 있다. 이러한 동작을 막기 위해 const enum으로 열거형을 선언하는 방법이 있다. 이 방식은 역방향으로의 접근을 허용하지 않기 때문에 자바스크립트에서의 객체에 접근하는 것과 유사한 동작을 보장한다.
  • 그 외 열거형의 문제
    • 일부 번들러에서 트리쉐이킹 과정 중 즉시 실행 함수로 변환된 값을 사용하지 않는 코드로 인식하지 못하는 경우가 발생할 수 있다. 따라서 불필요한 코드의 크기가 증가하는 결과를 초래할 수 있다.
    • 이러한 문제를 해결하기 위해 const enum 또는 as const assertion을 사용해서 유니온 타입으로 열거형과 동일한 효과를 얻는 방법이 있다.

any

  • 어떤 타입이든 any 타입에 할당 가능
  • any 타입은 어떤 타입으로도 할당 가능 (단 never는 제외)

unknown

  • 어떤 타입이든 unknown 타입에 할당 가능
  • unknown 타입은 any 타입 외에 다른 타입으로 할당 불가능
let unknownValue: unknown;
 
unknownValue = 100;
unknownValue = "hello world";
unknownValue = () => console.log("this is any type");
 
let someValue1: any = unknownValue;
O;
let someValue2: number = unknownValue;
X;
let someValue3: string = unknownValue;
X;

이렇게 차이를 비교해도 둘이 비슷하다고 느껴지는데 왜 unknown 타입이 나왔으며 어떤식으로 쓰이는걸까?

unknown 타입으로 할당된 변수는 어떤 값이든 올 수 있음을 의미하는 동시에 개발자에게 엄격한 타입 검사를 강제하는 의도를 담고 있다.

any타입을 사용하면 어떤 값이든 허용된다. 앞서 어떤 값이 할당될지 파악하기 어려운 상황에서 any 타입을 지정하여 임시로 문제를 회피하는 문제도 있다.

unknown타입은 이러한 상황을 보완하기 위해 등장한 타입이다. any타입과 유사하지만 타입검사를 강제하고 타입이 식별된 후에 사용할 수 있기 때문에 any타입보다 안전하다.

결론적으로 데이터 구조를 파악하기 힘들 때 any 타입 대신 unknown 타입으로 대체해서 사용하는 방법을 권장한다.

대표적으로 어떤 상황에서 사용될까?

  • 강제 타입 캐스팅을 통해 타입을 전환할 때ex const env = process.env as unknown as ProcessEnv

교차 타입

교차 타입을 사용하면 여러 가지 타입을 결합하여 하나의 단일 타입을 만들 수 있다.

즉 , 기존에 존재하는 다른 타입들을 합쳐서 해당 타입의 모든 멤버를 가지는 새로운 타입을 생성하는 것이다.

만약 C=A&B 라면 타입 C는 타입 A와 타입 B의 모든 멤버를 가지고 있는 타입이다.

type ProductItem = {
  id: number,
  name: string,
  type: string,
  price: number,
  imageUrl: string,
  quantity: number,
};
 
type ProductItemWithDiscount = ProductItem & { discountAmount: number };
 
// 위 와 아래가 똑같은 뜻이다
type ProductItemWithDiscount = {
  id: number,
  name: string,
  type: string,
  price: number,
  imageUrl: string,
  quantity: number,
  discountAmount: number,
};

유니온 타입

교차타입이 타입 A와 타입 B를 모두 만족하는 경우라면 , 유니온 타입은 타입 A 또는 타입 B 중 하나가 될 수 있는 타입을 말한다.

주로 특정 변수가 가질 수 있는 타입을 전부 나열하는 용도로 사용된다.

인덱스 시그니처

인덱스 시그니처는 특정 타입의 속성 이름은 알 수 없지만 속성값의 타입을 알고 있을 때 사용하는 문법이다.