[231214] TS 좁혀진 타입에 할당을 하면?

조건부 타입, 분산 조건부 타입

interface Lib {
  name: string
  add(): string
  [x: number]: number
}

type IsString<T> = T extends string ? T : never // 컨디셔널 타입, 조건부 타입

type MyLib<T> = Pick<T, IsString<keyof T>> // 분산 조건부 타입

type Test2 = IsString<2>
type Test3 = IsString<"hi" | 2 | "hello" | 3>

type Test = MyLib<Lib>

선언된 타입과 좁혀진(narrowed) 타입의 이해

function foo(x: string | number) {
  if (typeof x === "string") {
    // x'의 타입은 string타입으로 좁혀졌습니다. 따라서 .length가 가능합니다.
    console.log(x.length)

    // 할당을 하게되면 좁혀진 타입이 아닌 선언한 타입이 됩니다.
    x = 1
    // console.log(x.length); // x는 지금 number 타입이므로 불가능합니다.
  } else {
  }
}
  • TS의 강력한 특징 중 하나는 제어 흐름에 따라 자동으로 타입 좁힌다.
  • 할당을 하면 좁혀진 타입이 아닌, 선언한 타입이 됨
  • 원래 x=1 에 오류가 날 줄 알았는데 아님, string number 타입 들어간다.

Categories:

Updated:

Leave a comment