지금까지 어떤 변수에 타입을 지정하는 방법에 대해서 배워왔다.
그런데 어떤 변수에 '어떤 값' 이 들어가도록 아예 제한할 수도 있다.
const 를 쓸 수도 있겠지만, 내가 어떤 변수에 들어갈 수 있는 값을 2~3개 지정할 수도 있는 것이다.
이럴 땐 Literal Type 을 선언하면된다.
Literal Type
string, number... 뿐 아니라 일반 값도 타입이 될 수 있다.
let name :'홍길동';
예를 들어서 위처럼 name 이라는 변수에는 '홍길동' 이라는 글자만 들어갈 수 있는 것이다.
이렇게 특정 값만 가질 수 있게 제한을 둘 수 있는 타입을 literal type 이라고 한다.
더 엄격하게 만드는 개념이다.
꼭 1개가 아니어도 된다.
let name :'홍길동'|'서다원';
위 처럼 '홍길동' 또는 '서다원' 을 가질 수 있는 변수로 만들 수도 있다.
함수도 마찬가지로 파라미터와 return 값의 타입을 선언할 때에
특정 값으로 타입을 선언할 수 있다.
function sayHi(x : 'hi') : 1 | 0 | -1 {
return 1
}
위의 코드가 그 예시이다.
위의 함수는 return 값으로 1 또는 0 또는 -1 만 가질 수 있다.
이렇게 변하지 않는 데이터를 저장하고 싶을 때에는 const 를 쓰지만
그 데이터가 여러개이길 바란다면(가끔은 변하는 정보라면) 방금 살펴본 것처럼 literal type 을 사용할 수 있겠다.
as const
var 자료 = {
name : 'kim'
}
function 내함수(a : 'kim') {
}
내함수(자료.name)
위 코드를 살펴보자.
자료.name 을 만약에 출력해보면 아마 'kim' 이라는 값이 나올 것이다.
그리고 '내함수' 라는 함수에는 파라미터로 'kim' 이라는 값만 들어갈 수 있다.
그러면 내함수(자료.name) 이렇게 사용하면 오류가 안나고 잘 작동할까?
아니다.
왜냐하면 자료.name 이라는 건 string 타입인 거지, 'kim' 타입이 아니기 때문이다.
'내함수' 에 들어가는 a 파라미터는 말 그대로 'kim' 이라는 타입이어야 잘 작동한다.
그래서 이런 문제를 해결하는 방법이 몇가지 있다.
1. object 만들때 타입을 잘 ㅈ어하기
2. assertion 쓰기 (as 'kim')
3. as const 를 object 자료에 붙이기
세번째 방법을 살펴보자
var 자료 = {
name : 'kim'
} as const;
function 내함수(a : 'kim') {
}
내함수(자료.name)
as const 를 '자료' 라는 object 맨 뒤에 붙였는데
이렇게 붙임으로써 나오는 효과가 두가지 있다.
첫번째로 타입을 object 의 value 로 바꿔준다.
무슨 말이냐함은, 타입을 'kim' 으로 바꿔준다는 것이다.
그리고 object 안에 있는 모든 속성을 readonly 로 바꿔준다.
ref: 코딩애플