Item 8 타입 공간과 값 공간의 심벌 구분하기
Symbols
타입스크립트의 심벌(symbol)은 타입 공간이나 값 공간 중의 한 곳에 존재한다.
이 둘을 구분할 수 있을까? 이름은 같지만 하나는 타입이고 하나는 값으로 쓰이며, 서로 관련이 없다. 이런 점이 가끔 문제를 야기하므로 문맥을 읽어야 한다.
리터럴 예시
대입(=) 예시
TS 코드에서 타입과 값은 번갈아 나올 수 있다. 타입 선언(:
) 또는 단언문(as
) 다음에 나오는 심벌은 타입인 반면, =
다음에 나오는 모든 것은 값이다.
함수 예시
타입과 값이 반복적으로 번갈아 나올 수 있다.
클래스 예시
한편, 클래스는 값으로도 타입으로도 쓰일 수 있다.
클래스가 타입으로 쓰일 때는 형태(속성과 메서드)가 사용된다. (
cylinder: Cylinder
, ...)클래스가 값으로 쓰일 때는 생성자가 사용된다. (
new Cylinder(...)
)
따라서 클래스는 상황에 따라 다르게 동작한다.
2번째 줄의 경우 t
의 타입이 typeof Cylinder
인데, 중요한 건 Cylinder
가 인스턴스의 타입이 아니라는 것이다.
실제로 new
키워드를 사용할 때 볼 수 있는 생성자 함수이다.
InstanceType
제너릭을 이용해 생성자 타입과 인스턴스 타입을 전환할 수 있다.
typeof
연산자 예시
typeof
연산자 예시타입으로 쓰일 때와 값에서 쓰일 때 다른 기능을 하는 것들 중에는 typeof
연산자가 있다.
타입의 관점에서
typeof
는 값을 읽어 타입스크립트 타입을 반환한다. (TypeScript Docs)타입 공간의
typeof
는 보다 큰 타입의 일부분으로 사용하거나type
구문으로 이름을 붙일 수 있다.
값의 관점에서
typeof
는 자바스크립트 런타임의typeof
연산자가 된다. (MDN Docs)
속성 접근자 []
예시
[]
예시속성 접근자인 []
는 타입으로 쓰일 때에도 동일하게 동작한다. 하지만 obj['field']
와 obj.field
는 값이 동일하더라도 타입은 다를 수 있다.
따라서 타입의 속성을 얻을 때에는 반드시 첫 번째 방법(obj['field']
)을 사용해야 한다.
Person['first']
는 여기서 타입 맥락(:
뒤에)에 쓰였기 때문에 타입이다.
인덱스 위치에는 유니온 타입과 기본형 타입을 포함한 어떠한 타입이든 사용할 수 있다.
속성 접근자에 대한 내용은 Item 14에서 더 자세히 다룬다.
그 외 타입 공간과 값 공간 사이에서 다른 의미를 가지는 코드 패턴들
Code Pattern | JavaScript | TypeScript |
---|---|---|
| JS의 | 다형성(polymorphic) |
| AND와 OR 비트연산 | 인터섹션과 유니온 |
|
|
|
| 서브클래스( |
|
| 루프 ( | 매핑된(mapped) 타입에 등장 |
Last updated