๋ฆฌ๋์ค๋ฅผ ๋ฐฐ์ฐ๊ณ ๋์ ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ๋ฐฐ์ฐ๋ คํ๋ค
ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ์๊ณ ๋๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๋๋ฌด๋๋ฌด ๋ถํธํ๋ค๊ณ ํ๋๋ฐ ํ๋ฒ ์ฒดํํด๋ณด์ ..!
โ ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ์จ์ผํ๋ ์ด์
์๋ฌ์ ์ฌ์ ๋ฐฉ์ง๊ฐ ๊ฐ๋ฅํ๋ค
ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋ฐํ๋ฉด ๋ง์ ์ค์๋ฅผ ์ค์ผ ์ ์๋ค
function sum(a: number, b: number) {
return a + b;
}
์์ ๊ฐ์ด ํ์ ์คํฌ๋ฆฝํธ๋ก sum์ด๋ผ๋ ํจ์๋ฅผ ๋ง๋ค๊ณ
sum(10, 20); // 30
sum('10', '20'); // error
์ ์ฝ๋์ฒ๋ผ ํจ์๋ฅผ ํธ์ถํ์ ๋, ์ฒซ๋ฒ์งธ ํธ์ถ์ ํธ์ถ ์ธ์๋ก number๊ฐ ๋ค์ด๊ฐ์ ๋ ์ซ์๋ฅผ ํฉํ ๊ฐ์ ๋ฆฌํด๋ฐ์ง๋ง
๋๋ฒ์งธ ํธ์ถ์ string ํ์ ์ด ๋ค์ด๊ฐ๊ธฐ ๋๋ฌธ์ ์ค๋ฅ๊ฐ ๋๊ฒ ๋๋ค
์ด๋ฐ์๋ ์ด์ํ ์คํ๋ฅผ ๋ธ ๊ฒฝ์ฐ, ๋ค๋ฅธ ํ์ ๋ผ๋ฆฌ ๋น๊ต๋ฅผ ํ ๊ฒฝ์ฐ, null์ฒดํน์ ๋น ๋จ๋ฆฐ ๊ฒฝ์ฐ์ ๊ฐ์ ์ํฉ์๋ TypeScript๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ ์ ์๋ํฐ์์ ๋ฐ๋ก ์๋ฌ๋ฅผ ์ค์ผ ์ ์๋ค
IDE ๋ฅผ ๋์ฑ ์ ๊ทน์ ์ผ๋ก ํ์ฉ ํ ์ ์๋ค
ํ์
์คํฌ๋ฆฝํธ๋ ์๋์์ฑ ๋ฐ ํ์
์ฒดํน์ด ๋๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ ์์ฐ์ฑ์ด ์ ๋ง ๋์์ง๋ค.
ํจ์์ ์ด๋ค ํ๋ผ๋ฏธํฐ๊ฐ ๋ค์ด๊ฐ์ผ ํ๋์ง, ๋ฆฌ์กํธ ๊ฐ๋ฐํ ๋ props ์ ์ด๋ค ๊ฐ์ด ๋ค์ด๊ฐ์ผ ํ๋์ง ์ฝ๊ฒ ์ ์ ์๋ค.
๋, ๋ฆฌ๋์ค๋ฅผ ์ฌ์ฉํ ๋, ๋ฆฌ๋์ ์ฝ๋๋ฅผ ์ด์ด๋ณด์ง ์๊ณ ์ํ ๊ฐ์ฒด๊ฐ ์ด๋ค ๊ตฌ์กฐ๋ก ์ด๋ฃจ์ด ์ก๋์ง ์ ์ ์๋ค.
๐จ ํ์ ์คํฌ๋ฆฝํธ ํ๊ฒฝ์ค์
๋จผ์ ์๋ก์ด ํ์ ์คํฌ๋ฆฝํธ ํ๋ก์ ํธ๋ฅผ ์์ฑํ๋ค
$ mkdir ts-tutorial
$ cd ts-tutorial
$ yarn init -y # ๋๋ npm init -y
ํ๋ก์ ํธ๋ฅผ ์์ฑํ ์ดํ ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ๊ธ๋ก๋ฒ๋ก ์ค์นํด์ค๋ค
$ yarn global add typescript # ๋๋ npm install -g typescript
ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ค์นํ ์ดํ ํ๋ก์ ํธ์ ๋๋ ํ ๋ฆฌ์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ฉด tsconfig.json ํ์ผ์ด ์์ฑ๋๋ค.
$ tsc --init
tsconfig.json ํ์ผ์ ์๋์ ๊ฐ์ด ์ค์ ํด์ค๋ค
{
"compilerOptions": {
"module": "commonjs", // nodejs๋ฅผ ํ๋ฒํ๊ฒ ์ฌ์ฉํ๊ฒ ํ๋ฉด์ ๋ค์ํ๊ฒ์ import ๋๋ export ํ ์ ์๊ฒ ํจ
"target": "es5", // ์ด๋ค ๋ฒ์ ์ JS๋ก ์ปดํ์ผ ๋๋์ง ์ง์
"sourceMap": true,
"outDir": "./dist", // // ts -> js ๋ก ์ปดํ์ผ๋ ํ์ผ์ dist๋๋ ํ ๋ฆฌ์ ์ ์ฅ
"strict": true,
"esModuleInterop": true
},
"include": ["./src/**/*"], //ts ํ์ผ์ ๋ชจ๋ src ๋๋ ํ ๋ฆฌ์ ์๋ค๋ ๊ฒ์ ๋ช
์
"exclude": ["node_modules"]
}
ํ์ ์คํฌ๋ฆฝํธ ์ปดํ์ผ ๋ช ๋ น์ด tsc ๋ฅผ ์ฌ์ฉํ์ฌ ํ์ ์คํฌ๋ฆฝํธ ํ์ผ์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ๋ก ๋ณํํ๋ค
ํน์ ํ์ผ๋ง ์ปดํ์ผํ๋ ๋ช ๋ น์ด๋ tsc app.ts
๋ณํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ /dist ๋๋ ํฐ๋ฆฌ์ ์ฎ๊ฒจ์ง๊ฒ ๋๋ค
์์ ๊ตฌ์ฑ์ฒ๋ผ src ๋๋ ํ ๋ฆฌ์๋ tsํ์ผ์ด ์๊ณ , dist ๋๋ ํ ๋ฆฌ์๋ Js ํ์ผ์ด ๋ค์ด๊ฐ๊ฒ ๋๋ค.
๐ก ํ์ ์คํฌ๋ฆฝํธ ๊ธฐ๋ณธํ์
String
let str: string = 'hi';
์๋ฐ์คํฌ๋ฆฝํธ ๋ณ์์ ํ์ ์ด ๋ฌธ์์ด์ธ ๊ฒฝ์ฐ ์์ ๊ฐ์ด ์ ์ธํด์ ์ฌ์ฉํ๋ค.
Number
let num: number = 10;
ํ์ ์ด ์ซ์์ด๋ฉด ์์ ๊ฐ์ด ์ ์ธํ๋ค.
Boolean
let isLoggedIn: boolean = false;
ํ์ ์ด Boolean์ธ ๊ฒฝ์ฐ์๋ ์์ ๊ฐ์ด ์ ์ธํ๋ค.
Array
let arr: number[] = [1,2,3];
ํ์ ์ด ๋ฐฐ์ด์ธ ๊ฒฝ์ฐ ์์๊ฐ์ด ์ ์ธํ๋ค.
let arr: Array<number> = [1,2,3];
์์ฒ๋ผ Generic์ ์ด์ฉํ์ฌ ์ ์ธํ ์๋ ์๋ค.
Enum
enum Avengers {
Capt,
IronMan,
Thor,
}
let hero1: Avengers = Avengers.Capt;
Enum์ ํน์ ๊ฐ(์์)๋ค์ ์งํฉ์ ์๋ฏธํ๋ค.
enum Avengers {
Capt,
IronMan,
Thor,
}
let hero: Avengers = Avengers[0];
์ด๋์ ์ธ๋ฑ์ค ๋ฒํธ๋ก๋ ์ ๊ทผํ ์ ์๋ค.
Any
let strAny: any = 'hi';
let numAny: any = 10;
let arrAny: any = ['a', 2, true];
๊ธฐ์กด์ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๋ ์ฝ๋๋ฅผ ํ์ ์คํฌ๋ฆฝํธ๋ก ๋ณํํ ๋ ํ์ฉํ๋ฉด ์ข๋ค.
๋จ์ด ์๋ฏธ ๊ทธ๋๋ก ๋ชจ๋ ํ์ ์ ๋ํด์ ํ์ฉํ๋ค๋ ์๋ฏธ๋ฅผ ๊ฐ๊ณ ์๋ค.
Void
let unuseful: void = undefined;
function notuse(): void {
console.log('sth');
}
๋ณ์์๋ undefined์ null๋ง ํ ๋นํ๊ณ , ํจ์์๋ ๋ฐํ ๊ฐ์ ์ค์ ํ ์ ์๋ ํ์ ์ด๋ค
C์ธ์ด์ Void ํจ์์ ๊ฐ์ ๊ฐ๋ ์ธ ๊ฒ ๊ฐ๋ค.
Union Type
์ ๋์จ ํ์ (Union Type)์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ์ OR ์ฐ์ฐ์(||)์ ๊ฐ์ด A์ด๊ฑฐ๋ B์ด๋ค ๋ผ๋ ์๋ฏธ์ ํ์ ์ด๋ค
let name: string | undefined = undefined; // string ์ผ์๋ ์๊ณ undefined ์ผ์๋ ์์
let age: number | null = null; // number ์ผ์๋ ์๊ณ null ์ผ์๋ ์์
let color: 'red' | 'orange' | 'yellow' = 'red'; // red, orange, yellow ์ค ํ๋์
color = 'yellow';
color = 'green'; // ์๋ฌ ๋ฐ์!
์ ์ฝ๋๋ฅผ ๋ณด๋ฉด name ๋ณ์์ ๊ฐ์ String๊ฐ์ด ๋ค์ด์ฌ ์๋ ์๊ณ undefined๊ฐ ๋ค์ด ์ฌ ์๋ ์๋ค age๋ number์ผ ์๋, null์ผ ์๋ ์๋ ๊ฒ์ด๋ค
๋ณ์ color์ ๊ฒฝ์ฐ์๋ red, orange, yellow์ ๊ฐ์ค ํ๋์ ๊ฐ๋ง ๋ค์ด์ฌ ์ ์๋๋ฐ green์ด๋ผ๋ ๊ฐ์ด ๋ค์ด์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค
๐ก ํ์ ์คํฌ๋ฆฝํธ์ ํจ์
ํ์ ์คํฌ๋ฆฝํธ์ ํจ์ ์ ์ธ ๋ฐฉ๋ฒ์ ์ดํด๋ฅผ ์ํด ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋์ ๋น๊ตํด๋ณด์
//js
function sum(a, b) {
return a + b;
}
//ts
function sum(a: number, b: number): number {
return a + b;
}
๊ธฐ์กด ์๋ฐ์คํฌ๋ฆฝํธ์ ํจ์์๋ ๋ค๋ฅด๊ฒ ํ๋ผ๋ฏธํฐ์ ๋ฆฌํด๊ฐ์ ์ด๋ค ๊ฐ์ด ๋ค์ด๊ฐ์ง ๋ช ์ํด์ค๋ค.
๋ฆฌํด์ ํ์ง์๋ ํจ์๋ฅผ ์ ์ํ ๋๋ Void ๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค
ํจ์์ ์ธ์
ํ์ ์คํฌ๋ฆฝํธ์์๋ ํจ์์ ์ธ์๋ ํ์ ๊ฐ์ผ๋ก ๊ฐ์ฃผํ๋ค ์ฆ undefined๋ null์ด๋ผ๋ ์ธ์๋ก ๋๊ฒจ์ผํ๋ฉฐ
ํจ์๋ฅผ ํธ์ถํ ๋ ์ธ์๊ฐ ์ ๊ฑฐ๋ ๋ง์์๋ ์ ๋๋ค
์๋ ์ฝ๋๋ฅผ ํตํด ์ดํด๋ณด์
function sum(a: number, b: number): number {
return a + b;
}
sum(10, 20); // 30
sum(10, 20, 30); // error, too many parameters
sum(10); // error, too few parameters
์์ ์ฝ๋์ฒ๋ผ ์ฒซ๋ฒ์งธ ํธ์ถ์ ํจ์์ ์ธ์์ ๊ฐ์์ ๋ง๊ฒ ํธ์ถ ํ์ง๋ง ๋๋ฒ์งธ์ ์ธ๋ฒ์งธ๋ ํจ์์ ์ธ์ ๊ฐ์์ ๋ง์ง์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋งค๊ฐ๋ณ์์ ๊ฐฏ์๋งํผ ์ธ์๋ฅผ ๋๊ธฐ์ง ์์๋ ๋๋ JS์ ํน์ฑ์ ์ด๋ฆฌ๊ณ ์ถ๋ค๋ฉด ?๋ฅผ ์ด์ฉํ๋ฉด ๋๋ค
์๋ ์ฝ๋๋ฅผ ํตํด ์ดํด๋ณด์
function sum(a: number, b?: number): number {
return a + b;
}
sum(10, 20); // 30
sum(10, 20, 30); // error, too many parameters
sum(10); // 10
์์ ์ฝ๋์ฒ๋ผ ๋งค๊ฐ๋ณ์ b์ ?๋ฅผ ์ถ๊ฐํด์ค์ผ๋ก์จ ์ธ์์ ๊ฐ์์ ๋ง์ง ์๊ฒ ํธ์ถํด๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๋๋ค
๋จ, ๋งค๊ฐ๋ณ์์ ๊ฐ์๋ฅผ ์ด๊ณผํ ํธ์ถ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
๐ก interface
์ธํฐํ์ด์ค๋ ์ํธ ๊ฐ์ ์ ์ํ ์ฝ์ ํน์ ๊ท์น์ ์๋ฏธํ๋ค
let person = { name: 'Song', age: 26 };
function logAge(obj: { age: number }) {
console.log(obj.age); // 26
}
logAge(person); // 26
์ logAge() ํจ์์์ ๋ฐ๋ ์ธ์์ ํํ๋ age๋ฅผ ์์ฑ์ผ๋ก ๊ฐ๋ ๊ฐ์ฒด์ด๋ค.
์ด๋ ๊ฒ ์ธ์๋ฅผ ๋ฐ์ ๋ ๋จ์ํ ํ์ ๋ฟ๋ง ์๋๋ผ ๊ฐ์ฒด์ ์์ฑ ํ์ ๊น์ง ์ ์ํ ์ ์๋ค.
๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ interface๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑํ๋ ์ฝ๋๋ฅผ ์ดํด๋ณด์
interface personInfo {
name: string;
age?: number;
}
interface animalInfo {
name: string;
age?: number;
kind: string;
}
function logAge(obj: personInfo) {
console.log(obj.age);
}
let person = { name: 'Song', age: 26, job: 'frontend' };
logAge(person);
const expert: animalInfo = {
name: '๋์ด',
kind: 'dog',
};
์ ์ฝ๋๋ฅผ ๋ณด๊ณ ์ ์ ์๋ ๊ฒ์ ์ธํฐํ์ด์ค๋ฅด ์ธ์๋ก ๋ฐ์ ์ฌ์ฉํ ๋ ํญ์ ์ธํฐํ์ด์ค์ ์์ฑ ๊ฐฏ์์ ์ธ์๋ก ๋ฐ๋ ๊ฐ์ฒด์ ์์ฑ ๊ฐฏ์๋ฅผ ์ผ์น ์ํค์ง ์์๋ ๋๋ค๋ ๊ฒ์ด๋ค.
์ธํฐํ์ด์ค์ ์ ์๋ ์์ฑ๊ณผ ํ์ ๋ง ๋ง์กฑํ๋ค๋ฉด ๊ฐ์ฒด์ ์์ฑ ๊ฐฏ์๊ฐ ๋ ๋ง์๋ ์๊ด ์๋ค.
personInfo์ interface์ ์์ฑ๊ณผ animalInfo์ ์์ฑ์ ํํ๊ฐ ์ ์ฌํ๋ค. ์ด ๊ฒฝ์ฐ์๋ interface ๋ฅผ ์ ์ธ ํ ๋ ๋ค๋ฅธ interface ๋ฅผ extends ํด์ ์์๋ฐ์ ์ ์๋ค.
์๋์ ์ฝ๋๋ก ์ดํด๋ณด์
interface personInfo {
name: string;
age?: number;
}
interface animalInfo extends personInfo {
kind: string;
}
function logAge(obj: personInfo) {
console.log(obj.age);
}
let person = { name: 'Song', age: 26, job: 'frontend' };
logAge(person);
const expert: animalInfo = {
name: '๋์ด',
kind: 'dog',
};
animalInfo ์ธํฐํ์ด์ค๊ฐ personInfo ์ธํฐํ์ด์ค์ ๊ฐ์ ์์ ๋ฐ์๊ธฐ ๋๋ฌธ์ personInfo์ ์์ฑ์ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด๋ค
๐ก Generic
์ ๋ค๋ฆญ์ C#, Java ๋ฑ์ ์ธ์ด์์ ์ฌ์ฌ์ฉ์ฑ์ด ๋์ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค ๋ ์์ฃผ ํ์ฉ๋๋ ํน์ง์ด๋ค. ํนํ, ํ๊ฐ์ง ํ์ ๋ณด๋ค ์ฌ๋ฌ ๊ฐ์ง ํ์ ์์ ๋์ํ๋ ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ๋๋ฐ ์ฌ์ฉ๋๋ค.
function logText<T>(text: T): T {
return text;
}
// #1 ๊ฐ๋
์ฑ ๋ฎ์
const text = logText<string>("Hello Generic");
// #2 ๊ฐ๋
์ฑ ๋์์ ์์ฃผ ์ฌ์ฉ๋จ
const text = logText('Hello Generic');
//๋ง์ฝ ๋ณต์กํ ์ฝ๋์์ ๋ ๋ฒ์งธ ์ฝ๋๋ก ํ์
์ถ์ ์ด ๋์ง ์๋๋ค๋ฉด ์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ์ฌ์ฉ
console.log(text);
์์ ์ฝ๋๋ฅผ ๋ณด๋ฉด logText ํจ์๋ฅผ ์ ๋ค๋ฆญ์ผ๋ก ์ ์ธํ์๋๋ฐ ์ ๋ค๋ฆญ์ ์ด๋ค ํ์ ์ด ๋ค์ด์๋ ๋์์ ํ๊ฒ๋ฉ๋๋ค.
Any์ ์ ์ฌํ๋ค๊ณ ํ ์ ์๋๋ฐ Any์ ์ฐจ์ด์ ์ผ๋ก๋ Any๋ ํจ์์ ์ธ์๋ก ์ด๋ค ํ์ ์ด ๋ค์ด๊ฐ๊ณ ์ด๋ค ๊ฐ์ด ๋ฐํ ๋๋์ง ์ ์ ์์ง๋ง ์ ๋ค๋ฆญ์ ํจ์๋ฅผ ํธ์ถํ ๋ ๋๊ธด ํ์ ์ ๋ํด ํ์ ์คํฌ๋ฆฝํธ๊ฐ ์ถ์ ํ ์ ์๊ฒ ๋๋ค.
๐ก Type Alias
type์ ํน์ ํ์ ์ ๋ณ์นญ์ ๋ถ์ด๋ ์ฉ๋๋ก ์ฌ์ฉ๋๋ค. ์ด๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ์ํ ํ์ ์ ์ค์ ํ ์๋ ์๊ณ , ๋ฐฐ์ด, ๋๋ ๊ทธ ์ด๋ค ํ์ ์ด๋ ๋ณ์นญ์ ์ง์ด์ค ์ ์๋ค
์๋ ์ฝ๋๋ก ์ดํด๋ณด์
type personInfo {
name: string;
age?: number;
}
const person: personInfo = {
name: 'ํ๊ธธ๋'
};
์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ธํฐํ์ด์ค์ ์ ์ฌํ๋ ์ธํฐํ์ด์ค์ ์ฐจ์ด์ ์ ํ์ ์ ํ์ฅ ๊ฐ๋ฅ, ๋ถ๊ฐ๋ฅ ์ฌ๋ถ์ด๋ค.
์ธํฐํ์ด์ค๋ ํ์ฅ์ด ๊ฐ๋ฅํ์ง๋ง ํ์ ๋ณ์นญ์ ๋ถ๊ฐ๋ฅํ๋ค ๋ฐ๋ผ์, type ๋ณด๋ค๋ interface๋ก ์ ์ธํด์ ์ฌ์ฉํ๋๋ก ํ์
reference
์๋ฐ์คํฌ๋ฆฝํธ ํธ๋๋ถ
https://joshua1988.github.io/ts/
ํ์ ์คํฌ๋ฆฝํธ ํธ๋๋ถ
joshua1988.github.io
ํ์ ์คํฌ๋ฆฝํธ ๊ธฐ์ด ์ฐ์ต
https://velog.io/@velopert/typescript-basics
ํ์ ์คํฌ๋ฆฝํธ ๊ธฐ์ด ์ฐ์ต
์ด ํฌ์คํธ์์๋ ์ฌ๋ฌ๋ถ๋ค์ด ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ๋ฆฌ์กํธ ํ๋ก์ ํธ์์ ์ฌ์ฉํด๋ณด๊ธฐ ์ ์, ์์๋๋ฉด ์ ์ฉํ ํ์ ์คํฌ๋ฆฝํธ์ ๊ธฐ์ด ํต์ฌ์ ๋ค๋ค๋ณด๊ฒ ๋ฉ๋๋ค. ์ถํ ๋ฆฌ์กํธ๋ฅผ ์ฌ์ฉํ ๊ฒ์ด ์๋๋๋ผ ํ๋
velog.io
'TypeScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
TypeScript ์ Redux ๋ฅผ ์ด์ฉํ์ฌ Todo-List ๋ง๋ค๊ธฐ (Feat. typesafe-actions) (0) | 2021.06.28 |
---|