TypeScript는 JavaScript와 거의 동일한 데이터 타입을 지원하며, 열거 타입을 사용하여 더 편리하게 사용할 수 있다.
가장 기본적인 데이터 타입은 JavaScript, TypeScript에서 boolean 값이라고 일컫는 참/거짓(true/false) 값이다.
let isDone: boolean = false;
JavaScript처럼, TypeScript의 모든 숫자는 부동 소수 값이다. 부동 소수에는 number라는 타입이 붙혀진다. TypeScript는 16진수, 10진수 리터럴에 더불어, ECMAScript 2015에 소개된 2진수, 8진수 리터럴도 지원한다.
let decimal: number = 6;
JavaScript처럼 TypeScript도 큰따옴표 (")나 작은따옴표 (')를 문자열 데이터를 감싸는데 사용한다. 또한 템플릿 문자열 을 사용하면 여러 줄에 걸쳐 문자열을 작성할 수 있으며, 표현식을 포함시킬 수도 있다. 이 문자열은 백틱/백쿼트 (` ) 문자로 감싸지며, ${ expr }과 같은 형태로 표현식을 포함시킬 수 있다.
let color: string = "blue";
배열 타입은 두 가지 방법으로 쓸 수 있다.
첫 번째 방법 : 배열 요소들을 나타내는 타입 뒤에 [] 쓰기
let list: number[] = [1, 2, 3];
두 번째 방법 : 제네릭 배열 타입 쓰기 Array<elemType>
let list: Array<number> = [1, 2, 3];
튜플 타입을 사용하면, 요소의 타입과 개수가 고정된 배열을 표현할 수 있다.
// 튜플 타입으로 선언
let x: [string, number];
// 초기화
x = ["hello", 10]; // 성공
// 잘못된 초기화
x = [10, "hello"]; // 오류
JavaScript의 표준 자료형 집합과 사용하면 도움이 될만한 데이터 형은 enum이다.
C# 같은 언어처럼, enum은 값의 집합에 더 나은 이름을 붙여줄 수 있다.
enum Color {Red, Green, Blue}
let c: Color = Color.Green;
애플리케이션을 만들 때, 알지 못하는 타입을 표현해야 할 수도 있다.
이 경우 타입 검사를 하지 않고, 그 값들이 컴파일 시간에 검사를 통과하기 위해 any 타입을 사용할 수 있다.
let notSure: any = 4;
notSure = "maybe a string instead";
notSure = false; // 성공, 분명히 부울입니다.
또한, any 타입은 타입의 일부만 알고 전체는 알지 못할 때 유용하다.
예를 들어, 여러 다른 타입이 섞인 배열을 다룰 수 있다.
let list: any[] = [1, true, "free"];
list[1] = 100;
void는 어떤 타입도 존재할 수 없음을 나타내기 때문에, any의 반대 타입 같다.
void는 보통 함수에서 반환 값이 없을 때 반환 타입을 표현하기 위해 쓰이는 것을 볼 수 있다.
function warnUser(): void {
console.log("This is my warning message");
}
void를 타입 변수로 선언하는 것은 유용하지 않은데, 왜냐하면 그 변수에는 null 또는 undefined 만 할당할 수 있기 때문이다.
let unusable: void = undefined;
unusable = null; // 성공 `--strictNullChecks` 을 사용하지 않을때만
TypeScript는 undefined 과 null 둘 다 각각 자신의 타입 이름으로 undefined , null로 사용한다.
void처럼 그 자체로 유용한 경우는 거의 없다.
// 이 밖에 이 변수들에 할당할 수 있는 값이 없습니다!
let u: undefined = undefined;
let n: null = null;
never 타입은 절대 발생할 수 없는 타입을 나타낸다.
예를 들어, never는 함수 표현식이나 화살표 함수 표현식에서 항상 오류를 발생시키거나 절대 반환하지 않는 반환 타입으로 쓰인다.
// never를 반환하는 함수는 함수의 마지막에 도달할 수 없다.
function error(message: string): never {
throw new Error(message);
}
// 반환 타입이 never로 추론된다.
function fail() {
return error("Something failed");
}
// never를 반환하는 함수는 함수의 마지막에 도달할 수 없다.
function infiniteLoop(): never {
while (true) {
}
}
object는 원시 타입이 아닌 타입을 나타낸다.
예를 들어, number, string, boolean, bigint, symbol, null, 또는 undefined 가 아닌 나머지를 의미한다.
object 타입을 쓰면, Object.create 같은 API 가 더 잘 나타난다.
declare function create(o: object | null): void;
create({ prop: 0 }); // 성공
create(null); // 성공
create(42); // 오류
create("string"); // 오류
create(false); // 오류
create(undefined); // 오류
가끔, TypeScript보다 개발자가 값에 대해 더 잘 알고 있을 때가 있다.
타입 단언(Type assertions) 은 컴파일러에게 "날 믿어, 난 내가 뭘 하고 있는지 알아"라고 말해주는 방법이다.
타입 단언은 다른 언어의 타입 변환(형 변환)과 유사하지만, 다른 특별한 검사를 하거나 데이터를 재구성하지는 않는다.
타입 단언에는 두 가지 형태가 있다.
하나는 "angle-bracket" 문법이다.
let someValue: any = "this is a string";
let strLength: number = (<string>someValue).length;
다른 하나는 as 문법이다.
(TypeScript를 JSX와 함께 사용할 때는, as 스타일의 단언만 허용된다.)
let someValue: any = "this is a string";
let strLength: number = (someValue as string).length;