
number, string, boolean을 명시적으로 설정한 변수 선언은 아래와 같이 작성한다.// 명시적으로 number 타입을 설정
let productId : number = 124981;
// 명시적으로 string 타입을 설정
let productName : string = 'VR 글래스';
// 명시적으로 boolean 타입을 설정
let isWaterprofing : boolean = false;
[]를 쓰는 것이다.let list: number[] = [1, 2, 3];
let list: Array<number> = [1, 2, 3];
// 오직 숫자 아이템만 허용
let nums : number[] = [100, 101, 102];
// 오직 문자 아이템만 허용
let strs : string[] = ['ㄱ', 'ㄴ', 'ㄷ'];
// 오직 불리언 아이템만 허용
let boos : boolean[] = [true, false, true];
// 모든 데이터 타입을 아이템으로 허용
let anys : any[] = [100, 'ㄴ', true];
// 특정 데이터 타입(숫자 또는 문자)만 아이템으로 허용
let selects : (number|string)[] = [102, 'ㅇ'];
let x: [string, number];
x = ['hello', 10]; // 성공
// Type 'number' is not assignable to type 'string'.
// Type 'string' is not assignable to type 'number'.
x = [10, 'hello']; // 오류
let arr : [string, number] = ['Hi', 6];
arr[1].concat('!'); // Error, 'number' does not have 'concat'
let arr : [string, number] = ['Hi', 6];
arr[3] = 'hello'; // Error, Property '3' does not exist on type '[string, number]'
TypeScript는 열거형(enum) 데이터 타입을 지원한다. enum은 정해진 값(상수)을 가지는 집합을 표현하고, 이것을 타입으로 사용할 수 있도록 한다. 숫자, 문자를 대신해서 의미가 부여된 레이블처럼 값을 지정할 수 있으므로 코드의 가독성을 높여주는 장점이 있다.
열거된 각 레이블은 별도의 값이 설정되지 않은 경우 기본적으로 0부터 시작한다.
// 값 미할당
enum Team {
Manager, // 0
Planner, // 1
Developer, // 2
Designer, // 3
}
let sarha : number = Team.Designer;
console.log(sarha) // 3
enum에 설정된 레이블에 값을 할당할 수도 있으며, 값이 할당되지 않은 레이블은 이전 레이블의 값에 +1 된 값이 설정된다.
문자 열거형은 각 레이블에 모두 문자값을 지정해야 한다. 문자 열거형은 숫자가 아니어서 자동으로 1씩 증가할 수 없으므로 모든 레이블에 명시적으로 값을 부여해야 한다.
// 값 할당
enum Team {
Manager = 101,
Planner = 208,
Developer = 302,
Designer, // 302 + 1
}
let yamoo9 : number = Team.Manager;
console.log(yamoo9) // 101
let sarha : number = Team.Designer;
console.log(sarha) // 303
let role : string = Team[302];
console.log(role) // 'Developer'
any로 타입 지정하게 되면 형식 검사를 수행하지 않아 어떤 타입도 할당 가능하도록 할 수 있다.// 명시적으로 any 타입 지정
let productId : any = 124981;
// any 유형이 설정되었으므로 어떤 유형도 값으로 할당 가능
productId = 'p9023412';
void 타입은 보통 결과값을 리턴하지 않는 함수의 타입을 지정할 때 사용하며, any 타입의 반대 타입이다. 반면 결과 값을 리턴하는 함수의 경우 명시적으로 반환 값의 타입을 지정할 수 있다.let unknown : void = undefined;
// 리턴 값 타입이 명시적으로 설정되지 않는 함수
function assignClass(name: string) : void {
document.documentElement.classList.add(name);
}
// 리턴 값 타입이 숫자인 함수
const factorial = (n: number) : number => {
if (n < 0) {
return 0;
}
if (n === 1) {
return 1;
}
return n * factorial(n - 1);
}
// 리턴 값 타입이 문자인 경우
function repeat(text: string, count: number = 1) : string {
let result: string = "";
while (count--) {
result += text;
}
return result;
}
JavaScript에서 null, undefined는 데이터 타입 이자 하나의 값이다. TypeScript에서도 하나의 타입으로 처리 되며 아래와 같이 사용할 수 있다.
null은 '객체가 없음'을 나타내는 값으로, TypeScript에서 null은 타입으로도 사용된다. undefined는 '할당한 값이 없음'을 나타내는 값이자 타입이다.
let nullable : null = null;
let undefinedable : undefined = undefined;
// [오류]
// [ts] 'undefined' 형식은 'null' 형식에 할당할 수 없습니다.
// let nullable: null
nullable = undefined;
false로 설정할 경우 위와 같은 오류가 발생하지 않는다."strictNullChecks": true, /* 엄격한 null 검사 사용 */
null, undefined를 할당 받을 수 없다. 그러므로 아래와 같은 코드 구문은 오류를 출력한다.// [오류]
// [ts] 'null' 형식은 'string' 형식에 할당할 수 없습니다.
// let assign_name: string
let assign_name:string = null;
if (!assign_name) {
assign_name = '미네랄';
}
never는 일반적으로 함수의 리턴 타입으로 사용된다. 함수의 리턴 타입으로 never가 사용될 경우, 항상 오류를 출력하거나 리턴 값을 절대로 내보내지 않음을 의미한다. 이는 무한 루프(loop)에 빠지는 것과 같다.// 항상 오류 발생
function invalid(message : string): never {
throw new Error(message);
}
// never 타입을 결과 추론(Inferred)
function fail() {
return invalid('실패');
}
// 무한 루프
function infiniteAnimate(): never {
while (true) {
infiniteAnimate();
}
}
never 타입을 지정한 변수에 never가 아닌 타입은 할당할 수 없다.let never_type : never;
// 오류 발생: 숫자 값을 never 타입 변수에 할당할 수 없습니다.
never_type = 99;
// 함수의 반환 값이 never 타입 이기 때문에 오류가 발생하지 않습니다.
never_type = (function (): never {
throw new Error("ERROR");
})();
타입 단언(Type assertions)은 개발자가 해당 타입에 대해 확신이 있을 때 사용하는 타입 지정 방식이다. 다른 언어의 타입 캐스팅과 비슷한 개념이며 타입스크립트를 컴파일 할 때 특별히 타입을 체크하지 않고, 데이터의 구조도 신경쓰지 않는다.
타입 단언은 기본적으로 as 키워드를 이용해서 정의할 수 있다.
let someValue: any = "this is a string";
let strLength: number = (someValue as string).length;
interface Hero {
name: string;
age: number;
}
const capt: Hero = {}; // X. 오류 발생
capt.name = '캡틴';
capt.age = 100;
capt 변수가 정의되는 시점에서 name, age 등의 속성이 정의되지 않았기 때문이다. 이는 아래와 같이 코드를 변경하여 타입 오류를 해결할 수도 있다.interface Hero {
name: string;
age: number;
}
const capt: Hero = {
name: '캡틴',
age: 100
};
as 키워드로 타입 문제를 해결할 수 있다.interface Hero {
name: string;
age: number;
}
const capt = {} as Hero; // 오류 없음
capt.name = '캡틴';
capt.age = 100;