"모든 프로그램은 3개 primitive 와 몇 개 special case 의 그래프야. 그 3개부터 시작해."
Big three 의 모양
모든 TypeScript 프로그램은, 바닥에선 string, number, boolean 값의 그래프야. 만나게 될 다른 대부분 타입은 이것들의 container, shape, union 이야.
Annotation 은 소문자로 써: string, number, boolean. 절대 String, Number, Boolean 이 아냐 — 그건 JavaScript wrapper-object constructor 고, 타입으로 쓰고 싶을 일 거의 없어. 소문자 형태가 실제로 원하는 primitive 타입이야.
string — Default 가 UTF-16
`string` 타입은 모든 JavaScript string 커버: single quote ('hi'), double quote ("hi"), template literal (`hi ${name}`). 셋 다 `string` 타입 값 만들어. 3개 문법 형태는 취향이랑 templating 용, 타입 구별 용이 아냐.
JavaScript string 은 내부적으로 UTF-16. 그 디테일은 non-BMP 문자 (대부분 emoji, 일부 CJK 한자) 다룰 때까지 거의 안 중요해 — 거기선 '😀'.length === 2 보게 돼, emoji 가 surrogate pair 라서. 이게 중요할 땐 code unit 대신 code point 로 iterate 하기 위해 [...str] 이나 Array.from(str) 써.
number — IEEE 754 double, integer 타입 없음
TypeScript 의 `number` 는 JavaScript 의 `number`: 64-bit IEEE 754 double-precision float. 별개 integer 타입 없음. 1, 1.5, NaN, Infinity, -0 다 `number` 타입. Safe integer 의 전체 범위는 ±2^53 − 1 (Number.MAX_SAFE_INTEGER 로 표현). 그 이상은 integer 산술이 정밀도 잃어 — 그래서 `bigint` 있음, 나중 lesson 에서 다뤄.
`int` 타입 alias 도입해서 runtime 이 강제할 거라고 가장하지 마. Type system 이 구별 안 함; runtime 도 안 함. 보장과 함께 integer 산술 필요하면 `bigint` 쓰거나 너만의 경계 지켜.
boolean — `true` 와 `false` 뿐
`boolean` 은 두 값. 놀랄 거 없어. 봐야 할 것은 runtime 의 JavaScript coercion 규칙 (if ('') /* falsy */, if (0) /* falsy */, if ('false') /* truthy! */) — boolean 이 string/number 표현식에서 계산될 때 여전히 적용. TypeScript 가 strict mode 에서 boolean 을 호환 안 되는 거랑 비교하면 경고하지만, 모든 coercion 실수 못 잡아.
: string 이 primitive 타입. : String 은 wrapper-object 타입 — 다르고, 거의 원하지 않는 거, lint 규칙이 flag 함. 모든 TypeScript 스타일 가이드와 공식 Handbook 이 소문자 형태 써.