Literal Types

고재현·2023년 8월 8일
0

TypeScript

목록 보기
6/13
post-thumbnail

더 엄격한 타입을 지정해주고 싶다면?

그럴 때 쓰는 것이 literal types이다.

let john : '대머리';
let kim : '솔로';

위처럼 변수명 뒤에 string, number이 아닌
일반 글자를 붙일 수 있다.

저렇게 타입을 지정해 준다면
john이라는 변수는 '대머리'라는 글자만 할당할 수 있고,
kim이라는 변수는 '솔로'라는 글자만 할당할 수 있다.

literal types ?
특정한 글자나 숫자만 가질 수 있게 제한을 두는 타입!

다른 예들도 들어보자면

let 방향: 'left | right' ;
방향 = 'left';

이렇게 or 연산자처럼 쓸 수 있고

function 함수(a:'hello') : 1|0|-1{
  return 1
}

함수에도 똑같이 쓸 수 있다.
파라미터 타입선언할 때 글자나 숫자를 집어넣으면 그것만 파라미터로 넣을 수 있고
return 타입선언할때도 파라미터 타입선언할 때와 동일하게 할 수 있다.

어떻게 보면 const 변수의 업그레이드 버전이라고도 할 수 있다.
변하지 않는 정보를 저장하는 것은 비슷하지만,,
가끔은 변하는 중요한 정보를 저장하고 싶을때는 const를 쓰지 못한다.
그럴 때 literal type을 쓰면 되는 것이다.

as const

var 자료 = {
  name : 'kim'
}
function 내함수(a:'kim'){

}
내함수(자료.name)

오류가 뜨는 이유가 무엇일까?
함수는 'kim' 타입만 입력할 수 있다고 해놨고
자료.name은 string타입이지 'kim'타입이 아니기 때문이다.

해결방법

  1. object 만들 때 타입을 미리 잘 정한다.
  2. assertion을 쓴다.
  3. as const를 쓴다.

1,2번은 예전에 다뤄봤으니 이번엔 as const를 다뤄보겠다.

as const의 효과는 2가지 인데
1. 타입을 object의 value로 바꿔준다.
2. object안에 있는 모든 속성을 readonly로 바꿔준다.

고로 as const를 써서 위 코드를 바꿔보자면

var 자료 = {
  name : 'kim'
}as const;

function 내함수(a:'kim'){

}
내함수(자료.name)

결국 타입이 'kim'으로 바뀌었기에 정상적으로 실행이 될 것이다.
object를 잠그고 싶다면 as const를 사용해보는 것은 어떨까

profile
잘못된 내용이 있다면 알려주세요..!

0개의 댓글