[TS] ํ์ ์คํฌ๋ฆฝํธ - ๊ธฐ์ด ๋ด์ฉ ์ ๋ฆฌ
ํ์ ์คํฌ๋ฆฝํธ๋?
ํ์ ์คํฌ๋ฆฝํธ๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ํ์ ์ ๋ถ์ฌํ ์ธ์ด๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์ ํ์ฅ๋ ์ธ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค. ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ๋ธ๋ผ์ฐ์ ์์ ์คํํ๋ ค๋ฉด ํ์ผ์ ํ ๋ฒ ๋ณํํด์ค์ผ ํ๋ค. ์ด ๋ณํ ๊ณผ์ ์ ์ปดํ์ผ(์ ํํ๋ ํธ๋์คํ์ผ๋ง)์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์ฐธ๊ณ ๋ก Babel์ ์๋ฐ์คํฌ๋ฆฝํธ์ ์ต์ ๋ฌธ๋ฒ์ ์ต๋ํ ๋ง์ ๋ธ๋ผ์ฐ์ ์์ ํธํํ ์ ์๋๋ก ๋ณํํด์ฃผ๋ ๋๊ตฌ๋ค.
์ ์จ์ผ ํ ๊น?
์๋ 2๊ฐ์ง ๊ด์ ์์ JS ์ฝ๋ ํ์ง๊ณผ ๊ฐ๋ฐ ์์ฐ์ฑ์ ๋์ผ ์ ์๋ค.
- ์๋ฌ ์ฌ์ ๋ฐฉ์ง
- ์ฝ๋ ๊ฐ์ด๋ ๋ฐ ์๋ ์์ฑ(์์ฐ์ฑ ํฅ์)
์๋ฌ ์ฌ์ ๋ฐฉ์ง
์๋ ๋ ์ฝ๋ ๋ชจ๋ ๋ ์ซ์์ ํฉ์ ๊ตฌํ๋ ํจ์๋ค. ์๋ ์๋ฐ์คํฌ๋ฆฝํธ, ์๋๋ ํ์ ์คํฌ๋ฆฝํธ๋ก ์์ฑํ๋ค. ํจ์ ํธ์ถ ์ ์ซ์๊ฐ ์๋ ๋ฌธ์์ด์ ๋ฃ์ผ๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ฌธ์์ด์ ๊ฒฐํฉํด์ ์ ํ ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค.
์๋๋ ๊ฐ๋จํ ์ฝ๋๋ผ์ ํท๊ฐ๋ฆฌ์ง ์์ง๋ง, ์ฝ๋์์ด ๋ง์์ง๊ณ ํฐ ํ๋ก์ ํธ์ ๊ฒฝ์ฐ ์ด๋ฐ ์ฌ์ํ ์ค๋ฅ๋ฅผ ์ฐพ๊ธฐ ์ํด ๋ง์ ์๊ฐ์ ์์์ผ ํ ์๋ ์๋ค. ๋ฐ๋ฉด ํ์ ์คํฌ๋ฆฝํธ๋ ๋ฌธ์์ด์ ๋ฃ์ผ๋ฉด ๋ช ํํ ํ์ ์๋ฌ ๋ฉ์์ง๋ฅผ ๋์ง๊ธฐ ๋๋ฌธ์ ์๋์น ์์ ์ฝ๋ ๋์์ ๋ฏธ์ฐ์ ๋ฐฉ์งํ ์ ์๋ค.
function sum(a, b) {
return a + b;
}
sum(10, 20); // 30
sum(10, '20'); // 1020
function sum(a: number, b: number) {
return a + b;
}
sum(10, 20); // 30
sum(10, '20'); // Error
์ฝ๋ ์๋ ์์ฑ
ํ์
์คํฌ๋ฆฝํธ ์ฝ๋์์ sum()
ํจ์๋ฅผ ์ด์ฉํด ๋ ์ซ์์ ํฉ์ ๊ตฌํ ๊ฒฐ๊ณผ๋ฅผ result
๋ณ์์ ๋ด๊ณ , result.
๋ฅผ ์
๋ ฅํ๋ฉด(์ฝค๋ง๊น์ง) ํด๋น ํ์
์์ ์ ๊ณตํ๋ API ๋ชฉ๋ก์ด ์๋์ผ๋ก ๋์จ๋ค.
๋ฐ๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ๋ ํ์
์ด ์ ํด์ ธ ์์ง ์๊ธฐ ๋๋ฌธ์ API ์ด๋ฆ์ ์ผ์ผ์ด ์
๋ ฅํด์ผ ํ๋ค. API ์ด๋ฆ์ ์
๋ ฅํ๋ ๊ณผ์ ์์ ์คํ์๋ฅผ ๋๋ค๋ฉด ๋ธ๋ผ์ฐ์ ๋ฅผ ์คํํ์ ๋๋ง ์ค๋ฅ๋ฅผ ํ์ธํ ์ ์์ผ๋ฏ๋ก ๋ฒ๊ฑฐ๋กญ๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํ์ ์คํฌ๋ฆฝํธ์ฒ๋ผ ์ฐ๋ ๋ฐฉ๋ฒ
JSDoc์ ์ด์ฉํ๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ํ์
์คํฌ๋ฆฝํธ์ ๋น์ทํ๊ฒ ์ฌ์ฉํ ์ ์๋ค. ์๋ /**
๋ถ๋ถ์ด JSDoc์ด๋ฉฐ ์ฌ๊ธฐ์ ํ์
์ ๋ฏธ๋ฆฌ ์ง์ ํ ์ ์๋ค.
/**
*
* @param {number} a ์ฒซ๋ฒ์งธ ์ซ์
* @param {number} b ๋๋ฒ์งธ ์ซ์
*/
function sum(a, b) {
return a + b;
}
sum
ํจ์์ ๋ง์ฐ์ค ์ปค์๋ฅผ ์ฌ๋ฆฌ๋ฉด ์น์ ํ๊ฒ ์ฒซ๋ฒ์งธ ์ซ์, ๋๋ฒ์งธ ์ซ์ ์
๋ ฅํด๋ ๊ฒ๊น์ง ๋์จ๋ค. ํ์ง๋ง ํ์
์คํฌ๋ฆฝํธ์ฒ๋ผ ํ์
์ ์ฒดํฌํ์ง ์๋๋ค(๋ฌธ์์ด์ ์
๋ ฅํด๋ ์๋ฌด๋ฐ ์๋ฌ๊ฐ ๋์ค์ง ์๋๋ค).
// @ts-check
์ฝ๋๋ฅผ ์ถ๊ฐํ๋ฉด TS์ฒ๋ผ ํ์
์ฒดํฌ๋ ๊ฐ๋ฅํ๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์์ ์ด๋ ๊ฒ ํ์
์ฒดํฌ๋ฅผ ํ ์ ์์ง๋ง ๋งค๋ฒ JSDoc์ ์ผ์ผ์ด ์์ฑํ๋ ๊ฒ์ ๋ฒ๊ฑฐ๋ก์ด ์ผ์ด๋ค. ์์ฑํ ํ์
์ import
ํด์ ์ฌํ์ฉํ ์๋ ์๋ค. ํ์
์คํฌ๋ฆฝํธ๋ฅผ ์ด์ฉํ๋ฉด ์ด๋ฐ ๋ฒ๊ฑฐ๋ก์์ ํด๊ฒฐํ ์ ์๋ค.
ํ์
ํ์ ์คํฌ๋ฆฝํธ ๊ธฐ๋ณธ ํ์ 12๊ฐ์ง. ๋ฌธ์์ด, ๋ทธ๋ฐ, ๋๋ฒ ๊ฐ์ ์์ํ์ ์ ๋๋ถ๋ถ ํ์ ์คํฌ๋ฆฝํธ๊ฐ ์๋์ผ๋ก ์ถ๋ก ํด์ฃผ๋ฏ๋ก ์ค๋ฌด์์ ํ์ ์ ๋ช ์ํ์ง ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
BOOLEAN
NUMBER
STRING
OBJECT
ARRAY
TUPLE
: ๋ฐฐ์ด ๊ธธ์ด๊ฐ ๊ณ ์ ๋์ด ์๊ณ , ๊ฐ ์์์ ํ์ ์ด ์ง์ ๋์ด ์๋ ๋ฐฐ์ด ํ์ENUM
: ํน์ ๊ฐ(์์)๋ค์ ์งํฉ(์๋ฐ์คํฌ๋ฆฝํธ์ ์์)ANY
: ๋ชจ๋ ํ์ ํ์ฉ(JS → TS ์ ์ง์ ์ผ๋ก ์ ์ฉํ ๋ ํ์ฉํ๋ฉด ์ข์)VOID
: ๋ณ์์๋undefined
null
๋ง ํ ๋นํ๊ณ ํจ์์๋ ๋ฐํ๊ฐ์ ์ค์ ํ ์ ์๋ ํ์ . ๋ฐํ๊ฐ์ด ์๋ค๊ณ ๋ช ์์ ์ผ๋ก ์ง์ ํด์ฃผ๋ ๊ฒ. ํจ์์์ ๋ฆฌํด ๊ฐ์ด ์์ ๋ ์ฌ์ฉํ๋ค.NULL
UNDEFINED
NEVER
: ์ด๋ค ํ์ ๊ณผ๋ ํธํํ์ง ์๋ ํ์ . ๋ ผ๋ฆฌ์ ์ผ๋ก ๋๊น์ง ์คํํ ์ ์๋ ํจ์์ ๋ฐํ๊ฐ์never
ํ์ ์ด ๋๋ค.if
๋ฌธ ๋ฑ์ผ๋ก ๊ฒฝ์ฐ์ ์๊ฐ ์ขํ์ง ๋ณ์๋never
ํ์ ์ด ๋ ์๋ ์๋ค. ๋ช ์์ ์ผ๋ก ๋น ๋ฐฐ์ด์ ํ์ ์ผ๋ก ์ง์ ํ๊ณ ์ถ์ ๋never[]
๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
UNKNOWN ํ์
unknown
ํ์
์ any
์ฒ๋ผ ๋ชจ๋ ํ์
์ ๋ฐ์ ์ ์์ง๋ง, ํ์
์ ์ขํ์ ์ฌ์ฉํด์ผ ํ๋ ์๋ฌด๊ฐ ์๋ ์ ์ด any
์ ๋ค๋ฅด๋ค. ๋๋ฌธ์ ํ์
๋จ์ธ์ด๋ ํ์
๊ฐ๋๋ฅผ ์ฌ์ฉํ์ฌ ํ์
์ ์ขํ์ค์ผ ํ๋ค. — ์ฐธ๊ณ ๋งํฌ
unknown
ํ์
์ผ๋ก ์ ์ธํ ๋ณ์๋ ๋ค๋ฅธ ํ์
์ผ๋ก ์ ์ธํ ๋ณ์์ ํ ๋น๋ ์ ์๋ค(any
๋ ๊ฐ๋ฅ).
let sayHello: unknown;
sayHello = 'Hello World';
const sayHi: string = sayHello; // 'unknown' ํ์์ 'string' ํ์์ ํ ๋นํ ์ ์์ต๋๋ค.ts(2322)
const sayHi: string = sayHello as string; // string์ผ๋ก ํ์
๋จ์ธํด์ ํ ๋น ๊ฐ๋ฅ
const sayHi: any = sayHello; // any ํ์
์ด๋ผ์ ํ ๋น ๊ฐ๋ฅ
const printConsole = (params: string) => {
console.log(params);
};
printConsole(hello); // 'unknown' ํ์์ ์ธ์๋ 'string' ํ์์ ๋งค๊ฐ ๋ณ์์ ํ ๋น๋ ์ ์์ต๋๋ค.ts(2345)
printConsole(hello as string); // 'Hello World'
unknown
ํ์
์ผ๋ก ์ ์ธํ ๋ณ์๋ ํ๋กํผํฐ์ ์ ๊ทผํ ์ ์๋ค. ์ธ์คํด์ค ์ญ์ ์์ฑํ ์ ์๋ค.
const fkj: unknown = {
title: 'Before Chill',
genre: 'Jazz Hiphop',
};
fkj.title // ๊ฐ์ฒด๊ฐ '์ ์ ์๋' ํ์์
๋๋ค.ts(2571)
const abc: unknown = ['a', 'b', 'c'];
abc[0] // ๊ฐ์ฒด๊ฐ '์ ์ ์๋' ํ์์
๋๋ค.ts(2571)
const abc: unknown = () => {
console.log('hello');
};
abc();// ๊ฐ์ฒด๊ฐ '์ ์ ์๋' ํ์์
๋๋ค.ts(2571)
๐ก ๊ธฐ์กด ํ์ ์ ๋ฌด์ํ๊ณ , ๊ฐ์ ๋ก ๋ค๋ฅธ ํ์ ์ ์ง์ ํด์ผ ํ ๋(ํ์ ์บ์คํ ) `unknown`์ ์ฌ์ฉํ ์ ์๋ค.
... as unknown as ์ํ๋ํ์
๋ฌธ์์ด / ์ซ์ / ๋ฐฐ์ด
๐ก `:` ๋ฅผ ์ด์ฉํด ํ์ ์ ์ ์ ํ๋ ๋ฐฉ์์ Type Annotation์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. ํ์ ์ ์ ์ํ์ง ์์ ์ฝ๋์ ํ์ ์ ์ ํ์ฃผ๋ ํ์๋ฅผ ํ์ดํ(typing)์ด๋ผ๊ณ ํ๋ค.
// ๋ฌธ์์ด, ์ซ์ ์ ์
const str: string = 'hello'; // ๋ฌธ์์ด ํ์
์ ์
const num: number = 10; // ๋๋ฒ ํ์
์ ์
// ๋ฐฐ์ด ํ์
์ ์ ๋ฐฉ๋ฒ1 (Array๋ ๋๋ฌธ์๋ก ์ ์ด์ผ๋๋ ์ ์ฃผ์)
const arr: Array<number> = [1, 2, 3]; // ๋๋ฒ๋ง ๊ฐ๋ฅ
const heroes: Array<string> = ['Capt', 'Thor', 'Hulk']; // ๋ฌธ์์ด๋ง ๊ฐ๋ฅ
// ๋ฐฐ์ด ํ์
์ ์ ๋ฐฉ๋ฒ2
const items: number[] = [1, 2, 3];
- String / Nuber ํ์
์ ์ ๋ฐฉ๋ฒ :
const ๋ณ์๋ช : ํ์ ๋ช = 'value'
- Array ํ์
์ ์ ๋ฐฉ๋ฒ 2๊ฐ์ง —
Array
๋string
number
์ ๋ค๋ฅด๊ฒ ๋๋ฌธ์๋ก ์ ์ด์ผ ๋๋ ์ ์ฃผ์- ๊ธฐ๋ณธ(์ ๋ค๋ฆญ) :
const ๋ณ์๋ช : Array<ํ์ ๋ช > = [...]
- ์ถ์ฝ :
const ๋ณ์๋ช : ํ์ ๋ช [] = [...]
- ๊ธฐ๋ณธ(์ ๋ค๋ฆญ) :
ํํ / ๊ฐ์ฒด / ๋ทธ๋ฐ
// TS ํํ(๋ฐฐ์ด์ ํน์ ์ธ๋ฑ์ค๊น์ง ํ์
์ง์ )
const address: [string, number] = ['gangnam', 100];
// ๊ฐ์ฒด ํ์
์ ์ ๋ฐฉ๋ฒ1 (ESLint ๋น์ถ์ฒ)
const person: object = {
name: 'John',
age: 100,
};
// ๊ฐ์ฒด ํ์
์ ์ ๋ฐฉ๋ฒ2 (ESLint ์ถ์ฒ)
const person: Record<string, unknown> = {
name: 'John',
age: 100,
};
// ๊ฐ์ฒด ๊ฐ ์์ฑ์ ๋ํ ํ์
๋ณ๋ ์ง์
const person: { name: string; age: number } = {
name: 'John', // name ์์ฑ์ string๋ง ๊ฐ๋ฅ
age: 100, // age ์์ฑ์ number๋ง ๊ฐ๋ฅ
};
// ๋ทธ๋ฐ ํ์
์ ์
const show: boolean = true;
- Tuple ํ์
์ ์ ๋ฐฉ๋ฒ — Tuple์ ๋ฐฐ์ด ๊ธธ์ด๊ฐ ๊ณ ์ ๋์ด ์๊ณ , ๊ฐ ์์์ ํ์
์ด ์ง์ ๋ ๋ฐฐ์ด ํ์
const ๋ณ์๋ช : [ํ์ , ํ์ ] = [...]
const RGB: [red: number, green: number, blue: number] = [255, 0, 0]
- Object ํ์
์ ์ ๋ฐฉ๋ฒ 3๊ฐ์ง โญ๏ธ
- ๊ธฐ๋ณธ:
const ๋ณ์๋ช : object = {...}
- ESLint ์ถ์ฒ ๋ฐฉ๋ฒ:
const ๋ณ์๋ช : Record<string, unknown> = {...}
value ๋ถ๋ถ์ ์ด๋ค ํ์ ์ด ์ฌ์ง ๋ชจ๋ฅธ๋ค๋ฉดunknown
, ์๊ณ ์๋ค๋ฉด ํด๋นํ๋ type ๋ช ์ - ๊ฐ์ฒด ๊ฐ ์์ฑ์ ๋ํ ํ์
์ง์ :
const ๋ณ์๋ช : { key: ํ์ } = {...}
- ๊ธฐ๋ณธ:
- Boolean ํ์
์ ์ :
const ๋ณ์๋ช : boolean = true ํน์ false
ํจ์ ๊ธฐ๋ณธ
๐ก ํจ์ ๋ฐํ๊ฐ์ ํ์ ์ ์ง์ ํ์ง ์์ ๋๋ `void` ๋ผ๋ ์ฌ์ฉํ๋ค
function sum(a: number, b: number): number {
return a + b;
}
- ํจ์ ํ๋ผ๋ฏธํฐ ํ์
์ง์ :
function sum(์ธ์: ์ธ์ํ์ ) {...}
- ํจ์ ๋ฐํ๊ฐ ํ์
์ง์ :
function sum(์ธ์: ์ธ์ํ์ ): ๋ฐํํ์ {...}
ํ์
์คํฌ๋ฆฝํธ์์ ํจ์์ ์ธ์๋ฅผ ๋ชจ๋ ํ์ ๊ฐ์ผ๋ก ๊ฐ์ฃผํ๋ค. ๋ฐ๋ผ์ ํจ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ค์ ํ๋ค๋ฉด undefined
๋ null
์ด๋ผ๋ ์ธ์๋ก ๋๊ฒจ์ผ ํ๋ค.
๋ง์ฝ ํจ์ ํ๋ผ๋ฏธํฐ๋ฅผ 2๊ฐ๋ก ์ง์ ํ์ง๋ง ํจ์ ํธ์ถ์ ์ธ์๋ฅผ 3๊ฐ ์ด์์ ๋ฃ์ผ๋ฉด ์๋์ฒ๋ผ ts(2554)
์๋ฌ ๋ฉ์์ง๊ฐ ๋์จ๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ด ์ํฉ์์ ์๋ฌด๋ฐ ์๋ฌ ๋ฉ์์ง๋ฅผ ๋ฟ์ง ์๋๋ค. ํ์
์คํฌ๋ฆฝํธ์์ VSCode๊ฐ ํจ์์ ์คํ์ ์ ํํ ์ดํดํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ ์๊ฒฉํ๊ฒ ์ฒดํฌํ๋ ๊ฒ.
ํจ์์ ์ ํ์ ํ๋ผ๋ฏธํฐ
์ ์ํ ํจ์ ํ๋ผ๋ฏธํฐ๊ฐ ๋ชจ๋ ํ์ํ ๋๋ ์๊ณ ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ๋ ์๋ค. ์๋์ฒ๋ผ ?
๋ฌผ์ํ๋ฅผ ์ด์ฉํ๋ฉด ์ ํ์ ํ๋ผ๋ฏธํฐ๋ก ๋ผ์ ์ ์ํ ๋งค๊ฐ๋ณ์ ๊ฐ์๋งํผ ์ธ์๋ฅผ ๋๊ธฐ์ง ์์๋ ๋๋ค(?
์ธ์๋ ๋ฃ์ด๋ ๋๊ณ ์๋ฃ์ด๋ ๋๋ค).
// ํจ์์ ์ต์
๋(์ ํ์ ) ํ๋ผ๋ฏธํฐ
function log(a: number, b?: number): number {
return b ? a + b : a;
}
log(10); // 10
log(10, 20); // 30
์๋์ฒ๋ผ ํ๋ผ๋ฏธํฐ์ Partial<์ธํฐํ์ด์ค_์ด๋ฆ>
ํ์์ผ๋ก ์์ฑํ๋ฉด ?
๋ฌผ์ํ๋ฅผ ๋ถ์ด๋ ๊ฒ๊ณผ ๋์ผํ๊ฒ ํด๋น ์ธํฐํ์ด์ค ์์ฑ ์ค ์ผ๋ถ๋ง ํ๋ผ๋ฏธํฐ๋ก ๋ฐ๋๋ค๋ ๋ป.
// User ํ์
interface User {
email: string;
id: number;
}
function updateMe(user: Partial<User>): AxiosPromise<{ data: User }> {
return axios.patch('/me', { ...user });
}
ํจ์ ๋งค๊ฐ๋ณ์ ์ด๊ธฐํ
๋งค๊ฐ๋ณ์ ์ด๊ธฐํ๋ ES6 ๋ฌธ๋ฒ๊ณผ ๋์ผํ๊ฒ function log(a = 'Hello') {...}
ํ์์ผ๋ก ์
๋ ฅํ๋ฉด ๋๋ค.
// ๋งค๊ฐ๋ณ์ ์ด๊ธฐํ
function log(a = 'Hello', b?: string): string {
return `${a} ${b}`;
}
log(undefined, 'World'); // Hello World
REST ๋ฌธ๋ฒ์ด ์ ์ฉ๋ ๋งค๊ฐ๋ณ์
ํ์
์คํฌ๋ฆฝํธ์์ ES6์ REST ๋ฌธ๋ฒ์ ์๋์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ค. REST ๋ฌธ๋ฒ์ ์ฌ์ฉํ๊ณ ์ถ์ ํ๋ผ๋ฏธํฐ์ ...์ธ์์ด๋ฆ: ํ์
๋ช
[]
ํ์์ผ๋ก ์
๋ ฅํ๋ฉด ๋๋ค.
// Rest ๋ฌธ๋ฒ ์ ์ฉ
function sum(a: number, ...nums: number[]): number {
console.log(nums); // [2, 3, 4]
const totalOfNums = nums.reduce((acc, cur) => acc + cur, 0);
return a + totalOfNums;
}
sum(1, 2, 3, 4); // 10
this์ ์ฝ๋ฐฑ
ํ์
์คํฌ๋ฆฝํธ์์ this
์ ํ์
์ ๋ช
์ํ๋ ค๋ฉด ์๋์ฒ๋ผ ์
๋ ฅํ๋ฉด ๋๋ค.
function ํจ์๋ช
(this: ํ์
) {
// ์๋ต
}
์ผ๋ฐ this
์ฌ์ฉ๊ณผ๋ ๋ค๋ฅด๊ฒ ์ฝ๋ฐฑ์ผ๋ก ํจ์๋ฅผ ์ ๋ฌํ์ ๋ this
๋ฅผ ๊ตฌ๋ถํด์ค์ผ ํ๋ค. ์๋์ฒ๋ผ ๊ฐ์ ํ ์ ์๋ค.
interface UIElement {
// ์๋ ํจ์์ `this: void` ์ฝ๋๋ ํจ์์ `this` ํ์
์ ์ ์ธํ ํ์๊ฐ ์๋ค๋ ์๋ฏธ.
addClickListener(onclick: (this: void, e: Event) => void): void;
}
class Handler {
info: string;
onClick(this: Handler, e: Event) {
// `UIElement` ์ธํฐํ์ด์ค ์คํ์ `this`๊ฐ ํ์์๋ค๊ณ ํ์ง๋ง ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์๋ฌ ๋ฐ์.
this.info = e.message;
}
}
const handler = new Handler();
uiElement.addClickListener(handler.onClick); // error!
UIElement ์ธํฐํ์ด์ค ์คํ์ ๋ง์ถฐ Handler๋ฅผ ๊ตฌํํ๋ ค๋ฉด ์๋์ฒ๋ผ ๋ณ๊ฒฝํด์ค๋ค.
class Handler {
info: string;
onClick(this: void, e: Event) {
// `this` ํ์
์ด void์ด๋ฏ๋ก ์ฌ๊ธฐ์ `this`๋ฅผ ์ฌ์ฉํ ์ ์๋ค
console.log('clicked!');
}
}
const handler = new Handler();
uiElement.addClickListener(handler.onClick);
ts(2330) ์๋ฌ
์๋ ์ฝ๋์์ todo
ํ๋ผ๋ฏธํฐ์ ํ์
์ object
๋ก ๋ช
์ํ๋ค. ํ์ง๋ง todo.done
์์ done
์์ฑ์ ์ฐพ์ ์ ์๋ค๋ ts(2330)
์๋ฌ๊ฐ ๋ฐ์ํ๋ค. ๋ช
์ํ object
ํ์
์์ ์ด๋ค ์์ฑ์ด ์๋์ง VSCode๋ ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ ๋ฟ๋ ์๋ฌ๋ค.
function completeTodo(index: number, todo: object): void {
todo.done = true; // ts(2330) ์๋ฌ!
}
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ todo
ํ๋ผ๋ฏธํฐ ๊ฐ์ฒด ํ์
์ ์ด๋ค ์์ฑ์ ํฌํจํ๋์ง ๊ตฌ์ฒด์ ์ผ๋ก ๋ช
์ํด์ฃผ๋ฉด ๋๋ค.
function completeTodo(
index: number,
todo: {
id: number;
title: string;
done: boolean;
},
): void {
todo.done = true;
}
์์์ ์ ์ํ ํ์
์ ์์ผ๋ก๋ ์ฌ์ฌ์ฉํด์ผ ํ๋ค๋ฉด ๋งค๋ฒ ๊ตฌ์ฒด์ ์ธ ๊ฐ์ฒด ์์ฑ์ ๋ช
์ํ๊ธฐ ๋ฒ๊ฑฐ๋กญ๊ธฐ ๋๋ฌธ์ type
ํน์ interface
๋ก ํ์
์ ๋ฏธ๋ฆฌ ์ ์ํ ํ ๋ณ์๋ช
์ผ๋ก ์ฌ์ฌ์ฉํ ์ ์๋ค.
interface Todo {
id: number;
title: string;
done: boolean;
}
function completeTodo(index: number, todo: Todo): void {
todo.done = true;
}
์ธํฐํ์ด์ค
์ธํฐํ์ด์ค๋ ์ํธ ๊ฐ ์ ์ํ ์ฝ์ ํน์ ๊ท์น์ ์๋ฏธํ๋ค. ํ์ ์คํฌ๋ฆฝํธ์์ ์ธํฐํ์ด์ค๋ ๋ณดํต ๋ค์๊ณผ ๊ฐ์ ๋ฒ์ฃผ์ ๋ํด ์ฝ์์ ์ ์ํ ์ ์๋ค.
- ๊ฐ์ฒด์ ์คํ(์์ฑ๊ณผ ์์ฑ์ ํ์ )
- ํจ์์ ํ๋ผ๋ฏธํฐ
- ํจ์์ ์คํ(ํ๋ผ๋ฏธํฐ, ๋ฐํ ํ์ ๋ฑ)
- ๋ฐฐ์ด๊ณผ ๊ฐ์ฒด๋ฅผ ์ ๊ทผํ๋ ๋ฐฉ์
- ํด๋์ค
๊ธฐ๋ณธ ์ฌ์ฉ ๋ฐฉ๋ฒ
์ธํฐํ์ด์ค์์ ์ ์ํ ์์ฑ์ ๋ชจ๋ ์ ์ง ์์ผ๋ฉด ์๋ฌ๊ฐ ๋๋ค. ๋ฐ๋๋ก ์ธํฐํ์ด์ค์ ์ ์๋ ์์ฑ, ํ์ ์กฐ๊ฑด๋ง ๋ง์กฑํ๋ค๋ฉด ํ๋ผ๋ฏธํฐ์ ๋๊ธฐ๋ ์์ฑ ๊ฐฏ์๊ฐ ๋ ๋ง์๋ ์๊ด์๋ค.
interface User {
age: number;
name: string;
}
// ๋ณ์์ ์ธํฐํ์ด์ค ํ์ฉ
const smith: User = {
age: 33,
name: 'smith',
};
// ํจ์์ ์ธํฐํ์ด์ค ํ์ฉ
function getUser(user: User): User {
return user;
}
getUser({
age: 28,
name: 'John', // ์ธํฐํ์ด์ค์์ ์ ์ํ ์์ฑ์ ๋ค ์ ์ง ์์ผ๋ฉด ์๋ฌ๊ฐ ๋๋ค
});
// User ์ธํฐํ์ด์ค์ ๊ฐ์ฒด๋ฅผ ์์๋ก ๊ฐ๋ users ๋ฐฐ์ด ์ ์ธ
const users: User[]; // [{...}, {...}]
ํจ์ ์ธ์๋ฅผ ์ ์ํ๋ ์ธํฐํ์ด์ค
์๋์ ๊ฐ์ ํจ์ ์ฝ๋์ ์ธํฐํ์ด์ค๋ฅผ ์ ์ฉํ๋ฉด...
let Capt = { name: 'Capt', age: 28 };
function logAge(obj: { age: number }) {
console.log(obj.age); // 28
}
logAge(Capt);
์๋์ฒ๋ผ ๋๋ค. logAge()
์ธ์๊ฐ ์ข ๋ ๋ช
์์ ์ผ๋ก ๋ฐ๋์๋ค. logAge()
ํจ์์ ์ธ์๋ PersonAge
์์ ์ ์ํ ํ์
์์ฑ์ ๊ฐ์ ธ์ผ ํ๋ค. ์ธํฐํ์ด์ค์์ name
์์ฑ์ ์ ์ํ์ง ์์์ผ๋ฏ๋ก obj.name
์ฝ์๋ก๊ทธ๋ ts(2339)
์๋ฌ๋ฅผ ์ถ๋ ฅํ๋ค.
// ์ธํฐํ์ด์ค ์ด๋ฆ์ ๋ณดํต PascalCase ์ง์ ํ๋ค
interface PersonAge {
age: number;
}
function logAge(obj: PersonAge): void {
console.log(obj.age); // 28
console.log(obj.name); // ts(2339) ์๋ฌ!
}
const Capt = { name: 'Capt', age: 28 };
logAge(Capt);
- ์ธํฐํ์ด์ค๋ฅผ ์ธ์๋ก ๋ฐ์ ์ฌ์ฉํ ๋ ํญ์ ์ธํฐํ์ด์ค์์ ์ ์ํ ์์ฑ ๊ฐฏ์์, ๊ทธ ์ธํฐํ์ด์ค๋ฅผ ์ธ์๋ก ๋ฐ๋ ๊ฐ์ฒด์ ์์ฑ ๊ฐฏ์๋ฅผ ์ผ์น์ํค์ง ์์๋ ๋๋ค.
- ์ธํฐํ์ด์ค์ ์ ์๋ ์์ฑ, ํ์ ์กฐ๊ฑด๋ง ๋ง์กฑํ๋ฉด ๊ฐ์ฒด์ ์์ฑ ๊ฐฏ์๊ฐ ๋ ๋ง์๋ ์๊ด์๋ค.
- ์ธํฐํ์ด์ค์ ์ ์ธ๋ ์์ฑ ์์๋ฅผ ์งํค์ง ์์๋ ๋๋ค.
ํจ์์ ๊ตฌ์กฐ๋ฅผ ์ ์ํ๋ ์ธํฐํ์ด์ค
์๋๋ ํจ์์ ํ๋ผ๋ฏธํฐ, ๋ฐํ ํ์ ๋ฑ์ ์ ์ํ๋ ์ธํฐํ์ด์ค ์์. ํ ํ๋ก์ ํธ ๋ฑ์์ ํจ์์ ๊ท์น์ ๋ฏธ๋ฆฌ ์ก์๋๊ณ ์งํํ ๋ ์ ์ฉํ๋ค.
// ํจ์์ ์คํ(๊ตฌ์กฐ)์ ์ธํฐํ์ด์ค ํ์ฉ
interface SumFunction {
(a: number, b: number): number; // ํจ์ ์ธ์ ๋ฐ ๋ฐํ๊ฐ ์ ์
}
const sums: SumFunction = (a, b) => {
return a + b;
};
sums(10, 20); // 30
์ธ๋ฑ์ฑ ๋ฐฉ์์ ์ ์ํ๋ ์ธํฐํ์ด์ค
์๋ ์ฝ๋์์ ๋ฐฐ์ด์ index
๋ ํญ์ ์ซ์์ด๊ณ ๋ฐฐ์ด ์์์ ํ์
์ string
์ด๋ผ๊ณ ์ธํฐํ์ด์ค์ ์ ์ํ๋ค. ๋ฐ๋ผ์ ๋ฐฐ์ด์ ๋ฌธ์์ด ์์๋ง ์ฌ ์ ์๊ณ ์ธ๋ฑ์ฑ ๋ฐฉ์์ ์ซ์๋ฅผ ์ฌ์ฉํ๋ค. array[0] = 10
๊ฐ์ด ์ธํฐํ์ด์ค์ ์ ์ํ์ง ์์ ํ์
์ ํ ๋น ํ ๊ฒฝ์ฐ ts(2332)
์๋ฌ๊ฐ ๋๋ค.
interface StringArray {
// ๋ฐฐ์ด์ index๋ ํญ์ ์ซ์์ด๊ณ ์์ ํ์
์ string์ด๋ผ๊ณ ์ ์
[index: number]: string;
}
const array: StringArray = ['a', 'b', 'c'];
array[0] = 10; // ts(2332) error
์ธํฐํ์ด์ค ๋์ ๋๋ฆฌ ํจํด
๊ฐ์ฒด์ key
๋ ๋ฌธ์์ด, value
๋ ์ ๊ท์์ผ๋ก ์ธํฐํ์ด์ค์ ์ ์ํ๋ค. ๋ง์ฝ ๊ฐ์ฒด ์ธ๋ฑ์ค์ ์ ๊ท์์ด ์๋ ๋ฌธ์์ด๋ก ์ ๊ทผํ๋ค๋ฉด ์ธํฐํ์ด์ค ๊ท์น์ ์ด๊ธ๋๋ฏ๋ก ts(2322)
์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
// ๋์
๋๋ฆฌ ํจํด
interface StringRegexDictionary {
// key๋ ๋ฌธ์์ด, value๋ ์ ๊ท์์ผ๋ก ์ ์
[key: string]: RegExp;
}
const obj: StringRegexDictionary = {
cssFile: /\.css$/, // CSSํ์ผ๋ก ๋๋๋ ํ์ฅ์
jsFile: /\.js$/, // JSํ์ผ๋ก ๋๋๋ ํ์ฅ์
jsonFile: '.json', // ts(2322) error!
};
obj['cssFile'] = 'a'; // ts(2322) error!
Object.keys(obj).forEach(function (value) {
/* ... */
});
๋์
๋๋ฆฌ ํจํด์ ์ํด obj
๋ฅผ ์กฐ์ํ ๋ ํ์
์คํฌ๋ฆฝํธ๊ฐ ํ์
๊น์ง ์๋์ผ๋ก ์ถ๋ก ํด์ ์ ์ํด์ค๋ค.
์ธํฐํ์ด์ค ํ์ฅ
OOP์ ์์, ์๋ฐ์คํฌ๋ฆฝํธ์ ํ๋กํ ํ์ ์ฒ๋ผ ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์ ๊ธฐ์กด ์์ฑ์ ํ์ฅํด์ ์ธ ์ ์๋ค. ๋ค๋ฅธ ์ธํฐํ์ด์ค๊ฐ ์ค๋ณต๋ ์์ฑ์ ๊ฐ์ง๊ณ ์๋ค๋ฉด, ํด๋น ์ธํฐํ์ด์ค์ ์์ฑ๊ณผ ํ์ ์ ํ์ฅ๋ฐ์ ์ฌ์ฉํ๋ฉด ๋๋ค. ์ธํฐํ์ด์ค๋ฅผ ํ์ฅ๋ฐ์๋ค๋ฉด, ํ์ฅ ๋ฐ์ ์ธํฐํ์ด์ค์ ํ์ ๊น์ง ๋ชจ๋ ์ ์ํด์ค์ผ ํ๋ค.
interface Person {
name: string;
age: number;
}
// Person ์ธํฐํ์ด์ค๋ฅผ Developer๋ก ํ์ฅ
interface Developer extends Person {
language: string;
}
// Person ์ธํฐํ์ด์ค๋ฅผ ํ์ฅ ๋ฐ์๊ธฐ ๋๋ฌธ์ Person์ ์๋ ํ์
๊น์ง ๋ชจ๋ ์ ์ํ๋ค
const john: Developer = {
language: 'ts',
age: 32,
name: 'john',
};
๊ธฐํ ์ธํฐํ์ด์ค ํน์ง
์ต์
์์ฑ : ์์ฑ ๋์ ?
๋ฌผ์ํ๋ฅผ ๋ถ์ด๋ฉด ํด๋น ์์ฑ์ ์ ํ์ ์ผ๋ก ์ ์ฉํ ์ ์๋ค. ์ธํฐํ์ด์ค์ ์ ์๋ ์์ฑ์ ๋ชจ๋ ์ฌ์ฉํ์ง ์์ ๋ ์ ์ฉํ๋ค. ์ธํฐํ์ด์ค์ ์ ์ํ์ง ์์ ์์ฑ์ ์ธ์ง์ํฌ ์ ์๋ค๋ ์ฅ์ ๋ ์๋ค.
interface ์ธํฐํ์ด์ค_์ด๋ฆ {
name: string;
age?: number;
}
์ฝ๊ธฐ ์ ์ฉ ์์ฑ : ์ธํฐํ์ด์ค๋ก ๊ฐ์ฒด๋ฅผ ์ฒ์ ์ฒ์ ์์ฑํ ๋๋ง ๊ฐ์ ํ ๋นํ๊ณ , ๊ทธ ์ดํ์ ๋ณ๊ฒฝํ ์ ์๋ ์์ฑ. readonly
์์ฑ์ ์์ ๋ถ์ด๋ฉด ์ฝ๊ธฐ ์ ์ฉ ์์ฑ์ด ๋๋ค.
interface RedWine {
readonly brand: string;
}
const myWine: RedWine = {
brand: 'Bordeaux'
};
myWine.brand = 'Korean Wine'; // error!
์ฝ๊ธฐ ์ ์ฉ ๋ฐฐ์ด : ๋ฐฐ์ด ์ ์ธ ์ ReadonlyArray<ํ์
๋ช
>
์ ์ฌ์ฉํ๋ฉด ์ฝ๊ธฐ ์ ์ฉ ๋ฐฐ์ด์ ์์ฑํ ์ ์๋ค. ์ ์ธํ๋ ์์ ์๋ง ๊ฐ์ ์ ์ํ ์ ์์ผ๋ ์ฃผ์ํ์.
const arr: ReadonlyArray<number> = [1, 2, 3];
arr.slice(0, 1); // error
arr.push(4); // error
๊ฐ์ฒด ์ ์ธ๊ณผ ํ์
์ฒดํน : ์ธํฐํ์ด์ค๋ฅผ ์ด์ฉํด ๊ฐ์ฒด๋ฅผ ์ ์ธํ ๋ ๋ ์๊ฒฉํ ์์ฑ ๊ฒ์ฌ๋ฅผ ์งํํ๋ค. ์๋ ์ฝ๋ RedWine
์ธํฐํ์ด์ค์์ brand
๋ผ๊ณ ์ ์ธํ์ง๋ง whiteWine()
ํจ์์ ์ธ์๋ก ๋๊ธฐ๋ ๊ฐ์ฒด ์์ฑ์ brandon
์ผ๋ก ์ ์ธํด์ ์คํ์ ์ ๊ฒ ์ค๋ฅ๊ฐ ๋๋ค.
interface RedWine {
brand?: string;
}
function whiteWine(wine: RedWine): void {
console.log(wine);
}
whiteWine({ brandon: "Syrah" }); // ts(2345) error!
์ด๋ฐ ํ์
์ถ๋ก ์ ๋ฌด์ํ๊ณ ์ถ์ผ๋ฉด as
ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
const myWine = { brandon: 'Syrah'};
whiteWine(myWine as RedWine);
๋ง์ฝ ์ธํฐํ์ด์ค์ ์ ์ํ์ง ์์ ์์ฑ์ ์ถ๊ฐ๋ก ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด, [propName: string]: any;
์ฝ๋๋ฅผ ์ธํฐํ์ด์ค์ ์ถ๊ฐํ๋ฉด ๋๋ค.
interface RedWine {
brand?: string;
// key(propName)์ ํ์
์ string์ด๊ณ value ํ์
์ any
// [key: string]: any -> ์ด๋ ๊ฒ๋ ๊ฐ๋ฅ
[propName: string]: any;
}
ํ์ ๋ณ์นญ
ํ์ ๋ณ์นญ์ ํน์ ํ์ ์ด๋ ์ธํฐํ์ด์ค๋ฅผ ์ฐธ์กฐํ ์ ์๋ ํ์ ๋ณ์๋ฅผ ์๋ฏธํ๋ค.
// ์ผ๋ฐ string ํ์
์ ์ฌ์ฉํ ๋
const name: string = 'John';
// ํ์
๋ณ์นญ์ ์ฌ์ฉํ ๋
type MyName = string;
const name: MyName = 'John';
interface
๋ ๋ฒจ์ ๋ณต์กํ ํ์
์๋ ๋ณ์นญ์ ๋ถ์ฌํ ์ ์๋ค.
type Developer = {
name: string;
skill: string;
};
const john: Developer = {
name: 'john',
skill: 'JS',
};
ํ์ ๋ณ์นญ์ ์๋์ฒ๋ผ ์ ๋ค๋ฆญ์ ์ฌ์ฉํ ์๋ ์๋ค.
type User<T> = {
name: T;
};
const john: User<string> = {
name: 'John',
};
ํ์ ๋ณ์นญ ํน์ง
ํ์
๋ณ์นญ์ ์๋ก์ด ํ์
๊ฐ์ ์์ฑํ๋ ๊ฒ์ด ์๋, ์ ์ํ ํ์
์ ๋์ค์ ์ฐธ๊ณ ํ ์ ์๊ฒ ์ด๋ฆ์ ๋ถ์ฌํ๋ ๊ฒ๊ณผ ๊ฐ๋ค. cmd
๋ฅผ ๋๋ฅด๊ณ ํ์
๋ณ์นญ ํน์ ์ธํฐํ์ด์ค ์ด๋ฆ์ ํด๋ฆญํ๋ฉด ํด๋น ํ์
์ผ๋ก ์ด๋ํ๋ค.
ํ์ / ์ธํฐํ์ด์ค ์ฐจ์ด์
๐ก ์ข์ ์ํํธ์จ์ด๋ ์ธ์ ๋ ํ์ฅ์ด ์ฉ์ด ํด์ผํ๋ค.
ํ์
๋ณ์นญ๊ณผ ์ธํฐํ์ด์ค์ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ ํ์
์ ํ์ฅ ๊ฐ๋ฅ / ๋ถ๊ฐ๋ฅ ์ฌ๋ถ๋ค. ์ธํฐํ์ด์ค๋ ํ์ฅ ๊ฐ๋ฅํ์ง๋ง ํ์
๋ณ์นญ์ ํ์ฅํ ์ ์๋ค. ๋๋ฌธ์ interface
๋ก ์ ์ธํด์ ์ฌ์ฉํ๋๊ฑธ ์ถ์ฒํ๋ค.
์ฐ์ฐ์๋ฅผ ์ด์ฉํ ํ์ ์ ์
์ ๋์จ ํ์
์ ์๋ฐ์คํฌ๋ฆฝํธ์ OR ์ฐ์ฐ์ ||
์ฒ๋ผ Aํน์ B ์๋ฏธ๋ฅผ ๊ฐ์ง๋ค. ํ์
์คํฌ๋ฆฝํธ์์ |
๊ธฐํธ๋ฅผ ์ฌ์ฉํ๋ค. ๋ณ์ ํน์ ํ๋ผ๋ฏธํฐ์ 1๊ฐ์ง ์ด์ ํ์
์ ์ ํ์ง๋ก ์ฐ๊ณ ์ถ์ ๋ ์ ์ฉํ๋ค.
์๋ logMessage
ํจ์ ํ๋ผ๋ฏธํฐ์ ์ ๋์จ ํ์
|
์ ์ ์ฉํ์ฌ string
๊ณผ number
ํ์
์ค ํ ๊ฐ์ง๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ค. ๋ณ์์ ์ ์ฉํ ๋๋ ๋์ผํ ๋ฐฉ๋ฒ์ผ๋ก ์ฐ๋ฉด ๋๋ค.
// ํจ์ ํ๋ผ๋ฏธํฐ์ Union Type ์ฌ์ฉ
function logMessage(value: string | number): void {
console.log(value);
}
logMessage('Hello');
logMessage(10);
// ๋ณ์์ Union Type ์ฌ์ฉ
let jenny: string | number | boolean;
์ ๋์จ ํ์ ์ฅ์
any
ํ์
์ ์ฌ์ฉํ๋ฉด ๋ชจ๋ ํ์
์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ํ๋ผ๋ฏธํฐ ๋ณ์์ ๋ํ ์๋์์ฑ์ด ์๋๋ค. ์ ๋์จ ํ์
์ ์ฌ์ฉํ๋ฉด ์๋์ฒ๋ผ ํด๋น ํ์
์ ํด๋นํ๋ API ์์ฑ์ด ์๋์์ฑ๋๋ฏ๋ก ํธ๋ฆฌํ๋ค.
์๋ if
๋ฌธ ์ฒ๋ผ ํ์
์ ๋ฒ์๋ฅผ ์ขํ๋๊ฐ๋(ํํฐ๋ง ํ๋) ๊ณผ์ ์ ํ์
๊ฐ๋๋ผ๊ณ ๋ถ๋ฅธ๋ค.
function logMessage(value: string | number): string | number {
if (typeof value === 'number') {
// number์ ๋ํ API ์์ฑ์ ํ์ธํ ์ ์๋ค
return value.toLocaleString();
}
if (typeof value === 'string') {
return value.toString();
}
// ์ ์ํ์ง ์์ ํ์
์ด ์ค๋ฉด ์๋ฌ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๋ค
throw new TypeError('value must be string or number');
}
logMessage('Hello'); // Hello
logMessage(10); // 10
logMessage([1, 2, 3]); // ts[2769] error! value must be string or number
์ ๋์จ ํ์ ํน์ง
์๋ ์ฝ๋์์ Developers
์ Marketers
์ธํฐํ์ด์ค๋ฅผ ๋ง๋ ํ askSomeone
ํจ์ ํ๋ผ๋ฏธํฐ์ ์ ๋์จ ํ์
์ ์ด์ฉํด 2๊ฐ์ ํ์
์ ์ ์ํ๋ค. 2๊ฐ์ ํ์
์ ๋ชจ๋ ์ ์ฉํ์ผ๋ ํด๋น ์ธํฐํ์ด์ค๋ค์ด ๊ฐ์ง๋ ๋ชจ๋ ์์ฑ์ ์ ๊ทผํ ์ ์์ ๊ฒ ๊ฐ์ง๋ง ๊ทธ๋ ์ง ์๋ค. ๋ ์ธํฐํ์ด์ค๊ฐ ๊ณตํต์ผ๋ก ๊ฐ์ง๋ name ์์ฑ์๋ง ์ ๊ทผํ ์ ์๋ค.
ํจ์ ํธ์ถ์์๋ ๋ ์ธํฐํ์ด์ค ๊ณตํต ์์ฑ ์ธ์, ๋์ค ํ๋์ ์ธํฐํ์ด์ค์ ๋ํ ์์ฑ๋ง ๋ช ์ํด์ผ ํ๋ค. ๋ ์ธํฐํ์ด์ค ์ค ํ๋๋ฅผ ์ ํํด์ ํ๋ผ๋ฏธํฐ๋ก ๋๊ธฐ๋ ๊ฐ๋ ๊ณผ ๋น์ทํ๋ค๊ณ ๋ณผ ์ ์๋ค.
interface Developers {
name: string;
skill: string;
}
interface Marketers {
name: string;
age: number;
}
function askSomeone(someone: Developers | Marketers) {
someone.name; // 2๊ฐ์ ์ธํฐํ์ด์ค๊ฐ ๊ณตํต์ผ๋ก ๊ฐ์ง๋ ์์ฑ๋ง ์ ๊ทผํ ์ ์๋ค.
someone.skill; // ts(2339) error!
someone.age; // ts(2339) error!
}
// ํจ์ ํธ์ถ ์ Developers ํน์ Marketers ๋์ค ํ๋์ ์ธํฐํ์ด์ค ์์ฑ๋ง ๋ช
์
askSomeone({
name: 'John',
skill: 'JS', // Developers ์์ฑ
});
ํ์
์คํฌ๋ฆฝํธ ๊ด์ ์์ askSomeone
์ ํธ์ถํ๋ ์์ ์ Developers
ํ์
์ด ์ฌ์ง, Marketers
ํ์
์ด ์ฌ์ง ์ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ ํ์
์ด ๋ค์ด์ค๋ ์ค๋ฅ๊ฐ ์๋๋ ๋ฐฉํฅ์ผ๋ก ํ์
์ ์ถ๋ก ํ๋ค. ์ฆ ํ์
๊ฐ๋๋ฅผ ์ด์ฉํด ํ์
์ ๋ฒ์๋ฅผ ์ขํ์ง ์๋ ์ด์ ๊ธฐ๋ณธ์ ์ผ๋ก Developers
๊ณผ Marketers
๋ ํ์
์ด ๊ณตํต์ ์ผ๋ก ๊ฐ์ง๋ name
์์ฑ๋ง ์ ๊ทผํ ์ ์๋ ๊ฒ.
์ธํฐ์น์ ํ์
๐ก `&` ์ฐ์ฐ์๋ฅผ ์ด์ฉํด ์ฌ๋ฌ ํ์ ์ ์๋ฅผ ํ๋๋ก ํฉ์น๋ ๋ฐฉ์
์ฌ๋ฌ ํ์
์ ๋ชจ๋ ๋ง์กฑํ๋ ํ๋์ ํ์
์ ์๋ฏธํ๋ค. ์๋ ์ฝ๋์์ Developers
์ Marketers
์ธํฐํ์ด์ค ํ์
์ ์๋ฅผ &
์ฐ์ฐ์๋ฅผ ์ด์ฉํด Steve
๋ผ๋ ํ์
์ ํ ๋นํ๋ค.
interface Developers {
name: string;
skill: string;
}
interface Marketers {
name: string;
age: number;
}
type Steve = Developers & Marketers;
๊ทธ๋ผ Steve
ํ์
์ ์๋์ฒ๋ผ ์ ์ํ ๊ฒ๊ณผ ๊ฐ๋ค.
{
name: string;
skill: string;
age: number;
}
์๋ askSomeone
ํจ์ ํ๋ผ๋ฏธํฐ์ ์ธํฐ์น์
ํ์
์ ์ด์ฉํด 2๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ ๋ช
์ํ๋ฉด, ์ด ๋ ์ธํฐํ์ด์ค ์์ฑ์ ๋ชจ๋ ํฌํจํ๋ฏ๋ก ๋ชจ๋ ์์ฑ์ ์ ๊ทผํ ์ ์๋ค. ํจ์ ํธ์ถ์์๋ ๋ชจ๋ ์์ฑ์ ๋ช
์ํด์ผ ํ๋๋ฐ, 2๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ ๋ชจ๋ ํฌํจํ๋ ํฉ์งํฉ์ด๋ฏ๋ก ์๋ก์ด ํ์
์ ๋ง๋๋ ๊ฒ๊ณผ ๋น์ทํ๋ค๊ณ ๋ ๋ณผ ์ ์๋ค.
function askSomeone(someone: Developers & Marketers) {
someone.name; // ok
someone.skill; // ok
someone.age; // ok
}
// ํจ์ ํธ์ถ ์ Developers์ Marketers ์ธํฐํ์ด์ค์ ๋ชจ๋ ์์ฑ ๋ช
์(ํฉ์งํฉ)
askSomeone({
name: 'John',
skill: 'JS',
age: 30,
});
์ ๋์จ ํ์ ๊ณผ ์ธํฐ์น์ ๋น๊ต
๐ก ์ค๋ฌด์์ ์ ๋์จ ํ์ ์ ๋ ์์ฃผ ์ด๋ค
์ด๋ (Enum)
ํน์ ๊ฐ๋ค์ ์งํฉ์ ์๋ฏธํ๋ ์๋ฃํ์ผ๋ก ํ์
์คํฌ๋ฆฝํธ์์ ๋ฌธ์ํ๊ณผ ์ซ์ํ ์ด๋์ ์ง์ํ๋ค. ์ด๋์ ๋๋กญ๋ค์ด์ด๋ ์ ํด์ง ๋ชฉ๋ก์ ๊ฐ๋ค์ ์ง์ ํ ๋ ์ ์ฉํ๋ค. ๋ฌธ์ํ๊ณผ ์ซ์ํ ์ด๋์ ํผํฉํด์ ์์ฑํ ์๋ ์์ง๋ง ๊ถ๊ณ ํ์ง ์๋ ๋ฐฉ์์ด๋ค. ์ต๋ํ ๊ฐ์ ํ์
์ผ๋ก ์ด๋ฃจ์ด์ง ์ด๋์ ์ฌ์ฉํ๋๊ฒ ์ข๋ค.
์ซ์ํ ์ด๋
์ด๋์์ ๋ณ๋ ๊ฐ์ ํ ๋นํ์ง ์์ผ๋ฉด ๋ชจ๋ ์ซ์ํ ์ด๋์ผ๋ก ์ทจ๊ธํ๋ค. ์ด๋์ ๋ชฉ๋ก์ ์ถ๊ฐํ ์๋ก ๊ฐ์ 1
์ฉ ์๋ ์ฆ๊ฐํ๋ค(0
๋ถํฐ ์์). ๋ง์ฝ Adidas
์ 10
์ ํ ๋นํ๋ฉด Nike
๋ ์๋์ผ๋ก 1
์ด ์ฆ๊ฐํ์ฌ 11
์ด ๋๋ค.
enum Shoes {
Adidas = 10,
Nike, // 11
}
const myShoes = Shoes.Nike;
console.log(myShoes); // 11
TS Playground์์ ์ ์ฝ๋๋ฅผ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์ปดํ์ผ ํด๋ณด๋ฉด ์๋์ฒ๋ผ ๋๋ค. ์ผ์ชฝ Run ๋ฒํผ์ ๋๋ฅด๋ฉด ์ฝ์๋ก๊ทธ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์๋ค. ์๋ ์ฝ๋์์ ์ ์ ์๋ฏ ์ด๋์ ๋ฐํ์์ ์ค์ ๊ฐ์ฒด ํํ๋ก ์กด์ฌํ๋ค.
๐ก enum์ ๋จ์
enum์ ํธ๋์คํ์ผ๋ง(TS → JS ๋ณํ) ํ IIFE๋ฅผ ํตํด ๊ฐ์ฒด๋ฅผ ์์ฑํด์ ๋ฐํ์์ ์ํฅ์ ์ค ์ ์๋ค. ์ ์ ํ์ ์ ๋ณด๊ฐ ๋ฐํ์์ ์ํฅ์ ์ฃผ๋ ์ ์ด๋ค. ๋ฒ๋ค๋ฌ๊ฐ IIFE๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋๋ก ํ๋จํด์ Tree Shaking(์ฌ์ฉํ์ง ์๋ ์ฝ๋ ์ญ์ )๋ ์๋๋ค.
enum์ ์ด๋ฐ ๋จ์ ์ ๋ฐฉ์งํ๊ณ ์ถ์ผ๋ฉด const enum์ ์ฌ์ฉํ๋ฉด ๋๋ค(์ฐธ๊ณ ๊ธ). ๊ทธ๋ผ ์ฌ์ฉํ์ง ์๋ ์ฝ๋๋ ๋ฒ๋ค์ ํฌํจํ์ง ์๋๋ค(Tree Shaking). ํ์ง๋ง ๊ฐ ํ์ผ์ ๋ถ๋ฆฌ๋ ๋ชจ๋๋ก ํธ๋์คํ์ผ๋งํ๋ isolatedModules
์ต์
์ด ์ผ์ ธ์๋ค๋ฉด, ๊ฐ๊ฐ ๋ค๋ฅธ ๋ชจ๋์ enum์ ์ ์ํ๊ณ ์ฝ์ด์ค๋ ์ํฉ์์ ์ฌ์ฉํ ์ ์๋ค(์ฐธ๊ณ ๊ธ).
๋ํ, ๋ฌธ์์ด enum์ด ํ์ํ ํจ์๋ ๊ฐ์ฒด์ ํธํ๋๋ ๊ฐ(enum๊ณผ ๋์ผํ ๊ฐ)์ ์ ๋ฌํ ์ ์๋ ๋จ์ ๋ ์๋ค.
// ์ฝ๋ ์ฐธ๊ณ - yceffort
enum Direction {
Up = 'Up',
Down = 'Down',
Left = 'Left',
Right = 'Right',
}
declare function move(direction: Direction): void;
move('Up'); // Error (๋ฌธ์์ด 'Up'์ Direction.Up๊ณผ ๋์ผํ์ง๋ง enum์ด ์๋์ด์ ์ ๋ฌ ๋ถ๊ฐ)
move(Direction.Up); // OK
๋ฌธ์ํ ์ด๋
๋ฌธ์ํ ์ด๋์ ์ซ์ํ ์ด๋๊ณผ ๋ค๋ฅด๊ฒ Auto-Incrementing(์๋์ฆ๊ฐ)์ด ์๋ค. ๋๋ฌธ์ ๋ฌธ์ํ ์ด๋์ ํน์ ๋ฌธ์๋ ๋ค๋ฅธ ์ด๋ ๊ฐ์ผ๋ก ์ด๊ธฐํ ํด์ค์ผ ํ๋ค.
enum Direction {
Up = 'UP',
Down = 'DOWN',
Left = 'LEFT',
Right = 'RIGHT',
}
์ด๋ ํ์ฉ
Answer
๋ผ๋ ์ด๋ ๋ชฉ๋ก์ ๋ง๋ค์ด์, askQuestion
ํจ์ ํ๋ผ๋ฏธํฐ์ ํ์
์ ์ด๋์ผ๋ก ์ง์ ํ ์์. ํจ์ ํธ์ถ์์๋ ํด๋น ์ด๋์์ ์ ๊ณตํ๋ ๋ฐ์ดํฐ๋ง ํ๋ผ๋ฏธํฐ๋ก ๋ฃ์ ์ ์๋ค.
enum Answer {
Yes = 'Y',
No = 'N',
}
function askQuestion(answer: Answer) {
if (answer === Answer.Yes) {
console.log('์ ๋ต์
๋๋ค');
}
if (answer === Answer.No) {
console.log('์ค๋ต์
๋๋ค');
}
}
askQuestion(Answer.Yes);
askQuestion('Y'); // ts(2345) error!
์ด๋ ๋ฐ์ดํฐ(๊ฐ)์ ๊ฐ์ฒด์ Key๋ก ์ฌ์ฉํ ๋ Computed Property { [...]: value }
๋ฅผ ์ฌ์ฉํ๋ค.
enum SHOE_BRANDS {
NIKE = 'nike',
ADIDAS = 'adidas',
MIZNO = 'mizno',
}
const shoeBrandsKoStrings = {
[SHOE_BRANDS.NIKE]: '๋์ดํค',
[SHOE_BRANDS.ADIDAS]: '์๋๋ค์ค',
[SHOE_BRANDS.MIZNO]: '๋ฏธ์ฆ๋
ธ',
};
ํ์ ์คํฌ๋ฆฝํธ์์ ํด๋์ค
ํ์
์คํฌ๋ฆฝํธ์์ ํด๋์ค ์ต์๋จ์ ๋ฉค๋ฒ ๋ณ์๋ฅผ ์ ์ํด์ค์ผํ๋ฉฐ, ์์ฑ์ ํจ์ ํ๋ผ๋ฏธํฐ์ ํ์
๋ ์ง์ ํด์ผ ํ๋ค. ๋ฉค๋ฒ ๋ณ์์ public
private
๋ฑ ์ ํจ ๋ฒ์๋ ์ค์ ํ ์ ์๋ค.
class Persons {
// ํด๋์ค ์ต์๋จ์ ํด๋์ค์์ ์ฌ์ฉํ ๋ฉค๋ฒ ๋ณ์๋ฅผ ์ ์ํด์ค์ผํจ
// ๋ฉค๋ฒ ๋ณ์์ ๋ํ ์ ํจ ๋ฒ์๋ ์ค์ ๊ฐ๋ฅ(public, private ๋ฑ)
private name: string;
public age: number;
// ์์ฑ์์ ํ๋ผ๋ฏธํฐ๋ ํ์
์ง์
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
}
Readonly
ํด๋์ค ์์ฑ์ readonly
ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ ๊ทผ๋ง ๊ฐ๋ฅํ๋ค(ํ ๋น ๋ถ๊ฐ).
class Developers {
readonly name: string;
constructor(theName: string) {
this.name = theName;
}
}
const john = new Developers('John');
john.name = 'John'; // ts(2540) error! name is readonly.
readonly
๋ฅผ ์ฌ์ฉํ๋ฉด ์์ฑ์ ํจ์์ ์ด๊ธฐ๊ฐ์ ์ง์ ํด์ผ ๋๋ค. ์๋์ฒ๋ผ ์์ฑ์ ํจ์ ํ๋ผ๋ฏธํฐ์ readonly
ํค์๋๋ฅผ ์ถ๊ฐํ๋ฉด ์ฝ๋๋ฅผ ์ค์ผ ์ ์๋ค.
class Developers {
readonly name: string;
constructor(readonly name: string) {}
}
Accessor
ํ์ ์คํฌ๋ฆฝํธ๋ ๊ฐ์ฒด ํน์ ์์ฑ์ด ์ ๊ทผ๊ณผ ํ ๋น์ ๋ํด ์ ์ดํ ์ ์๋ค. ์ด๋ฅผ ์ํด์ ํด๋์ค๋ก ๋ง๋ ๊ฐ์ฒด์ฌ์ผ ํ๋ค.
class Developer {
name: string;
}
const josh = new Developer();
josh.name = 'Josh Bolton';
๋ง์ฝ name
์์ฑ์ ์ ์ฝ ์ฌํญ์ ์ถ๊ฐํ๊ณ ์ถ๋ค๋ฉด ์๋์ฒ๋ผ get
๊ณผ set
์ ํ์ฉํ๋ฉด ๋๋ค. get
๋ง ์ ์ธํ๊ณ set
์ ์ ์ธํ์ง ์์ ๊ฒฝ์ฐ์ ์๋์ผ๋ก readonly
๋ก ์ธ์๋๋ค.
class Developer {
private name: string;
get name(): string {
return this.name;
}
// name์ด 5๊ธ์๋ฅผ ์ด๊ณผํ๋ฉด ์๋ฌ ์ถ๋ ฅ
set name(newValue: string) {
if (newValue && newValue.length > 5) {
throw new Error('์ด๋ฆ์ด ๋๋ฌด ๊น๋๋ค');
}
this.name = newValue;
}
}
const josh = new Developer();
josh.name = 'Josh Bolton'; // Error
josh.name = 'Josh';
Abstract Class (์ถ์ ํด๋์ค)
์ถ์ ํด๋์ค๋ ํน์ ํด๋์ค์ ์์ ๋์์ด ๋๋ ํด๋์ค๋ค. ์์ ๋ ๋ฒจ์์ ์์ฑ, ๋ฉ์๋์ ๊ตฌ์กฐ๋ฅผ ์ ์ํ๋ค.
abstract class Developer {
abstract coding(): void; // 'abstract'๊ฐ ๋ถ์ผ๋ฉด ์์ ๋ฐ์ ํด๋์ค์์ ๋ฌด์กฐ๊ฑด ๊ตฌํํด์ผ ํจ
drink(): void {
console.log('drink sth');
}
}
class FrontEndDeveloper extends Developer {
coding(): void {
// Developer ํด๋์ค๋ฅผ ์์ ๋ฐ์ ํด๋์ค์์ ๋ฌด์กฐ๊ฑด ์ ์ํด์ผ ํ๋ ๋ฉ์๋
console.log('develop web');
}
design(): void {
console.log('design web');
}
}
const dev = new Developer(); // error: cannot create an instance of an abstract class
const josh = new FrontEndDeveloper();
josh.coding(); // develop web
josh.drink(); // drink sth
josh.design(); // design web
๊ธ ์์ ์ฌํญ์ ๋ ธ์ ํ์ด์ง์ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ๋ฐ์๋ฉ๋๋ค. ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์
'๐ช Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JS] ์บ๋ฒ์ค Canvas ๋ํ ํ๋ ์ถ์ ํ ์์ ์กฐ์ ํ๊ธฐ (0) | 2024.04.24 |
---|---|
[React] Canvas API ๊ธฐ๋ณธ ๋ด์ฉ ์ ๋ฆฌ / ๋ฆฌ์กํธ์์ ์ฌ์ฉ๋ฒ (0) | 2024.04.24 |
[TS] ํ์ ์คํฌ๋ฆฝํธ - ํ์ ์ถ๋ก / ๋จ์ธ / ๊ฐ๋ (0) | 2024.04.24 |
[TS] ํ์ ์คํฌ๋ฆฝํธ - ์ ๋ค๋ฆญ, ํ๋ก๋ฏธ์ค (0) | 2024.04.24 |
[JS] location ๊ฐ์ฒด์ href/assign, replace ์ฐจ์ด์ (0) | 2024.04.24 |
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[React] Canvas API ๊ธฐ๋ณธ ๋ด์ฉ ์ ๋ฆฌ / ๋ฆฌ์กํธ์์ ์ฌ์ฉ๋ฒ
[React] Canvas API ๊ธฐ๋ณธ ๋ด์ฉ ์ ๋ฆฌ / ๋ฆฌ์กํธ์์ ์ฌ์ฉ๋ฒ
2024.04.24 -
[TS] ํ์ ์คํฌ๋ฆฝํธ - ํ์ ์ถ๋ก / ๋จ์ธ / ๊ฐ๋
[TS] ํ์ ์คํฌ๋ฆฝํธ - ํ์ ์ถ๋ก / ๋จ์ธ / ๊ฐ๋
2024.04.24 -
[TS] ํ์ ์คํฌ๋ฆฝํธ - ์ ๋ค๋ฆญ, ํ๋ก๋ฏธ์ค
[TS] ํ์ ์คํฌ๋ฆฝํธ - ์ ๋ค๋ฆญ, ํ๋ก๋ฏธ์ค
2024.04.24 -
[JS] location ๊ฐ์ฒด์ href/assign, replace ์ฐจ์ด์
[JS] location ๊ฐ์ฒด์ href/assign, replace ์ฐจ์ด์
2024.04.24