Tip-01. 타입 추론

readonly, as const

  • readonly
    • 해당 변수를 상수로 바꿔줌
    • type, interface, class의 속성에 부여 가능
  • as const
    • 해당 값을 최대한 좁은 타입으로 추론해줌
    • 객체에 사용할 경우 바로 아래 depth까지 readonly로 바꿔줌
    • 변수에 사용할 경우 해당 변수를 상수로 간주함
const v1 = {
  x: 1,
  y: 2,
}; // { x: number, y: number }

const v2 = {
  x: 1 as const,
  y: 2,
}; // { x: 1, y: number}

const v3 = {
  x: 1,
  y: 2,
} as const; // { readonly x: 1; readonly y: 2; }

사용자 타입 가드

유니온 타입을 사용할 때 함수 내부에서 타입 분기를 하고 싶을 때 사용하면 유용할 듯.
당장 내일 회사가서 써먹어야 한다... 급하다.

  • is : 함수 리턴값이 true면 타입을 좁혀줌. 함수를 조건문의 boolean으로 사용할 떄 쓰기 좋음
  • in : 해당 프로퍼티가 있는지 확인함. 마찬가지로 타입가드 역할을 함
interface Foo {
  foo: number;
  common: string;
}

interface Bar {
  bar: number;
  common: string;
}
// 리턴값이 true면 arg는 Foo로 취급하겠다는 함수임
// 'arg is Foo' 타입이 없으면 제대로 동작 안함
function isFoo(arg: any): arg is Foo {
  return arg.foo !== undefined;
}

function doStuff(arg: Foo | Bar) {
  if (isFoo(arg)) {
    console.log(arg.foo); // ㅇㅋ
    console.log(arg.bar); // Error!
  } else {
    console.log(arg.foo); // Error!
    console.log(arg.bar); // ㅇㅋ
  }

  if ('foo' in arg) {
    console.log(arg.foo); // ㅇㅋ
    console.log(arg.bar); // 에러남
  } else {
    console.log(arg.foo); // 에러남
    console.log(arg.bar); // ㅇㅋ
  }
}

문맥과 값을 분리할 떄 주의점

매개변수에 문자열을 넣는 것과 변수를 넣는 것은 다르게 동작한다.

function toString(str: 'javascript' | 'typescript' | 'python') {
  console.log(str);
}

// 통과
toString('javascript');

// 통과 못함
let str = 'javascript'; // const로 바꾸던가 as const를 뒤에 붙이던가 해야함
toString(str);
Last Updated: