๐ก Udemy ์ Typescript : ๊ธฐ์ด๋ถํฐ ์ค์ ํ ํ๋ก์ ํธ๊น์ง ๊ฐ์ ์คํฐ๋์์ ํ์ตํ ๋ด์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ์์ฑํฉ๋๋ค.
๐ ์คํฐ๋ ๋ ์ง : 22.05.29
# ์ ์ ํ์ ์ธ์ด VS ๋์ ํ์ ์ธ์ด
1. ๋์ ํ์ ์ธ์ด
- ์ค์ ์์ค ์ฝ๋๊ฐ ์คํ๋๋ ์์ ์ธ ๋ฐํ์ ์ ํ์ ์ ์ฒดํฌํ๊ณ ๊ฒฐ์ ํ๋ค.
- ์ฝ๋๋ฅผ ์์ฑ ํ ๋ ํ์ ์ ์ธ์ด๋ ํ์ ์ ๋ํ ๊ท์น์ ์งํฌ ํ์๊ฐ ์์ด ์๋์ ์ผ๋ก ์ฝ๋๊ฐ ์งง์ผ๋ฉฐ ๋ฌ๋ ์ปค๋ธ๊ฐ ๋ฎ๋ค.
- ํ์ ์ ๋ช ์ ํ ํ์๊ฐ ์์ด ์ ์ ํ์ ์ธ์ด์ ๋นํด ์ฝ๋๋ฅผ ๋น ๋ฅด๊ฒ ์์ฑํ ์ ์๋ค.
- ์ฝ๋ ๋ด์์ ํ์ ์ ์ ๋์ ์ผ๋ก ๋ณ๊ฒฝํ๋ฉฐ ์ฌ์ฉ ํ ์ ์๋ค.
- ๋ฐํ์ ํ์ ์ค๋ฅ๋ฅผ ๋ฐ์์ํฌ ๊ฐ๋ฅ์ฑ์ด ๋๋ค.
- ์ฝ๋๋ฅผ ์ฝ์๋ ํ์ ์ ์ถ๋ก ํ๋ฉฐ ์ฝ์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ ์ฑ์ด ์๋์ ์ผ๋ก ์ข์ง ์๋ค.
- ex ) JavaScript
2. ์ ์ ํ์ ์ธ์ด
- ์ปดํ์ผ ์ ์ฝ๋์ ํ์ ์ ๊ฒ์ฌํ๋ฉฐ ํ์ ์ด ๋ง์ง ์๋ ๊ฒฝ์ฐ ์ปดํ์ผ๋ฌ๊ฐ ์๋ฌ๋ฅผ ๋ฐ์์ํจ๋ค.
- ์ปดํ์ผ ๋จ๊ณ์์ ํ์ ์ ์ฒดํฌํจ์ผ๋ก ๋ถํ์ํ ๋ฐํ์ ํ์ ์๋ฌ๋ฅผ ์ฌ์ ์ ๋ฐฉ์งํ ์ ์๋ค.
- ์ปดํ์ผ ์์ ๋ฏธ๋ฆฌ ํ์ ์ ๊ฒฐ์ ํ๊ธฐ ๋๋ฌธ์ ๋์ ํ์ ์ธ์ด๋ณด๋ค ์คํ ์๋๊ฐ ๋น ๋ฅด๋ค.
- ํ์ ์ด ๋ช ์์ ์ผ๋ก ์ง์ ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋์ ํ์ ์ธ์ด์ ๋นํด ์๋์ ์ผ๋ก ๊ฐ๋ ์ฑ์ด ์ข๋ค.
- ๋ค์์ ํ์ ์ด๋ ํ๋ก์ ํธ์ ์ฅ๊ธฐ๊ฐ๋ฐ ๋ฐ ์ ์ง๋ณด์์ ์ ๋ฆฌํ๋ค.
- ๋งค๋ฒ ์ฝ๋๋ฅผ ์์ฑ ํ ๋๋ง๋ค ํ์ ์ ์ง์ ํด์ค์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์๊ณผ ๊ทธ๋ก ์ธํด ์ฝ๋๊ฐ ๊ธธ์ด์ง๋ ๋จ์ ์ด ์๋ค.
- ex ) TypeScript
# ํ์ ์ ์ ์ธํ๋ ๋ฐฉ๋ฒ
TypeScript ์์๋ ํ์ ์ ์ง์ ํ๊ณ ์ ํ๋ ๋์์ ๋ค์ ์ฝ๋ก ์ ๋ถ์ด๊ณ ํ์ ์ ๋ช ์ํ๋ฉฐ ์ ์ธํ ์ ์๋ค.
โจ ๋ณ์
const foo: string = 'hello';
โจ ํจ์์ ๋งค๊ฐ๋ณ์, ๋ฐํ๊ฐ
function foo(param: string): void => {
console.log(param);
}
# TypeScript ์ ํ์ ์ข ๋ฅ
- TypeScript ๋ ES5, ES6์ Superset์ด๊ธฐ ๋๋ฌธ์ ์๋ฐ์คํฌ๋ฆฝํธ์ ํ์ ๋ค๊ณผ TypeScript์์ ์ถ๊ฐ๋ ๊ณ ์ ํ์ ๋ค์ ์ฌ์ฉํ ์ ์๋ค.
- JavaScript Type : boolean, null, undefined, number, string, symbol, object
- TypeScript Type : array, tuple, enum, any, void, never
# ๊ธฐ๋ณธ ํ์
โ ๏ธ TypeScript์ ๋ชจ๋ ํ์ ์ ์๋ฌธ์๋ก ๋ํ๋ธ๋ค. ex ) number(O) Number(X)
โจ boolean
let isSelected: boolean = false;
- true ์ false ๊ฐ์ ๊ฐ์ง๋ ๊ธฐ๋ณธ ํ์
โจ number
const decimal: number = 5;
const hex: number = 0xf00d;
const binary: number = 0b111;
const octal: number = 0o124;
- JavaScript ์ ๊ฐ์ด TypeScript ์์๋ ๋ชจ๋ ์ซ์๋ int, double ๊ณผ ๊ฐ์ ์ ์, ์ค์ ํ์ ์ ๊ตฌ๋ถ ์์ด ๋ชจ๋ number ํ์ ์ด๋ค.
- ๋ชจ๋ ์ซ์๋ ๋ถ๋ ์์์ ํํ๋ก ์ ์ฅ๋๋ค.
- TypeScript 3.2 ๋ฒ์ ์ ๋ ๋ค๋ฅธ ์ซ์ ํ์ ์ธ **bigInt ํ์ **์ด ์ถ๊ฐ๋๋ค.
โจ string
const text1: string = "์ด๊ฑด ๋ฌธ์์ด ํ์
";
const text2: string = '์ด๊ฒ๋ ๋ฌธ์์ด ํ์
';
const num: number = 2022;
const text3: string = '์ฌํด๋ ' + number + '๋
์ด๋ค.'
const text4: string = `์ฌํด๋ ${number}๋
์ด๋ค.`
โจ array
const hobbies: string[] = ['sleeping', 'reading a book'];
const hobbies: Array<string> = ['sleeping', 'reading a book'];
- ๋ฐฐ์ด ํ์ ์ ์์ ๊ฐ์ด ๋ฐฐ์ด ์์๋ค์ ํ์ ๋ค์ [] ๋ฅผ ์ฐ๊ฑฐ๋ ์ ๋ค๋ฆญ ๋ฐฐ์ด ํ์ ์ ์ฌ์ฉํด ํ์ ์ ์ง์ ํ ์ ์๋ค.
โจ tuple
// 1. ํํ ํ์
์ผ๋ก ์ ์ธ
let tupleData: [string, number, boolean];
// 2. ์ด๊ธฐํ
tupleData = ["hemudi", 96, false];
// 3. Error
tupleData = ["hemudi", 96];
tupleData = [false, 96];
tupleData = [];
- ํํ ํ์ ์ ์์๋ง๋ค ์์ดํ ํ์ ๊ณผ ๊ฐ์๊ฐ ๊ณ ์ ๋ ๋ฐฐ์ด์ ํํํ ์ ์๋ค.
- push์ pop ๋ฑ์ผ๋ก ์ธํ ๋ฐ์ดํฐ ํผ์์ ๋ฐฉ์งํ ์ ์์.
โจ enum
// 0, 1, 2
enum Job {STUDENT, TEACHER, DEVELOPER}
// student, teacher, developer
enum Job {STUDENT = 'student', TEACHER = 'teacher', DEVELOPER = 'developer'}
// student, 0, 1
enum Job {STUDENT = 'student', TEACHER, DEVELOPER}
// student, 0.5, 1.5
enum Job {STUDENT = 'student', TEACHER = 0.5, DEVELOPER}
// Error - DEVELOPER ์ด๊ธฐํ ํ์!
enum Job {STUDENT = 'student', TEACHER = '0', DEVELOPER}
// use
const myJob: Job = Job.STUDENT;
const yourJob: Job = Job[3];
console.log(yourJob); // DEVELOPER
- ์ด๊ฑฐํ์ผ๋ก ์ด๋ฆ์ด ์๋ ์์๋ค์ ์งํฉ์ ์ ์ํ ์ ์๋ค.
โจ Any
let foo: any = 10;
foo = 'string type';
foo = false;
foo.charAt(1); // error ๊ฐ ์๋จ
- ๋ชจ๋ ๊ฐ๋ฅํ๋ค!
- ์์ง ๋ชปํ๋ ํ์ ์ ํํํ ๋ ์ฌ์ฉํ๋ค.
- ์ปดํ์ผ ์๊ฐ์ ํ์ ์ ๊ฒ์ฌํ์ง ์๋๋ค.
- ์ผ๋ถ๋ง ์๊ณ ์ ์ฒด๋ ์์ง ๋ชปํ ๋ ์ ์ฉํ๋ค.
- ์๋ฅผ ๋ค์ด ์ฌ๋ฌ ๋ค๋ฅธ ํ์ ์ด ์์ธ ๋ฐฐ์ด์ ๋ค๋ฃจ๋ ๊ฒฝ์ฐ
- const list: any[] = [1, true, “string data”];
โจ Void
function foo(): void {
console.log('void type');
}
let data: void = undefined;
data = null; // --strictNullChecks ๋ฅผ ์ฌ์ฉํ์ง ์์๋ ์ฑ๊ณต
- void๋ ์ด๋ค ํ์ ๋ ์กด์ฌํ์ง ์์์ ๋ํ๋ด๋ฉฐ any ๋ฐ๋ ํ์ ๊ณผ๋ ๊ฐ๋ค.
- void๋ ๋ณดํต ํจ์์์ ๋ฐํ ๊ฐ์ด ์์ ๋ ์ฃผ๋ก ์ฐ์ธ๋ค.
- void๋ก ํ์ ์ ๋ณ์์๋ null ๊ณผ undefined ๋ง ํ ๋น์ด ๊ฐ๋ฅํ๋ค.
โจ unknown
let userInput: unknown;
let userName: string;
userInput = 5;
userInput = 'Max';
userName = userInput; // error
if(typeof userInput === 'string'){
userName = userInput;
}
- ์ ์ ์๋ค!
- any ์ ๊ฐ์ด ์์ง ๋ชปํ๋ ํ์ ์ ํํํ ๋ ์ฌ์ฉํ๋ค.
- any ์ ๋ค๋ฅธ ์ ์ typeof ์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ํ์ ์ ํน์ ํ์ง ์์ผ๋ฉด ์ปดํ์ผ ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
โจ Never
// never๋ฅผ ๋ฐํํ๋ ํจ์๋ ํจ์์ ๋ง์ง๋ง์ ๋๋ฌํ ์ ์๋ค.
function error(message: string): never {
throw new Error(message);
}
// ๋ฐํ ํ์
์ด never๋ก ์ถ๋ก ๋๋ค.
function fail() {
return error("Something failed");
}
// never๋ฅผ ๋ฐํํ๋ ํจ์๋ ํจ์์ ๋ง์ง๋ง์ ๋๋ฌํ ์ ์๋ค.
function infiniteLoop(): never {
while (true) {
}
}
- never ํ์ ์ ์ ๋ ๋ฐ์ํ ์ ์๋ ํ์ ์ ๋ํ๋.
- ์๋ฅผ ๋ค์ด ํจ์ ํํ์์ด๋ ํ์ดํ ํจ์ ํํ์์์ ํญ์ ์ค๋ฅ๋ฅผ ๋ฐ์์ํค๊ฑฐ๋ ์ ๋ ๋ฐํํ์ง ์๋ ๋ฐํ ํ์ ์ผ๋ก ์ฌ์ฉ๋จ.
- ๋ณ์ ๋ํ ํ์ ๊ฐ๋์ ์ํด ์๋ฌด ํ์ ๋ ์ป์ง ๋ชปํ๊ฒ ์ขํ์ง๋ฉด never ํ์ ์ ์ป๊ฒ ๋จ.
# ์ ๋์ธ ํ์ ๊ณผ ๋ฆฌํฐ๋ด ํ์
โจ ์ ๋์ธ ํ์
let input: number | string = 'test';
input = 10;
- ์๋ก ๋ค๋ฅธ ๋ ์ข ๋ฅ์ ๊ฐ์ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ ํ์ดํ๋ฅผ ์ฌ์ฉํด ๊ฐ๋ฅํ ํ์ ๋ค์ ๋์ดํ์ฌ ๋ช ์ํ ์ ์๋ค.
โจ ๋ฆฌํฐ๋ด ํ์
type Easing = "ease-in" | "ease-out" | "ease-in-out";
const easeIn : Easing = 'ease-in';
type Dice = 1 | 2 | 3 | 4 | 5 | 6;
const one : Dice = 1;
- ์์์ ๊ฐ์ด ๋ณํ์ง ์๋ ๊ฐ๋ค์ ํ ๋นํ๋ ํ์
# Type Alias ์ Object Type
โจ Type Alias
type Person = {
name: string;
age: number | bigint;
job: Job;
hobbies: string[];
}
const hemudi: Person = {};
const hemudi = {} as Person;
- ์ธํฐํ์ด์ค์ ๋น์ทํ๊ฒ ์๋ก์ด ํ์ ์ ์ ์ํ ์ ์๋ค.
- ์ฃผ๋ก ๊ฐ์ฒด์ ํ์ ์ ์ง์ ํ ๋ ์์ฃผ ์ฐ์ด๋ ๊ฑฐ ๊ฐ๋ค.
โจ Object Type
const person : object = {
name: 'hemudi',
age: 27
}
console.log(person.name); // Error
- ๊ฐ์ฒด์ ํ์ ์ Object๋ก ์ง์ ํ ์ ์์ง๋ง ์์ ๊ฐ์ด ์๋ก ์ ์ํ ๊ฐ์ฒด์ ํ๋กํผํฐ์ ์ ๊ทผํ๋ ค๊ณ ํ๋ฉด ์๋ฌ๊ฐ ๋๋ค.
- object ํ์ ์ผ๋ก ์ง์ ํ๋ฉด ํ์ ์คํฌ๋ฆฝํธ๋ ํด๋น ๊ฐ์ฒด์ object ์์ฑ ์ธ ์ด๋ค ์์ฑ์ด ์กด์ฌํ๋์ง ์ ์ ์์ด์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
- ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Type Alias๋ฅผ ์ฌ์ฉํด ๊ฐ์ฒด์ ์ฌ์ฉ์ ์ ์ ํ์ ์ ์ง์ ํ๊ฑฐ๋ ๋ฐ๋ก ํ์ ์ ์ง์ ํ์ง ์๊ณ ํ์ ์คํฌ๋ฆฝํธ๊ฐ ์์์ ์ถ๋ก ํ๋๋ก ๋ด๋ฒ๋ ค ๋ฌ์ผ ํ๋ค.
# ํจ์์ ๋ฐํ ๊ฐ์์ void ์ undefined ์ ์ฐจ์ด
function test : void {
console.log('์ฑ๊ณต!');
}
function test : undefined{
console.log('์คํจ!');
}
function test: undefined{
console.log('์ฑ๊ณต!');
return;
}
- ํจ์๊ฐ ์๋ฌด๋ฐ ๊ฐ๋ ๋ฐํํ์ง ์๋๋ค๊ณ ํ ๋ void์ undefined๋ฅผ ํ์ ์ผ๋ก ์ง์ ํ ์ ์๋ค.
- ์ฐจ์ด์ ์ผ๋ก๋ void๋ ์ ๋ง ์๋ฌด๊ฒ๋ ๋ฆฌํดํ์ง ์๋๋ค๋ ๋ป์ด๊ธฐ ๋๋ฌธ์ return ๋ฌธ์ ๋ช ์ํ ํ์ ์์ง๋ง undefined๋ undefined๋ผ๋ ํ์ ์ ๋ฐํํ๋ค๋ ๋ป์ด๋ฏ๋ก ๋ช ์์ ์ผ๋ก return์ ํด์ค์ผ ํ๋ค.
# Union ๋งค๊ฐ๋ณ์ Error
function combine(input1: number | string, input2: number | string){
let result = input1 + input2; // Error!!
return result;
}
- ์์ ๊ฐ์ด ๋ ๋งค๊ฐ๋ณ์๋ฅผ number์ string์ ์ ๋์ธ ํ์ ์ผ๋ก ์ง์ ํ๊ณ + ์ฐ์ฐ์ ํ๋ ค๊ณ ํ๋ฉด Error ๊ฐ ๋ฐ์ํ๋ค.
- ํ์ ์คํฌ๋ฆฝํธ๊ฐ Union ํ์ ์ด๋ผ๋ ๊ฑด ์์๋ ๋ช ํํ ํด๋น ๊ฐ์ด Union์ ์ด๋ค ํ์ ์ธ์ง ์ ์ ์๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ๋ Error ๋ผ๊ณ ํ๋ ๋ฏ?
- ์๋์ ๊ฐ์ด ํ์ ์ ํน์ ์ง์ด์ค์ผ ํ๋ค.
function combine(input1: number | string, input2: number | string){
let result;
if (typeof input1 === "number" && typeof input2 === "number") {
result = input1 + input2;
} else {
result = input1.toString() + input2.toString();
}
return result;
}