Literal Types

var, let으로 변수를 선언할 때는 컴파일러에게 이 변수는 값이 변할 여지가 있다고 말해주는 반면 const를 사용할 때는 이 변수는 값이 변하지 않는다고 말하는 것과 같다.

따라서 타입스크립트는 var, let을 사용할 때는 값이 변할 여지가 있으므로 string 타입으로 설정하고, const를 사용할 때 해당 변수의 타입을 string이 아닌 해당 값으로 설정하게 된다.

const hi = 'hi'; // type: 'hi'
let hello = 'hello'; // type: string

이렇게 잠재적으로 무한대의 경우의 수를 가지는 타입을 더 작고, 유한한 타입으로 좁히는 것을 Literal Types이라고 한다.

Index Signatures

Index Signatures는 구체적인 속성값을 알지는 못하지만 타입은 알고 있을 때, 해당 타입을 지정해줌으로써 해당 타입의 값들로 객체에 접근할 수 있도록 해주는 방식이다.

객체에 접근하기 위한 key의 타입은 string이 아니라 literal type이어야 한다. Object.keys()와 같은 방식으로 객체에 접근할 경우 반환값이 string[] 이기 때문에 컴파일 에러가 발생하게 된다.

따라서 Index Signatures를 사용하면 string 타입의 키로도 객체에 접근할 수 있다.

interface Foo {
  [index: number]: string;
}

const foo: Foo = {
	bar: 'bar',
};

const key: string = 'bar'; // type: string

console.log(foo[key]); // 'bar';

Mapped Types