TypeScript 타입은 변수가 어떤 종류의 값을 담을 수 있는지를 나타냅니다. 콜론 뒤에 타입을 쓰면(let name: string) 컴파일러가 잘못된 종류의 값을 넣는 코드를 거부합니다. 기본 타입은 JavaScript의 일곱 가지 원시 타입과, 배열과 객체를 위한 객체 타입입니다.
타입 표기는 컴파일할 때 검사된 뒤 제거됩니다. 실제로 실행되는 프로그램은 평범한 JavaScript입니다.
원시 타입
| 타입 | 값의 예 | 설명 |
|---|---|---|
string | "hi", 'hi', `hi ${name}` | 텍스트. 세 가지 따옴표 모두 같은 타입입니다. |
number | 42, 3.14, -0.5, NaN, Infinity | 정수든 소수든 모든 숫자. int나 float는 없습니다. |
boolean | true, false | 이 두 값만 가집니다. |
bigint | 10n, BigInt(10) | 크기 제한이 없는 정수. target이 ES2020 이상이어야 합니다. |
symbol | Symbol("id") | 고유한 값. 주로 객체 키로 씁니다. |
null | null | "의도적으로 비어 있음". |
undefined | undefined | "설정되지 않음". 없는 프로퍼티를 읽었을 때의 값이기도 합니다. |
타입 이름은 소문자입니다. 런타임의 typeof도 대부분 같은 단어를 돌려주므로, 프로그램 실행 중에 값의 원시 타입을 확인할 때는 typeof x === "number"처럼 씁니다.
타입 표기(Type Annotation)
타입 표기는 변수, 매개변수, 함수의 매개변수 목록 뒤에 붙이는 : Type입니다. 가장 중요한 곳은 매개변수입니다. 호출하는 쪽이 무엇을 넘길지 TypeScript가 추측할 수 없기 때문입니다.
같은 줄에서 변수를 초기화한다면 타입 표기는 대개 필요 없습니다. let count = 10은 이미 number 타입입니다. 타입을 생략하는 규칙은 타입 추론 페이지에서 다룹니다.
잘못된 타입은 컴파일 오류
잘못된 타입의 값을 대입하면 아무것도 실행되기 전에 컴파일러가 멈춥니다.
컴파일러는 다음과 같이 출력합니다.
index.ts(3,1): error TS2322: Type 'string' is not assignable to type 'number'.
값을 변환하거나(port = Number("3000")), 변수가 정말 텍스트를 담아야 한다면 타입 표기를 바꾸면 됩니다.
number: 정수 타입은 없다
JavaScript는 모든 숫자를 64비트 부동소수점 값으로 저장하므로 TypeScript에도 number 타입 하나만 있습니다. 정수는 Number.MAX_SAFE_INTEGER(2 ** 53 - 1)까지 정확하게 표현됩니다. 그보다 크면 bigint를 쓰세요.
bigint와 number는 섞을 수 없습니다. exact + 1은 컴파일 오류(TS2365: Operator '+' cannot be applied to types 'bigint' and '1'., 여기서 '1'은 1의 리터럴 타입)이며, 만약 실행된다 해도 런타임에 TypeError가 납니다. BigInt(1)이나 Number(exact)로 한쪽을 명시적으로 변환하세요. 단, Number는 안전 범위를 넘는 값을 반올림한다는 점을 기억하세요.
정수만 받는 타입을 원해도, 임의의 값에 대해서는 TypeScript로 표현할 수 없습니다. 값이 프로그램에 들어오는 지점에서 Number.isInteger로 검증하세요.
boolean
boolean의 값은 true와 false 두 개뿐입니다. 단지 truthy인 값(1, "yes")은 boolean이 아니므로 Boolean(x)나 x !== 0으로 변환합니다.
null과 undefined
strict가 켜져 있으면(TypeScript 6.0부터 기본값) null과 undefined는 별도의 타입이며 string, number 등 다른 타입에 포함되지 않습니다. 비어 있을 수 있는 변수는 유니언으로 그 사실을 드러냅니다.
undefined일 수 있는 값의 프로퍼티를 읽으면 확인하기 전까지 컴파일 오류가 납니다. 확인 방법과 ?., ??는 null과 undefined 페이지에서 다룹니다.
배열과 객체 한눈에 보기
원시 타입이 아닌 것은 모두 객체 타입입니다. 처음 만나게 되는 세 가지 형태는 다음과 같습니다.
let tags: string[] = ["ts", "js"]; // array of strings
let point: { x: number; y: number } = { x: 1, y: 2 }; // object with two number properties
let greet: (name: string) => string = (n) => `hi ${n}`; // function type
각각 별도의 페이지가 있습니다: 배열, 튜플(길이가 고정된 배열), 객체 타입, 함수 타입.
string, number, boolean과 String, Number, Boolean
대문자로 시작하는 이름은 일반 값이 아니라 JavaScript 래퍼 객체(new String("x"))의 타입입니다. 타입 표기에는 소문자 이름을 쓰세요.
index.ts(3,7): error TS2322: Type 'String' is not assignable to type 'string'.
'string' is a primitive, but 'String' is a wrapper object. Prefer using 'string' when possible.
첫 줄의 String을 string으로 바꾸면 코드가 실행됩니다. Number, Boolean, Symbol, BigInt도 마찬가지입니다. (Object는 다른 경우입니다. 원시 값을 포함해 거의 모든 값을 받아들입니다. 객체 타입 페이지를 참고하세요.)
그 밖의 내장 타입
일찍 마주치는 타입이 몇 가지 더 있습니다. 각각 별도의 페이지가 있습니다.
| 타입 | 의미 |
|---|---|
any | 해당 값의 타입 검사를 끕니다. 피하세요. |
unknown | 어떤 값이든 되지만, 사용하기 전에 반드시 확인해야 합니다. |
void | 함수가 쓸모 있는 값을 반환하지 않습니다. |
never | 값이 전혀 없음: 항상 예외를 던지는 함수나 일어날 수 없는 경우. |
object | 원시 값이 아닌 모든 값. |
"red" | "green" | 리터럴 타입: 정확히 이 값들만 허용합니다. |
자주 묻는 질문
TypeScript에 정수(integer) 타입이 있나요?
없습니다. JavaScript는 모든 숫자를 64비트 부동소수점으로 저장하므로 number 하나가 정수와 소수를 모두 다룹니다. 실행 중에 정수인지 확인하려면 Number.isInteger(n)을 쓰고, Number.MAX_SAFE_INTEGER(2 ** 53 - 1)보다 큰 정수를 정밀도 손실 없이 다뤄야 하면 bigint(10n)를 사용합니다.
TypeScript에서 string과 String의 차이는 무엇인가요?
string은 원시 타입으로, 문자열 리터럴과 템플릿 문자열이 이 타입을 가집니다. String은 new String("x")로 만든 래퍼 객체의 타입입니다. 타입 표기에는 항상 소문자 string, number, boolean을 쓰세요. String을 string에 대입하면 컴파일 오류(TS2322)가 납니다.
TypeScript의 원시 타입에는 무엇이 있나요?
JavaScript와 같은 일곱 가지입니다: string, number, boolean, bigint, symbol, null, undefined. 그 밖의 모든 것(배열, 객체, 함수, 클래스 인스턴스)은 객체 타입입니다.
TypeScript에서 변수에 타입을 지정하려면 어떻게 하나요?
이름 뒤에 콜론과 타입을 씁니다: let count: number = 0;. 함수라면 각 매개변수에, 필요하면 반환 타입에도 표기합니다: function add(a: number, b: number): number. 변수를 초기화하는 경우에는 대개 표기를 생략하고 TypeScript가 추론하게 두면 됩니다.
TypeScript 타입은 런타임에도 존재하나요?
아니요. 컴파일러가 타입을 검사한 뒤 제거하므로 실제로 실행되는 JavaScript에는 타입 표기가 없습니다. 런타임에는 typeof, Array.isArray, instanceof 같은 JavaScript 연산자로 값을 확인합니다.