타입 추론, 타입 가드, 타입 단언

·2023년 11월 28일

타입 추론

타입 추론이란?

개발자가 변수를 선언할 때 타입을 쓰지 않아도 컴파일이 스스로 판단해서 타입을 넣어주는 것
즉, 타입을 생략하고 변수를 선언할 때 대입된 값의 형태를 보고 타입을 추론해서 자동으로 넣게되는 원리이다.

let num = 12;
num = 'Hello World'; //Error 

이때 타입 추론은, 리턴 타입에도 잘 쓰일 수 있는데, number 타입 두개가 연산을 한 결과값이 리턴값인 경우, 굳이 함수 타입을 지정하지 않아도 컴파일러가 추론해 판단할 수 있다.
즉, 타입을 생략하고 변수를 선언하거나 초기화할 때 타입이 추론된다.

타입스크립트의 생산성을 높이기 위한 방법이다. 누가봐도 특정 타입인 부분까지 개발자에게 맡기지 않겠다는 뜻이다,

타입 단언

타입이 확실하다고 개발자가 판단되면 컴파일러에게 알려주는 것이다.
즉, 컴파일러가 추론하지 않도록 직접 지시하는 것이다.
하지만, 이는 런타임에는 영향을 미치지 않고 오직 컴파일 과정에서만 사용된다.
컴파일러를 속이는 것과 같으므로, 빨간줄은 뜨지 않지만 오류는 발생할 수 있다.

타입 단언 방법

<> 사용

let here: unkown = '타입';
let here_count:number = (<string>here).length;

as 사용

let here: unkown = '타입';
let here_count:number = (here as string).length;

타입 가드

에러를 줄일 수 있는 방어 코드 기법이다. if문으로 분기를 해서 오류를 줄이는 것도 타입 가드에 해당한다.

일반 타입 체킹

  • typeof: 일반 타입 체킹
function numOrStr(a:number | string){
  if(typeof a === 'string') {
    a.split(',');
  }
  if (typeof a === 'number'){
    a.toFixed(1);
  }
}

클래스 타입 체킹

  • instanceof: 클래스 체킹
class Food {
  fruits() {}
}

function favoriteFood(parm: Food | string){
  if (parm instanceof Food) {
    parm.fruits();
  } else {
    console.log(parm);
  }
}

객체 타입 체킹

  • .type/in: 객체 속성 체킹
type Fruits = {type:'fruit', apple: boolean, cost: 'H' | 'L' };
type Salad = {type:'salad', tender: boolean, cost: 'H' | 'L' };
type Yogurt =  {type:'yogurt', greak: boolean, cost: 'H' | 'L' };

function isFavorite(a: Fruits | Salad | Yogurt ){
  if(a.type === 'fruit'){
    a.apple = true;
  } else if ( a.type === 'salad') {
    a.tender = true
  } else {
    a.greak = true;
  }
}

type 속성이 없을 때는 타입이 같고 속성명이 다른 것을 찾는다.

type Fruits = {apple: boolean, cost: 'H' | 'L' };
type Salad = { tender: boolean, cost: 'H' | 'L' };
type Yogurt =  { greak: boolean, cost: 'H' | 'L' };

function isFavorite(a: Fruits | Salad | Yogurt ){
  if( 'apple' in a ){
    a.apple = true;
  } else if ('tender' in a ) {
    a.tender = true
  } else {
    a.greak = true;
  }
}

Null 타입 가드

function isNull(data: number[] | null){
  if(data && typeof data === 'object')}
  for (const number of data){
    console.log(number);
  }
}
}
profile
new blog: https://hae0-02ni.tistory.com/

4개의 댓글

comment-user-thumbnail
2023년 11월 29일

이번주 꽤 정신없어서 예시를 하나하나 해보지 못했는데 아티클 보며 코드까지 복습 제대로 했어용,,✨

답글 달기
comment-user-thumbnail
2023년 11월 29일

핵심만 딱딱!! 복습 잘 하고 갑니당..~!

답글 달기
comment-user-thumbnail
2023년 11월 29일

타입 추론을 처음 공부하면서 타스는 진짜 자기 멋대로다... 라는 생각을 하기도 했어요 ㅎㅎ 근데 다시 생각해보니 타입 추론을 안했다면 코드가 얼마나 지저분해졌을지.,, 그치만 요즘 타스로 합세를 진행하면서 어디에는 타입을 써줘야되고 어디에는 안써도되고 아직 익숙하지 않아서 많이 헷갈리더라구요 ㅜㅜ

1개의 답글