템플릿 리터럴 타입

템플릿 리터럴 타입

특수한 문자열 타입

특히 문자열의 조합을 표현할 때 편리

  • 백틱(`)과 보간(${})을 사용하는 자바스크립트의 자바스크립트 템플릿 리터럴과 사용법이 비슷

    • 값 대신 타입을 만들기 위해 사용됨

  • 템플릿 리터럴 타입은 재귀 호출이 가능

type Literal = 'literal';
type Template = `template ${Literal}`; //"template literal"
// Template 타입을 사용하면 정해진 문자열만 변수에 대입할 수 있음
const str: Template = 'template literal';
  • 문자열 타입 안에 다른 타입을 변수처럼 넣을 수 있음

type Template = `template ${string}`;
let str: Template = 'template ';
str = 'template hello';
str = 'teamplte 123';
str = 'template';  // error -> template 문자열 뒤에 띄어쓰기가 없기 때문
  • 템플릿 리터럴 타입을 사용하면 문자열 변수를 엄격하게 관리 가능

  • 특히 문자열의 조합을 표현할 때 편리

type City = 'seoul' | 'suwon' | 'busan';
type Vehicle = 'car' | 'bike' | 'walk';
type ID = `${City}:${Vehicle}`;
const id = 'seoul:walk';

infer 와 함께 사용하면 더 강력하다

  • 좌우 공백이 있는 문자열 타입에서 공백을 제거하는 작업

    • ' test ' -> 'test'

type RemoveX<Str> = Str extends `x${infer Rest}`
  ? RemoveX<Rest>
  : Str extends `${infer Rest}x` ? RemoveX<Rest> : Str;
type Removed = RemoveX<'xxtestxx'>; // 'test'
  • 좌우를 동시에 지우지 않는건 좌우 대칭인 경우에만 동작하기 때문

어떤 타입을 만든 뒤에는 여러 테스트 사례를 생각해서 어떠한 경우에도 다 돌아가도록 만들어야 한다.

type RemovedEmpty<Str> = Str extends ` ${infer Rest}`
  ? RemovedEmpty<Rest>
  : Str extends `${infer Rest} ` ? RemovedEmpty<Rest> : Str
  
TYPE REMOVED = REMOVEEMPTY<'  test  '> // 'test'

Last updated