하위 태스크 1

배열 타입 정의

number[], string[], 유니온 배열, 다차원 배열 작성

src/arrays.ts:

const numbers: number[] = [1, 2, 3, 4, 5];
const strings: string[] = ["Hello,", "This", "is", "the", "TypeScript"];
const unions: (number | string)[] = ["My", "age", "is", 30];
const matrix: number[][] = [
	[1, 2, 3],
	[4, 5, 6],
	[7, 8, 9],
];

하위 태스크 2

튜플 타입 실습

고정 길이 튜플 작성, 회원 정보 배열에 튜플 적용

src/arrays.ts:

// ...
type Member = [string, "M" | "W", number];
const gildong: Member = ["홍길동", "M", 24];

선언된 튜플 타입과 일치하지 않는 값이 할당되면 오류가 발생한다.

const gildong: Member = ["홍길동", "M", "24"];
// 2322: Type 'string' is not assignable to type 'number'.

하위 태스크 3 ~ 4

객체 리터럴 타입

객체 타입 직접 정의, 프로퍼티 접근 확인

선택적/readonly 프로퍼티

?와 readonly 키워드 사용, 동작 확인

src/object.ts:

const user: {
	id?: number,
	readonly name: string,
} = {
	id: 1,
	name: "홍길동",
};
 
console.log(user.id, user.name); // 1 홍길동

하위 태스크 5

타입 별칭 작성

type 키워드로 타입 재사용, 여러 곳에서 활용

src/object.ts:

type User = {
	id?: number,
	readonly name: string,
};
 
const gildong: User = {
	id: 1,
	name: "홍길동",
};
 
const sujung: User = {
	id: 2,
	name: "홍수정",
};
 
console.log(gildong.id, gildong.name);
console.log(sujung.id, sujung.name);

하위 태스크 6

인덱스 시그니처

동적 키-값 타입 정의, 국가 코드 예제 작성

src/objects.ts:

// ...
 
type CountryCode = {
	[key: string]: string,
};
 
const countryCode = {
	"South Korea": "KR",
	"Taiwan": "TW",
	"Morocco": "MA",
	"Kuwait": "KW",
	"Laos": "LA",
};

하위 태스크 7 ~ 8

숫자형 Enum

자동 할당되는 숫자 Enum 작성 및 사용

문자열 Enum

명시적 문자열 값 Enum 작성 및 사용

src/enums.ts:

enum Role {
	ADMIN,
	USER,
	GUEST,
}
 
enum Language {
	korean = "ko",
	english = "en",
}
 
const gildong: {
	name: string,
	role: Role,
	language: Language,
} = {
	name: "홍길동",
	role: Role.ADMIN,
	language: Language.korean,
};

트랜스파일 JavaScript:

"use strict";
var Role;
(function (Role) {
    Role[Role["ADMIN"] = 0] = "ADMIN";
    Role[Role["USER"] = 1] = "USER";
    Role[Role["GUEST"] = 2] = "GUEST";
})(Role || (Role = {}));
var Language;
(function (Language) {
    Language["korean"] = "ko";
    Language["english"] = "en";
})(Language || (Language = {}));
const gildong = {
    name: "홍길동",
    role: Role.ADMIN,
    language: Language.korean,
};

하위 태스크 9

any 타입 실험

any 타입의 위험성 직접 경험

any 타입은 지정된 변수에 대해 타입 검사를 하지 않지 떄문에, 어떤 자료형의 값이라도 할당할 수 있다.

src/speical-types.ts:

let anyBox: any;
 
anyBox = 1;
anyBox = "What?";
anyBox = true;
anyBox = {
	name: "홍길동",
};
 
console.log(anyBox.name); // 홍길동

하위 태스크 10

unknown 타입 실습

unknown 타입과 타입 좁히기 조합

unknown 타입은 any 타입과 유사하지만 타입 검사가 적용되며, unknown 타입의 변수를 타입 가드를 통해 타입을 좁힌 뒤 사용한다.

src/special-types.ts:

// ...
 
let unknownBox: unknown;
 
unknownBox = 1;
unknownBox = "What?";
unknownBox = true;
unknownBox = {
	name: "홍길동",
};
 
// console.log(unknownBox.name);// 2339: Property 'name' does not exist on type 'unknown'.
 
type User = {
	name: string,
};
 
function isObject(value: unknown): value is Record<string, unknown> {
	return typeof value === "object" && value !== null;
}
 
function isUser(value: unknown): value is User {
	return isObject(value) && typeof value.name === "string";
}
 
if (isUser(unknownBox)) {
	console.log(unknownBox.name); // 홍길동
}

하위 태스크 11

void/never 타입

함수 반환 타입으로 void와 never 사용

src/special-types.ts:

// ...
 
function sayHello(): void {
	console.log("Hello.");
}
 
function throwBall(): never {
	throw Error("Catch my ball!");
}