๐ ์ดํํฐ๋ธ ํ์ ์คํฌ๋ฆฝํธ ๋ ์ ๊ธฐ๋ก
ํ์ ์คํฌ๋ฆฝํธ์ ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ด๊ณ
- ํ์ ์คํฌ๋ฆฝํธ๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ์์์งํฉ (Superset)
- ์ฆ ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ ํ์ ์คํฌ๋ฆฝํธ (ํ์ง๋ง ๋ฐ๋๋ ์ฑ๋ฆฝํ์ง ์์)
ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ๋ ์ด์
- ํ์ ์คํฌ๋ฆฝํธ์ ํ์ ์์คํ ์ ๋ฐํ์์ ์ค๋ฅ๋ฅผ ๋ฐ์์ํฌ ์ฝ๋๋ฅผ ๋ฏธ๋ฆฌ ์ฐพ์๋ธ๋ค.
์ฝ๋ ์์ฑ๊ณผ ํ์ ์ด ๊ด๊ณ ์์์ ์ดํดํ๊ธฐ
- ํ์ ์คํฌ๋ฆฝํธ๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๋ณํ ๋ ๋, ์ฝ๋ ๋ด์ ํ์ ์๋ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ ์คํ ์์ ์๋ ํ์ ์ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ค.
๋ฐํ์์๋ ํ์ ์ฒดํฌ๊ฐ ๋ถ๊ฐ๋ฅํ๋ค.
interface Rectangle {
height: number;
width: number;
}
if(shape instanceof Rectangle) // ์ค๋ฅ!
- ํ์ ์ ๋ฐํ์ ์์ ์ ์๋ฌด๋ฐ ์ญํ ์ ํ ์ ์๋ค.
- ํ์ ์คํฌ๋ฆฝํธ์ ํ์ ์ ์ ๊ฑฐ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์, ์ค์ ๋ก ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์ปดํ์ผ ๋๋ ๊ณผ์ ์์ ๋ชจ๋ ์ธํฐํ์ด์ค, ํ์ , ํ์ ๊ตฌ๋ฌธ์ ๊ทธ๋ฅ ์ ๊ฑฐ๋์ด ๋ฒ๋ฆฐ๋ค.
๋ฐํ์ ํ์ ์ ์ ์ธ๋ ํ์ ๊ณผ ๋ค๋ฅผ ์ ์๋ค.
- ์ด๋๊ฒฝ์ฐ? API ํธ์ถ๋ก ๋ฐ์์จ ๊ฐ์ ๊ฒฝ์ฐ
๊ตฌ์กฐ์ ํ์ดํ
interface Vector2D {
x: number;
y: number;
}
interface Vector3D {
x: number;
y: number;
z: number;
}
function calculateLength(v: Vector2D) {
return Math.sqrt(v.x * v.x + v.y * v.y);
}
- ์์ Vector3D ์๋ Vector2D ํ์ ์ ์๋ x , y ์์ฑ์ด ์๊ธฐ ๋๋ฌธ์ calculateLength ํจ์์ ๋งค๊ฐ๋ณ์๋ก ๋ค์ด๊ฐ ์ ์๋ค.
- ์ฆ, Vector3D ์ ๊ตฌ์กฐ๊ฐ Vector2D์ ๊ตฌ์กฐ์ ํธํ๋๊ธฐ ๋๋ฌธ์, calculateLength ํธ์ถ์ด ๊ฐ๋ฅํด์ง๋ค.
๋ด์ธ๋, ์ ํํ ํ์
- ํจ์๋ฅผ ์์ฑํ ๋, ํธ์ถ์ ์ฌ์ฉ๋๋ ๋งค๊ฐ๋ณ์์ ์์ฑ๋ค์ด ๋งค๊ฐ๋ณ์์ ํ์ ์ ์ ์ธ๋ ์์ฑ๋ง์ ๊ฐ์ง๊ฑฐ๋ผ ์๊ฐํ๋ค. ํ์ง๋ง ์์์ ๋ณด์๋ฏ , Vector3D ํ์ ์ด ๋งค๊ฐ๋ณ์๋ก ๋ค์ด์ค๋ฉด Vector2D ํ์ ์๋ ์๋ x ์์ฑ์ด ์ถ๊ฐ๋ก ๋ค์ด์จ๋ค.
- ์ด๋ฌํ ํ์ ์ ๋ด์ธ๋,์ ํํ ํ์ ์ด๋ผ๊ณ ํ๋ค.
- ์ด๋ ํ์ ์คํฌ๋ฆฝํธ์์ ํํํ ์ ์๋ค.
- ๋ฐ๋ผ์ ์๋์ ๊ฐ์ ์์๊ฐ ์๋ค.
function calculateL1(v: Vector3D) {
let length = 0;
for (const axis of Object.keys(v)) {
const coord = v[axis]; // 'string' ์ 'Vector3D'์ ์ธ๋ฑ์ค๋ก ์ฌ์ฉํ ์ ์๊ธฐ์ ์๋ฆฌ๋จผํธ๋ ์์์ ์ผ๋ก 'any' ํ์
์
๋๋ค.
}
}
- ์ ? x,y,z ์ค ํ๋๋๊น string ํ์
์ด ์๋์ง ์์๊ฐ?
- ๊ตฌ์กฐ์ ํ์ดํ์ผ๋ก ์ธํด v ๋ x,y,z ์ธ์๋ ๋ค๋ฅธ ์์ฑ์ ๊ฐ์ง ์ ์๋ค. ๋ฐ๋ผ์ axis ํ์ ์ string ์ด ๋ ์๋ ์๋ค.
- ์ฆ, v[axis] ๊ฐ ์ ํํ ์ด๋ค ์์ฑ์ด ๋ ์ง ์ ์ ์์ผ๋ฏ๋ก number ๋ผ๊ณ ํ์ ํ ์ ์๋ค.
- ์ด๋ฌ๋ ๊ฒฝ์ฐ ๋ฃจํ๋ณด๋ค ๋ชจ๋ ์์ฑ์ ๊ฐ๊ฐ ์ฐธ์กฐํ๋ ๊ตฌํ์ด ๋ ๋ซ๋ค.
๊ตฌ์กฐ์ ํ์ดํ๊ณผ ๋ํ์ดํ์ ์ฐจ์ด์
- ๋ํ์ดํ๊ณผ ๊ตฌ์กฐ์ ํ์ดํ์ ์ฐจ์ด์ ์ ๋ํ์ดํ์ ๋ฐํ์ ์, ๊ตฌ์กฐ์ ํ์ดํ์ ์ปดํ์ผ ์ ์ผ์ด๋๋ค๋ ๊ฒ์ด๋ค.
any ํ์ ์ง์ํ๊ธฐ
- any ํ์ ์ ์์ ์ฑ์ด ์๋ค.
- any๋ ํจ์ ์๊ทธ๋์ณ๋ฅผ ๋ฌด์ํด๋ฒ๋ฆฐ๋ค.
- any ๋ ์ธ์ด ์๋น์ค๊ฐ ์ ์ฉ๋์ง ์๋๋ค.
- any ๋ ์ฝ๋ ๋ฆฌํฉํฐ๋ง ๋ ๋ฒ๊ทธ๋ฅผ ๊ฐ์ถ๋ค.
- any ๋ ํ์ ์ค๊ณ๋ฅผ ๊ฐ์ถ๋ค.
- any ๋ ํ์ ์์คํ ์ ์ ๋ขฐ๋๋ฅผ ๋จ์ด๋จ๋ฆฐ๋ค.
ํ์ ์ด ๊ฐ๋ค์ ์งํฉ์ด๋ผ๊ณ ์๊ฐํ๊ธฐ
type K = keyof (Person | Lifespan); // ํ์
์ด never
- ์์ ํ์ ์ด never ์ธ ์ด์ ๋ ์๋์ ๊ฐ๋ค.
keyof (A|B) = (keyof A)& (keyof B)
keyof (A&B) = (keyof A) | (keyof B)
ํ์ ๋จ์ธ๋ณด๋ค ํ์ ์ ์ธ ์ฌ์ฉํ๊ธฐ
const people = ['alice', 'bob', 'jan'].map((name) => ({ name }));
// Person[] ์ ์ํ์ง๋ง ๊ฒฐ๊ณผ๋ { name: string; } []
// ํ์
๋จ์ธ์ ์ฐ๋ฉด
const people = ['alice', 'bob', 'jan'].map((name) => ({ name } as Person));
// ์ ์ธํ๊ธฐ 1๋ฒ
const people = ['alice', 'bob', 'jan'].map((name) => {
const person: Person = { name };
return person;
}); // ํ์
์ Person[]
// ์ ์ธํ๊ธฐ 2๋ฒ (๋ฆฌํฉํฐ๋ง)
const people = ['alice', 'bob', 'jan'].map((name): Person => ({ name }));
// ํ์
์ Person[]
- 2๋ฒ์ด ์ด๋ป๊ฒ ๊ฐ๋ฅํ๊ฐ..
(name):Person
์ name ์ ํ์ ์ด ์๊ณ ๋ฐํ ํ์ ์ด Person ์ด๋ผ๊ณ ๋ช ์ํ๋ค.
์ ์ธ๋ณด๋ค ๋จ์ธ์ด ์ ๋ฆฌํ ๊ฒฝ์ฐ
- ํ์ ์ฒด์ปค์ ์ถ๋ก ๋ณด๋ค ๋์ ํ๋จ์ด ๋ ์ ํํ ๋
- DOM element ์ ๋ํด์..
- ํ์ ์คํฌ๋ฆฝํธ๋ DOM์ ์ ๊ทผ ํ ์ ์๊ธฐ ๋๋ฌธ์ DOM ํ์ ์ ๋ชจ๋ฅธ๋ค.
const el = document.body as Person; // ์๋ฌ
const el = (document.body as unknown) as Person; // ์ฑ๊ณต
- ์ฒซ๋ฒ์งธ์ ๊ฒฝ์ฐ HTMLElement ์ Person ์ด ์๋ก์ ์๋ธํ์ ์ด ์๋๊ธฐ ๋๋ฌธ์ ๋ณํ์ด ๋ถ๊ฐ๋ฅํ๋ค.
- unknown ์ ์ฌ์ฉํ๋ฉด, ๋์ํ๋๋ฐ ๊ทธ ์ด์ ๋ unknown์ด ๋ชจ๋ ํ์ ์ ์๋ธํ์ ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
๊ฐ์ฒด ๋ํผ ํ์ ํผํ๊ธฐ
- string ์ String ํ์ ์ ํ ๋น ํ ์ ์์ง๋ง, String ์ string ํ์ ์ ํ ๋น ํ ์ ์๋ค.
- ๊ธฐ๋ณธํ ํ์ ์ ๊ฐ์ฒด ๋ํผ์ ํ ๋น ํ ์ ์๊ธฐ ๋๋ฌธ์, ํ์ ์คํฌ๋ฆฝํธ๋ ๊ธฐ๋ณธํ ํ์ ์ ๊ฐ์ฒด ๋ํผ์ ํ ๋นํ๋ ์ ์ธ์ ํ์ฉํ๋ค.
์์ฌ ์์ฑ ์ฒดํฌ์ ํ๊ณ ์ธ์งํ๊ธฐ
interface Room {
numDoors: number;
ceilingHeightFt: number;
}
const r:Room {
numDoors:1,
ceilingHeightFt:10,
elephant: 'present'
}
// ๊ฐ์ฒด ๋ฆฌํฐ๋ด์ ์๋ ค์ง ์์ฑ๋ง ์ง์ ํ ์ ์์ผ๋ฉฐ, Room ํ์์ elephant ๊ฐ ์์ต๋๋ค.
- ๊ตฌ์กฐ์ ํ์ ์์คํ ์์ ๋ฐ์ ํ ์ ์๋ ์ค์ํ ์ข ๋ฅ์ ์ค๋ฅ(๋ค๋ฅธ ํ์ ์ด ์ถ๊ฐ๋๋ ๊ฒ)๋ฅผ ์ก์ ์ ์๋๋ก โ์์ฌ ์์ฑ ์ฒดํฌโ๋ผ๋ ๊ณผ์ ์ด ์ํ๋์๋ค.
- ํ์ง๋ง ์ด๋ฌํ ์์ฌ์์ฑ ์ฒดํฌ๋ ๋งค๋ฒ ์ด๋ฃจ์ด์ง๋ ๊ฒ์ ์๋๋ค.
์์ฌ ์์ฑ ์ฒดํฌ๊ฐ ์ผ์ด๋๋ ๊ฒฝ์ฐ
- ํ์ ์ด ์ ์ธ๋์ด ์์ ๋, ๊ฐ์ฒด ๋ฆฌํฐ๋ด๋ก ๊ฐ์ ํ ๋น ํ ๋
- ํ์ ์ด ์ ์ธ๋์ด ์๋ ๋งค๊ฐ๋ณ์์, ๊ฐ์ฒด ๋ฆฌํฐ๋ด๋ก ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฌํ ๋
์์ฌ ์์ฑ ์ฒดํฌ๊ฐ ์ผ์ด๋์ง ์๋ ๊ฒฝ์ฐ
- ํ์ ์ ์ธ๋์ ํ์ ๋จ์ธ์ ์ฌ์ฉ ํ ๋
- ํ์ ์ด ์ ์ธ๋ ๊ฐ ํน์ ๋งค๊ฐ๋ณ์์ ๊ฐ์ฒด ๋ฆฌํฐ๋ด์ด ์๋๋ผ ๋ณ์๋ก ๊ฐ์ ํ ๋นํ๋ ๊ฒฝ์ฐ
์์ฌ ์์ฑ ์ฒดํฌ๊ฐ ํ์ํ ๋จ์ ์ธ ์์
interface Option {
title: string;
darkMode?: boolean;
}
const o1: Option = document;
const o2: Option = new HTMLAnchorElement();
// ์๋ฌ ์์
-
์ o1. ๊ณผ o2 ์ ๊ฒฝ์ฐ ์๋ฌ๊ฐ ์์๊น?
-
์ผ๋จ ์์ฌ์์ฑ ์ฒดํฌ๋ฅผ ํ์ง ๋ชปํ๊ณ (๊ฐ์ฒด ๋ฆฌํฐ๋ด๋ก ๊ฐ์ ํ ๋นํ๊ฒ ์๋๋ฏ๋ก), ๊ทธ์ ๋ฐ๋ผ์ document ์ HTMLAnchorElement ์๋ string ํ์ ์ธ title ์์ฑ์ด ์๊ธฐ ๋๋ฌธ์!
-
๋ฐ๋ผ์ ์์ ํ ๋น๋ฌธ์ ์ ์์ด๋ค.
-
์์ฌ ์์ฑ์ ์ฒดํฌํจ์ผ๋ก์จ, ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ ์์คํ ์ ๊ตฌ์กฐ์ ๋ณธ์ง์ ํด์น์ง ์์ผ๋ฉด์ ๊ฐ์ฒด ๋ฆฌํฐ๋ด์ ์ ์ ์๋ ์์ฑ์ ํ์ฉํ์ง ์์์ ์์์ ๋ค๋ฃฌ ๋ฌธ์ ์ ๋ค์ ํด๊ฒฐ ํ ์ ์๋ค.
ํจ์ ํํ์์ ํ์ ์ ์ฉํ๊ธฐ
- ํ์ ์คํฌ๋ฆฝํธ์์๋ ํจ์ ํํ์์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
- ์? ํจ์์ ๋งค๊ฐ๋ณ์ ๋ถํฐ ๋ฐํ๊ฐ๊น์ง ์ ์ฒด๋ฅผ ํจ์ ํ์ ์ผ๋ก ์ ์ธํ์ฌ, ํจ์ ํํ์์ ์ฌ์ฌ์ฉ ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
type BinaryFn = (a: number, b: number) => number;
const add: BinaryFun = (a, b) => a + b;
ํ์ ๊ณผ ์ธํฐํ์ด์ค์ ์ฐจ์ด์ ์๊ธฐ
๊ณตํต์
- ํ์ ์ ์ธ๋ ๋ณ์์ ๊ฐ์ฒด๋ฆฌํฐ๋ด ํ ๋น ์ ์์ฌ์์ฑ์ ์ฒดํฌํด์ค๋ค.
- ์ธ๋ฑ์ค ์๊ทธ๋์ณ๋ฅผ ์ฌ์ฉ ํ ์ ์๋ค.
- ํจ์ ํ์ ๋ ์ ์ ํ ์ ์๋ค. (๊ทธ๋ฐ๋ฐ ์ด ๊ฒฝ์ฐ๋ ๋๋ถ๋ถ ํ์ alias ๋ฅผ ์ฐ๋๊ฒ ์ข๋ค.)
- ์ ๋ค๋ฆญ์ด ๊ฐ๋ฅํ๋ค.
- ์ธํฐํ์ด์ค๋ ํ์ ์ ํ์ฅํ ์ ์์ผ๋ฉฐ, ํ์ ์ ์ธํฐํ์ด์ค๋ฅผ ํ์ฅ ํ ์ ์๋ค.
// ์ธํฐํ์ด์ค๊ฐ ํ์
ํ์ฅ
interface IStateWithPop extends TState {
population: number;
}
// ํ์
์ด ์ธํฐํ์ด์ค ํ์ฅ
type TStateWithPop = IState & { population: number };
- ํด๋์ค ๊ตฌํ(implements) ์, ํ์ ๊ณผ ์ธํฐํ์ด์ค ๋๋ค ์ฌ์ฉ ๊ฐ๋ฅ
์ฐจ์ด์
- ์ ๋์จ ํ์ ์ ์์ง๋ง ์ ๋์จ ์ธํฐํ์ด์ค๋ ์๋ค.
- ์ธํฐํ์ด์ค๋ ํ์ ์ ํ์ฅ(extends) ํ ์ ์์ง๋ง ํ์ ์ ๋ถ๊ฐ๋ฅํ๋ค.
์ ๋์จ ํ์ ์ ํ์ฅํด์ผํ๋๊ฒฝ์ฐ
type Input = {};
type Output = {};
interface VariableMap {
[name: string]: Input | Output;
}
์ ๋์จ ํ์ ์ name ์์ฑ์ ๋ถ์ธ ํ์ ๋ง๋ค๊ธฐ
type NamedVariabel = (Input | Output) & { name: string };
- ํํ๊ณผ ๋ฐฐ์ดํ์ ๋ type ํค์๋๋ก ๋ ๊ฐ๊ฒฐํ๊ฒ ํํ ๊ฐ๋ฅ
type Pair = [number, number];
type StringList = string[];
type NamedNums = [string, ...number[]];
- ์ธํฐํ์ด์ค๋ ๋ณด๊ฐ(agument) ์ด ๊ฐ๋ฅํ๋ค. (์ ์ธ ๋ณํฉ! declaration merging)
interface IState {
name: string;
capital: string;
}
interface IState{
population:number;
}
const newyork : IState{
name: 'NewYork',
capital: 'NewYork',
population: 500_00
}
- ์์ ๊ฐ์ ์ ์ธ ๋ณํฉ์ ์ฃผ๋ก ํ์ ์ ์ธ ํ์ผ์์ ์ฌ์ฉ๋๋ค.
- ๋ฐ๋ผ์ ์ ์ธ ํฉ์ ์ง์ํ๊ธฐ ์ํด์๋ ๋ฌด์กฐ๊ฑด interface ๋ฅผ ์ฌ์ฉํด์ผํ๋ค.
- ํ์ ์คํฌ๋ฆฝํธ๋ ์ฌ๋ฌ ๋ฒ์ ์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ฌ๋ฌ ํ์ ์ ๋ชจ์ ๋ณํฉํ๋ค. ๋ณํฉ์ ํตํด์ Array ์ธํฐํ์ด์ค์ ์ฌ๋ฌ ๋ฉ์๋๊ฐ ์ถ๊ฐ๋๋ค.
- ๋ฐ๋ผ์ ํ๋กํผํฐ๊ฐ ์ถ๊ฐ๋๋ ๊ฒ์ ์์น ์๋๋ค๋ฉด, ์ธํฐํ์ด์ค ๋์ ํ์ ์ ์ฌ์ฉํด์ผํ๋ค.
ํ์ ์ฐ์ฐ๊ณผ ์ ๋๋ฆญ ์ฌ์ฉ์ผ๋ก ๋ฐ๋ณต ์ค์ด๊ธฐ
๋งคํ๋ ํ์ ์ฌ์ฉํ๊ธฐ
interface State {
userId: string;
pageTitle: string;
recentFiles: string[];
pageContents: string;
}
interface TopNavState {
userId: string;
pageTitle: string;
recentFiles: string[];
}
- ์์ ๊ฐ์ ๊ฒฝ์ฐ๊ฐ ์์ ๋ ์ด๋ป๊ฒ ์ค๋ณต๋ ํ์ ์ ์ ๊ฑฐํ ๊น?
- ์ฒซ๋ฒ์งธ ์์ด๋์ด๋ก๋ TopNavState ๋ฅผ ํ์ฅํ์ฌ State ๋ฅผ ๋ง๋๋๊ฒ ์๋ค. ํ์ง๋ง ๊ทธ๊ฒ ์ณ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ผ๊น? ์๋ํ๋ฉด TopNavState ๋ ๊ฒฐ๊ตญ State ์ ๋ถ๋ถ์งํฉ์ด๊ธฐ ๋๋ฌธ์ด๋ค!
interface TopNavState {
userId: State[userId];
pageTitle: State[pageTitle];
recentFiles: State[RecentFiles];
}
- ์ด๋ ๊ฒ ํ๋ฉด ๋์ง ์์๊น?
- ๋ ์ข์ ๋ฐฉ๋ฒ์ ๋งคํ๋ ํ์ ์ ์ด์ฉํ๋ ๊ฒ!
type TopNavState = {
[k in 'userId' | 'pageTitle' | 'recentFiles']: State[k];
};
- ์์ ๊ฐ์ ๋งคํ๋ ํ์ ์ ๋ฐฐ์ด ํ๋๋ฅผ ๋ฃจํ ๋๋๊ฒ๊ณผ ๊ฐ์ ๋ฐฉ์์ด๋ค.
- ์ฌ์ค ์๋ ์๋์ ํ์ค์ ์ ํธ๋ฆฌํฐํ์ ์ผ๋ก ๊ตฌํ ๊ฐ๋ฅํ๋ค.
type TopNavState = Pick<State, 'userId' | 'pageTitle' | 'recentFiles'>;
์ ๋ค๋ฆญ ํ์
- ์ ๋ค๋ฆญ ํ์ ์.. ํ์ ์ ์ํ ํจ์๋ผ๊ณ ์๊ฐํ๋ฉด ์ฝ๋ค.
- ๊ทธ๋ฐ๋ฐ..์ ๋ค๋ฆญ ํ์ ์์ ๋งค๊ฐ๋ณ์๋ฅผ ์ ํ ํ ์ ์๋ ๋ฐฉ๋ฒ์..?!
- ๋ฐ๋ก extends ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
- extends ๋ฅผ ์ด์ฉํ๋ฉด ์ ๋ค๋ฆญ ๋งค๊ฐ๋ณ์๊ฐ ํน์ ํ์ ์ ํ์ฅํ๋ค๊ณ ์ ์ธํ๋ ๊ฒ ์ด๋ค.
type Pick<T, K> = {
[k in K]: T[k];
};
// K ํ์
์ 'string | number | symbol ' ํ์
์ ํ ๋น ํ ์ ์์ต๋๋ค.
- K๋ T ํ์ ๊ณผ ๋ฌด๊ดํ๊ณ ๋ฒ์๊ฐ ๋๋ฌด ๋๋ค.
- K ๋ ์ธ๋ฑ์ค๋ก ์ฌ์ฉ๋ ์ ์๋ string | number | symbol ์ด ๋์ด์ผํ๋ฉฐ, ์ค์ ๋ก ๋ฒ์๋ฅผ ๋ ์ขํ ์ ์์ด์ผ ํ๋ค.
type Pick<T, K extends keyof T> = {
[k in K]: T[k];
};
๋์ ๋ฐ์ดํฐ์ ์ธ๋ฑ์ค ์๊ทธ๋์ณ ์ฌ์ฉํ๊ธฐ
์ธ๋ฑ์ค ์๊ทธ๋์ณ์ ๋ฌธ์ ์
- ์๋ชป๋ ํค๋ฅผ ํฌํจํด ๋ชจ๋ ํค๋ฅผ ํ์ฉํ๋ค.
- ํน์ ํค๊ฐ ํ์ํ์ง ์๋ค.
- ํค๋ง๋ค ๋ค๋ฅธ ํ์ ์ ๊ฐ์ง ์ ์๋ค.
- ํ์ ์คํฌ๋ฆฝํธ ์๋์์ฑ ๊ธฐ๋ฅ์ด ์ง์๋์ง ์๋๋ค.
์ธ๋ฑ์ค ์๊ทธ๋์ณ๋ฅผ ์ฌ์ฉ ํด์ผ ํ๋๊ฒฝ์ฐ
- ๋ฐํ์ ๋ ๊น์ง, ๊ฐ์ฒด์ ์์ฑ์ ์ ์ ์์ ๊ฒฝ์ฐ.
- ์ด ๋์ฌ์ฉํ๊ฒ ๋๋ค๋ฉด, ์์ ํ ์ ๊ทผ์ ์ํด ์ธ๋ฑ์ค ์๊ทธ๋์ณ ๊ฐ ํ์ ์ undefined ๋ฅผ ์ถ๊ฐํ๋๋ก ํ์.
- ์ธ๋ฑ์ค ์๊ทธ๋์ณ์ ๋์์ Record, ๋งคํ๋ ํ์
- ํ์ง๋ง ์ ์ญ์ ์ํ์ ๋ฐ๋ฅด๊ธฐ ๋๋ฌธ์ ์ ๋งํ๋ฉด ์ ํํ ํ์ ์ ์ฌ์ฉํ์.
number ์ธ๋ฑ์ค ์๊ทธ๋์ณ ๋ณด๋ค๋ Array, ํํ, ArrayLike ์ฌ์ฉํ๊ธฐ
- ์๋ฐ์คํฌ๋ฆฝํธ๋ number ํ์ ์ ๊ฐ์ฒด์ ํค๋ก ํ์ฉํ์ง ์๋๋ค.
- ๋ฐฐ์ด์ ๊ฒฝ์ฐ๋ ๋ง์ฐฌ๊ฐ์ง๋กโฆ ํค๋ ๋ฌด์กฐ๊ฑด ๋ฌธ์์ด์ด๋ค.
- ํ์ง๋ง ํ์ ์คํฌ๋ฆฝํธ๋ ์ซ์ ํค๋ฅผ ํ์ฉํ๊ณ ๋ฌธ์์ด ํค์ ๋ค๋ฅธ ๊ฒ์ผ๋ก ์ด์ฉํ๋๋ก ๊ตฌํ๋์ด ์๋ค.
interface Array<T> {
// ...
[n: number]: T;
}
์ด๋ ๊ฒ ๋ง์ด๋ค.
- ํ์ง๋ง ๋ฐํ์์๋ ์ํฌ๋ง์คํฌ๋ฆฝํธ ํ์ค์ด ์์ ํ๋ ๊ฒ ์ฒ๋ผ ๋ฌธ์์ด ํค๋ก ์ธ์ํ๋ฏ๋ก, ์ด ์ฝ๋๋ ์์ ํ ๊ฐ์์ ์ฝ๋๋ผ๊ณ ํ ์ ์์ง๋ง ํ์ ์ฒดํฌ ์์ ์ ์ค๋ฅ๋ฅผ ์ก์ ์ ์์ด์ ์ ์ฉํ๋ค.
- ์ธ๋ฑ์ค ์๊ทธ๋์ณ๊ฐ number ๋ก ํ๊ธฐ๋์ด์๋ค๋ฉด ์ ๋ ฅํ ๊ฐ์ด number ์ฌ์ผ ํ๋ค๋ ๊ฒ์ ์๋ฏธํ์ง๋ง, ์ค์ ๋ฐํ์์ ์ฌ์ฉ๋๋ key ์ ํ์ ์ string ์ด ๋๋คโฆ!!
- ๋ฐ๋ผ์ ์ ๋งํ๋ฉด number ์ธ๋ฑ์ค ์๊ทธ๋์ณ๋ ์ฌ์ฉํ์ง ๋ง์.
ArrayLike
interface ArrayLike<T> {
readonly length: number;
readonly [n: number]: T;
}
- ๋ฐฐ์ด ๋ฉ์๋ (push, concat) ๊ณผ ๊ฐ์ ํ์ ์ ์ ์๋์ด ์์ง ์์์ ์ฌ์ฉํ ์ ์๋ค.
- ํํ ์ฒ๋ผ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ์ธ๋ฑ์ค๋ก์ ์ ๊ทผ๊ณผ length ์ ๊ทผ๋ง ํ์ฉํ๋ค.
๋ณ๊ฒฝ ๊ด๋ จ๋ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด readonly ์ฌ์ฉํ๊ธฐ
Readonly ๋ฐฐ์ด์ ํน์ง
-
๋ฐฐ์ด์ ์์๋ฅผ ์ฝ์ ์ ์์ง๋ง, ์ธ ์๋ ์๋ค.
-
length๋ฅผ ์ฝ์ ์ ์์ง๋ง, ๋ฐ๊ฟ ์ ์๋ค.
-
๋ฐฐ์ด์ ๋ณ๊ฒฝํ๋ pop์ ๋น๋กฏํ ๋ค๋ฅธ ๋ฉ์๋๋ฅผ ํธ์ถ ํ ์ ์๋ค.
-
number[] ๋ readonly number[] ๋ณด๋ค ๊ธฐ๋ฅ์ด ๋ง๊ธฐ ๋๋ฌธ์, readonly number[] ์ ์๋ธํ์ ์ด ๋๋ค.
-
๋ฐ๋ผ์ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๋ฐฐ์ด์ readonly ๋ฐฐ์ด์ ํ ๋น ๊ฐ๋ฅํ๋ค. (ํ์ง๋ง ๊ทธ ๋ฐ๋๋ ๋ถ๊ฐ๋ฅ!)
์๊ฒ (shallow) ๋์ํ๋ readonly
readonly string[][]; // 1๋ฒ
(readonly string[])[]; //2๋ฒ
-
1๋ฒ : ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๋ฐฐ์ด์ readonly ๋ฐฐ์ด
-
2๋ฒ : readonly ๋ฐฐ์ด์ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๋ฐฐ์ด
-
Readonly ์ ๋ค๋ฆญ๋ ์๊ฒ ๋์ํ๋ค.
const ์ readonly ์ ์ฐจ์ด
- const ๋ ์ฐธ์กฐํ์ ์ ๊ฒฝ์ฐ ๋ฉ์๋๋ฅผ ํตํด์ ์์ ๊ฐ๋ฅ ํ ์ ์๋ค.
- ๋ช ์์ ์ผ๋ก readonly ํ์ ์ ์ง์ ํด์ค ๊ฒฝ์ฐ, ์ฐธ์กฐํ์ ์ ์์ ๊ฐ๋ฅํ ๋ฉ์๋๋ค์ ์ฌ์ฉ ํ ์ ์๊ฒ ๋์ด์ ์ง์ญ๋ณ์๋ก์ ๋ํ๋๋ ๋ฒ๊ทธ๋ค์ ํด๊ฒฐ ํด์ค ์ ์๋ค.
์ถ๋ก ๊ฐ๋ฅํ ํ์ ์ ์ฌ์ฉํด ์ฅํฉํ ์ฝ๋ ๋ฐฉ์งํ๊ธฐ
ํ์ ์คํฌ๋ฆฝํธ๋ ํ์ ์ถ๋ก ์ ์ ํด์ค๋ค. ํ์ง๋ง ํ์ ์ถ๋ก ์ ์ํด์ค์๋ ๋ถ๊ตฌํ๊ณ , ๋ช ์์ ์ผ๋ก ํ์ ํ์ ํด์ผํ ๋๋ ์ธ์ ์ผ๊น?
1. ๊ฐ์ฒด ๋ฆฌํฐ๋ด์ ์ ์ํ ๋
why
- ์์ฌ ์์ฑ ์ฒดํฌ๋ฅผ ํด์ค๋ค.
- ๋ณ์๊ฐ ์ฌ์ฉ๋๋ ์๊ฐ์ด ์๋, ํ ๋นํ๋ ์์ ์ ์ค๋ฅ๊ฐ ํ์๋๋๋ก ํด์ค๋ค.
2. ํจ์์ ๋ฐํ๊ฐ์ ์ ์ ํ ๋
why
- ๋ฆฌํด ํ์ ์ ๋ช ์ํด์ฃผ์ง ์์ผ๋ฉด, ํจ์ ๋ด๋ถ์์ ์๋ชป๋ return error ๋ฅผ ์ก์์ฃผ์ง ๋ชปํ๋ค. ์ฆ, ๊ตฌํ๋ถ์์ ์๋ฌ๊ฐ ๋๋๊ฒ ์๋๋ผ ์คํ๋ถ, ํด๋น ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ณณ์์ ์๋ฌ๊ฐ ๋๋ค.
- ํจ์์ ๋ํด ๋ ๋ช ํํ๊ฒ ์ ์ ์๋ค.
- ๋ช ๋ช ๋ ํ์ ์ ์ฌ์ฉ ํ๊ธฐ ์ํด์.
๋ค๋ฅธ ํ์ ์๋ ๋ค๋ฅธ ๋ณ์๋ฅผ ์ฌ์ฉํ๊ธฐ
why?
- ์๋ก ๊ด๋ จ์ด ์๋ ๋ ๊ฐ์ ๊ฐ์ ๋ถ๋ฆฌํ๋ค.
- ๋ณ์๋ช ์ ๋ ๊ตฌ์ฒด์ ์ผ๋ก ์ง์ ์ ์๋ค.
- ํ์ ์ถ๋ก ์ ํฅ์์ํค๋ฉฐ, ํ์ ๊ตฌ๋ฌธ์ด ๋ถํ์ํด์ง๋ค.
- ํ์ ์ด ์ข ๋ ๊ฐ๊ฒฐํด์ง๋ค.
- let ๋์ const ๋ก ๋ณ์๋ฅผ ์ ์ธํ ์ ์๋ค.
- ํ์ ์ด ๋ฐ๋๋ ๋ณ์๋ ๋๋๋ก ํผํด์ผ ํ๋ฉฐ, ๋ชฉ์ ์ด ๋ค๋ฅธ ๊ณณ์๋ ๋ณ๋์ ๋ณ์๋ช ์ ์ฌ์ฉํ์.
ํ์ ๋ํ๊ธฐ
- ๋ฐํ์์ ๋ชจ๋ ๋ณ์๋ ์ ์ผํ ๊ฐ์ ๊ฐ์ง๋ค.
- ํ์ง๋ง, ํ์ ์คํฌ๋ฆฝํธ๊ฐ ์์ฑ๋ ์ฝ๋๋ฅผ ์ฒดํฌํ๋ ์ ์ ๋ถ์ ์์ ์ ๋ณ์๋ (๋ฐํ์ ์ ๊ฐ์ง ์ ์๋ ) ๊ฐ๋ฅ ํ ๊ฐ๋ค์ ์งํฉ์ธ ํ์ ์ ๊ฐ์ง๋ค.
- ์์๋ฅผ ์ฌ์ฉํด์ ๋ณ์๋ฅผ ์ด๊ธฐํ ํ ๋, ํ์ ์ ๋ช ์ํ์ง ์์ผ๋ฉด ํ์ ์ฒด์ปค๋ ํ์ ์ ๊ฒฐ์ ํด์ผ ํ๋ค.
- ์ฆ, ์ง์ ๋ ๋จ์ผ ๊ฐ์ ๊ฐ์ง๊ณ ํ ๋น ๊ฐ๋ฅํ ๊ฐ๋ค์ ์งํฉ์ ์ ์ถํด์ผ ํ๋ค๋ ๋ป์ด๋ค. => ๋ํ๊ธฐ(widening)
interface Vector3 {
x: number;
y: number;
z: number;
}
function getComponent(vector: Vector3, axis: 'x' | 'y' | 'z') {
return vector[axis];
}
let x = 'x';
let vec = { x: 10, y: 20, z: 30 };
getComponent(vec, x);
// ๋ฐํ์์ ๋์์ ์ ๋๋๋ฐ ํธ์ง๊ธฐ์์ ์๋์ ๊ฐ์ ์ค๋ฅ ๋์ด
// ~ 'string' ํ์์ ์ธ์๋ "x" | "y" | "z" ํ์์ ๋งค๊ฐ๋ณ์์ ํ ๋น๋ ์ ์์ต๋๋ค.
- getComponent ํจ์๋ ๋๋ฒ์งธ ๋งค๊ฐ๋ณ์์ โxโ | โyโ | โzโ ํ์ ์ ๊ธฐ๋ํ์ง๋ง x ์ ํ์ ์ ํ ๋น ์์ ์ ๋ํ๊ธฐ๊ฐ ๋์ํด์ string ์ผ๋ก ์ถ๋ก ๋์๋ค.
- ๋ฐ๋ผ์ string ํ์ ์ โxโ | โyโ | โzโ ํ์ ์ ํ ๋น์ด ๋ถ๊ฐ๋ฅํ๋ฏ๋ก ์ค๋ฅ๊ฐ ๋๋ค.
๋ํ๊ธฐ์ ๊ณผ์ ์ ์ดํ๊ธฐ
- const ์ฌ์ฉํ๊ธฐ. (let ๋์ const ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ์ข์ ํ์ ์ด ๋๋ค.)
- ํ์ง๋ง const ์ญ์ ์ฐธ์กฐํ์ ๊ฒฝ์ฐ ..ํนํ ๋ฐฐ์ด์ ๊ฒฝ์ฐ ๋ฐฐ์ด์ ํํ ํ์ ์ ์ถ๋ก ํด์ผ ํ ์ง, ์์๋ค์ ์ด๋ค ํ์ ์ ์ถ๋ก ํ ์ง ์์์๋ค. ๊ฐ์ฒด๋ ๋ง๊ฐ์ง.
- ๊ฐ์ฒด์ ๊ฒฝ์ฐ ํ์ ์คํฌ๋ฆฝํธ์ ๋ํ๊ธฐ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ ์์๋ฅผ let ์ผ๋ก ํ ๋น ๋ ๊ฒ ์ฒ๋ผ ๋ค๋ฃฌ๋ค.
ํ์ ์คํฌ๋ฆฝํธ์ ๊ธฐ๋ณธ ๋์(์ถ๋ก )์ ์ฌ์ ์ ํ๊ธฐ
- ๋ช ์์ ํ์ ๊ตฌ๋ฌธ ์ ๊ณตํ๊ธฐ
- ํ์ ์ฒด์ปค์ ์ถ๊ฐ์ ์ธ ๋ฌธ๋งฅ์ ์ ๊ณตํ๋ ๊ฒ. (ํจ์์ ๋งค๊ฐ๋ณ์๋ก ๊ฐ์ ์ ๋ฌํ๊ธฐ.)
- const ๋จ์ธ๋ฌธ ์ฌ์ฉํ๊ธฐ.
const v2 = {
x: 1 as const,
y: 2,
};
// ํ์
์ { x: 1 ; y: number; }
const v3 = {
x: 1,
y: 2,
} as const;
// ํ์
์ { readonly x:1, readonly y:2 };
ํ์ ์ขํ๊ธฐ
- ํ์ ๋ํ๊ธฐ์ ๋ฐ๋
- ํ์ ์คํฌ๋ฆฝํธ๊ฐ ๋์ ํ์ ์ผ๋ก๋ถํฐ ์ข์ ํ์ ์ผ๋ก ์งํํ๋ ๊ณผ์
const el = document.getElementById('foo');
if (el) {
el;
el.innerHTML = ' wow '.blikc();
} else {
el;
alert('No Element');
}
- ๋ง์ฝ el ์ด null ์ด๋ฉด ๋ถ๊ธฐ๋ฌธ์ ์ฒซ ๋ฒ์งธ ๋ธ๋ก์ด ์คํ๋์ง ์๋๋ค. ์ฆ, ์ฒซ๋ฒ์งธ ๋ธ๋ก์์ HTMLElement | null ํ์ ์ null ํ์ ์ ์ ์ธํ๋ฏ๋ก ๋ ์ข์ ํ์ ์ด ๋์ด ์์ ์ด ํจ์ฌ ์ฌ์์ง๋ค.
- ํ์ ์ฒด์ปค๋ ์ผ๋ฐ์ ์ผ๋ก ์ด๋ฌํ ์กฐ๊ฑด๋ฌธ์์ ํ์ ์ขํ๊ธฐ๋ฅผ ์ํด๋ด์ง๋ง, ํ์ ๋ณ์นญ์ด ์กด์ฌํ๋ค๋ฉด ๊ทธ๋ฌ์ง ์์ ์ ์๋ค. -> ์์ผ๊น?! ํ์ ๋ณ์นญ์ ๋ํ๊ฑด ๋์ค์ ๋ค๋ฃฌ๋ค.
ํ์ ์ขํ๋ ๋ฐฉ๋ฒ
- ๋ถ๊ธฐ๋ฌธ์์ ์์ธ๋ฅผ ๋์ง๊ฑฐ๋ ํจ์๋ฅผ ๋ฐํํ์ฌ ๋ธ๋ก์ ๋๋จธ์ง ๋ถ๋ถ์์ ๋ณ์์ ํ์ ์ ์ขํ ์๋ ์๋ค.
- instanceof ๋ฅผ ํตํด์ ํ์ ์ ์ขํ๋ค. (๋ถ๊ธฐ๋ฌธ)
- ์์ฑ ์ฒดํฌ๋ก ํ์
์ฒดํฌํ๋ค.
a in ab
- Array.isArray ๊ฐ์ ๋ด์ฅํจ์๋ก ํ์ ์ขํ๋ค.
- ํ๊ทธ ๋ถ์ฌ์ โํ๊ทธ๋ ์ ๋์จ or ๊ตฌ๋ณ๋ ์ ๋์จ or ์๋ก์ ์ ๋์จโ ๋ง๋ค๊ธฐ
- ์๋ก์ ์ ๋์จ ํ์ ์ ์ฌ์ฉํ๋ฉด, ์๋ก ๊ฒน์น์ง ์๋ ์ฌ๋ฌ ๊ฒฝ์ฐ ์ค ํ๋์ธ ํ์ ์ ํํํ ์ ์๋ค.
- ์ธ์ ์ ์ฉํ ๊น..??
๋คํธ์ํฌ ์์ฒญ: ์์ฒญ์ ์ฑ๊ณตํ๊ฑฐ๋ ์คํจํ๊ฒ ์ง๋ง, ์ฑ๊ณตํ ๋์์ ์คํจํ ์๋ ์๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํน์ ์์ด๋๋ฅผ ๊ฐ๋ ์ปฌ๋ผ์ ์ฟผ๋ฆฌ: ํด๋น ์ปฌ๋ผ์ด ์๊ฑฐ๋ ์์ง๋ง, ์์ผ๋ฉด์ ์์ ์๋ ์๋ค.
์ด๋ค ํ์ผ๋ช
์ ๊ฐ๋ ํ์ผ ๋ด์ฉ์ ์ฝ์ด์ค๋ ๊ฒฝ์ฐ: ํด๋น ํ์ผ์ด ์๊ฑฐ๋ ์์ง๋ง, ์์ผ๋ฉด์ ์์ ์๋ ์๋ค.
- ์๋ก์ ์ ๋์จ ํ์ ์์๋ ์๋ก ๊ฒน์น๋๊ฒ ์๋ค. ๋ฐ๋ผ์ switch ๋ฌธ์ ์ฌ์ฉํด์ ํน์ ํ์ ์ด๋ฉด ~ ์ด๋ค ๋์์ ํ๋๋ก ์ ๋ํ ์ ์๋ค. https://ahnheejong.gitbook.io/ts-for-jsdev/06-type-system-deepdive/disjoint-union-type
// ์ฌ์ฉ์ ์ ์ ํ์
๊ฐ๋!
function isInputElement (el: HTMLElement): el is HTMLInputElement {
return 'value' in el;
}
function getElementContent(el: HTMLElement){
if(isInputElement(el){
return el.value;
}
}
function isDefined<T>(x: T | undefined): x is T {
return x !== undefined;
}
- ์ฃผ์ํด์ผํ ๊ฒโฆ ์๋ฐ์คํฌ๋ฆฝํธ์์
typeof null === 'object'
ํ๊บผ๋ฒ์ ๊ฐ์ฒด ์์ฑํ๊ธฐ
- ์์ฑ์ ๊ฐ์ฒด์ ๊ฐ๊ฐ ์ถ๊ฐํ์ง ๋ง๊ณ ํ๊บผ๋ฒ์ ๊ฐ์ฒด๋ก ๋ง๋ค์ด์ผ ํ์ ์ถ๋ก ์ด ์๋๋ค.
์กฐ๊ฑด๋ถ๋ก ๊ฐ์ฒด์ ์์ฑ ์ถ๊ฐํ๊ธฐ
function addOptional<T extends object, U extends object>(a: T, b: U | null): T & Partial<U> {
return { ...a, ...b };
}
const pharaoh = addOptional(nameTItle, hasDates ? { start: -2589, end: -2566 } : null);
์ผ๊ด์ฑ ์๋ ๋ณ์นญ ์ฌ์ฉํ๊ธฐ
- ๋ณ์นญ..?! ์๋์ ๊ฐ์ ์์!
const state = { location: 1 };
const loc = state.location; // ์๊ฒ ๋ณ์นญ!
- ๋ณ์นญ์ ์ฌ์ฉํ๋ฉด ํ์ ์คํฌ๋ฆฝํธ๊ฐ ํ์ ์ ์ขํ๋ ๊ฒ์ ๋ฐฉํดํ๋ค
- ๋ณ์นญ์ ๊ฐ์ ๋ฐ๊พธ๋ฉด ์๋ณธ ๊ฐ์ฒด์ ๊ฐ๋ ๋ณ๊ฒฝ๋๊ธฐ ๋๋ฌธ์ด๋ค.
๋น๋๊ธฐ ์ฝ๋์๋ ์ฝ๋ฐฑ ๋์ async ํจ์ ์ฌ์ฉํ๊ธฐ
์ฝ๋ฐฑ๋ณด๋ค๋ ํ๋ก๋ฏธ์ค ์ฌ์ฉํ๊ธฐ
- ์ฝ๋ฐฑ๋ณด๋ค ํ๋ก๋ฏธ์ค๊ฐ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ฝ๋ค.
- ์ฝ๋ฐฑ๋ณด๋ค ํ๋ก๋ฏธ์ค๊ฐ ํ์ ์ถ๋ก ์ด ์ฝ๋ค.
- ํ์ ์คํฌ๋ฆฝํธ๋ ํ๋ก๋ฏธ์ค๋ฅผ ์ ์ถ๋ก ํ๋ค!
ํ๋ก๋ฏธ์ค๋ฅผ ์์ฑํ๊ธฐ ๋ณด๋ค async/await ์์ฑํ๊ธฐ
- ์ผ๋ฐ์ ์ผ๋ก ๋ ๊ฐ๊ฒฐํ๊ณ ์ง๊ด์ ์ธ ์ฝ๋๊ฐ ๋๋ค.
- async ํจ์๋ ํญ์ ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํ๋๋ก ๊ฐ์ ํ๋ค.
- async ํจ์์์ ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํ๋ฉด, ๋ ๋ค๋ฅธ ํ๋ก๋ฏธ์ค๋ก ๋ํ๋์ง ์๋๋ค. ์ฆ ๋ฐํํ์
์ด
Promise<Promise<T>>
๊ฐ ์๋๋ผ,Promise<T>
๊ฐ ๋๋ค.
ํ์ ์ถ๋ก ์ ๋ฌธ๋งฅ์ด ์ด๋ป๊ฒ ์ฌ์ฉ๋๋์ง ์ดํดํ๊ธฐ
- ํ์ ์คํฌ๋ฆฝํธ๋ ํ์ ์ ์ถ๋ก ํ ๋, ๋จ์ํ ๊ฐ๋ง ๊ณ ๋ คํ์ง ์๋๋ค! ๊ฐ์ด ์กด์ฌํ๋ ๊ณณ์ ๋ฌธ๋งฅ๊น์ง ์ดํ๋ค.
type Language = 'JavaScript' | 'TypeScript';
function setLanguage(language: Language) {}
setLanguage('JavaScript'); // ์ ์
let language = 'JavaScript';
setLanguage(language); // Error
// 'string' ํ์์ ์ธ์๋ 'Language' ํ์์ ๋งค๊ฐ๋ณ์์ ํ ๋น ๋ ์ ์์ต๋๋ค.
- why?
- ํ์ ์คํฌ๋ฆฝํธ๋ ํ ๋น ์์ ์ ํ์ ์ ์ถ๋ก ํ๋ค.
- ๋ฐ๋ผ์ string ์ผ๋ก ์ถ๋ก ๋๊ฒโฆ
ํด๊ฒฐ๋ฐฉ๋ฒ
- ํ์ ์ ์ธํ๊ธฐ
let language: Language = 'JavaScript';
- ์์๋ก ๋ง๋ค๊ธฐ
const language = 'JavaScript';
- ํ์ ์ฒด์ปค์๊ฒ language ๋ณ์๋ ๋ณํ ์ ์๋ค๊ณ ์๋ ค์ค์ ํ์ ์ ์ขํ๋ค.
ํํ ์ฌ์ฉ
function panTo(where:[number,number]){}
panTo([10,20]); // ์ ์
conset loc = [10,20];
panTo(loc);
// number[] ํ์์ ์ธ์๋
// [number,number] ํ์์ ๋งค๊ฐ๋ณ์์ ํ ๋น๋ ์ ์์ต๋๋ค.
- const ๋ ์๋จนํ๋ค. ์? ๋น์ฐํ ์ฐธ์กฐํ์ ์ด๊ธฐ ๋๋ฌธ์!
ํด๊ฒฐํ๊ธฐ as const
function panTo(where: [number, number]) {}
const loc = [10, 20] as const;
panTo(loc);
// Error: readonly[10,20] ํ์์
// ๋ณ๊ฒฝ๊ฐ๋ฅํ ํ์ [number,number] ์ ํ ๋น ํ ์ ์์ต๋๋ค.
- panTo ์ ๋งค๊ฐ๋ณ์ ํ์ ์ readonly ๋ก ๋ฐ๊ฟ์ผํจ.
- as const ๋ ์์๊ฐ์ด ๋ฌธ๋งฅ ์์ค๊ณผ ๊ด๋ จ๋ ๋ฌธ์ ๋ฅผ ๊น๋ํ๊ฒ ํด๊ฒฐํ์ง๋ง, ๋จ์ ์ด์์.
- ํ์ ์ ์์ ์ค์๊ฐ ์๋ค๋ฉด ์ค๋ฅ๋ ํ์ ์ ์๊ฐ ์๋๋ผ ํธ์ถ๋๋ ๊ณณ์์ ๋ฐ์ํ๋ค๋ ๊ฒ.
์ ํจํ ์ํ๋ง ํํํ๋ ํ์ ์ ์งํฅํ๊ธฐ
interface State {
pageText: string;
isLoading: boolean;
error?: string;
}
์์ ๊ฐ์ ํ์ ์ด ์๋ค๋ฉด..
- isLoading ์ด true ์ด๊ณ ๋์์ error ๊ฐ์ด ์กด์ฌํ๋ ์ํ..๋ฅผ ์ฐ๋ฆฌ๋ ์์ ํ์ ์ผ๋ก ์ ์ ์๋ค.
- ์ฆ ์์ ํ์ ์ isLoading ์ด true ์ด๋ฉด์ error ๊ฐ์ด ์ค์ ๋๋ ๋ฌดํจํ ์ํ๋ฅผ ํ์ฉํด๋ฒ๋ฆฐ๋ค!
interface RequestPending {
state: 'pending';
}
interface RequestError {
state: 'error';
error: string;
}
interface RequestSuccess {
state: 'ok';
pageText: string;
}
type RequestState = RequestPending | RequestError | RequestSuccess;
interface State {
currentPage: string;
requests: { [page: string]: RequestState };
}
์ฌ์ฉํ ๋๋ ๋๊ทธ๋ฝ๊ฒ, ์์ฑํ ๋๋ ์๊ฒฉํ๊ฒ
- ํจ์์ ๋งค๊ฐ๋ณ์ ํ์ ์ ํ์ ์ ๋ฒ์๊ฐ ๋์ด๋ ๋๋ค. (์ฌ์ฉ ์)
- ๋ฐํ๋๋ ๊ฒฐ๊ณผ์ ํ์ ์ ๋ฒ์๊ฐ ๋ ๊ตฌ์ฒด์ ์ด์ด์ผ ํ๋ค. (์์ฑ ์)
๋ฌธ์์ ํ์ ์ ๋ณด๋ฅผ ์ฐ์ง ์๊ธฐ
- ์ฃผ์๊ณผ ๋ณ์๋ช ์ ํ์ ์ ๋ณด๋ช ์ ์ ๋ ๊ฒ์ ํผํ๊ธฐ.
ํ์ ์ฃผ๋ณ์ null ๊ฐ ๋ฐฐ์นํ๊ธฐ
- B ๋ณ์๊ฐ A ๋ณ์์ ๊ฐ์ผ๋ก๋ถํฐ ๋น๋กฏ๋๋ ๊ฐ์ด๋ผ๋ฉด, A ๊ฐ null ์ด ๋ ์ ์์๋ B ์ญ์ null ์ด ๋ ์ ์๊ณ , ๊ทธ ๋ฐ๋๋ก A ๊ฐ null ์ด ๋ ์ ์๋ค๋ฉด B ์ญ์ null ์ด ๋ ์ ์๋ค.
- ๊ฐ์ด ์ ๋ถ null ์ด๊ฑฐ๋ ์ ๋ถ null ์ด ์๋ ๊ฒฝ์ฐ๋ก ๋ถ๋ช ํ ๊ตฌ๋ถ๋๋ค๋ฉด, ๊ฐ์ด ์์ฌ ์์ ๋ ๋ณด๋ค ๋ค๋ฃจ๊ธฐ ์ฝ๋ค.
- ํ์ ์ null ์ ์ถ๊ฐํ๋ ๋ฐฉ์์ผ๋ก ์ด๋ฌํ ๊ฒฝ์ฐ๋ฅผ ๋ชจ๋ธ๋ง ํ ์ ์๋ค.
function extent(nums: number[]) {
let min, max;
for (const num of nums) {
if (!min) {
min = num;
max = num;
} else {
min = Math.min(min, num);
max = Math.max(max, num);
// 'number' | 'undefined' ํ์์ ์ธ์๋ 'number' ํ์์ ๋งค๊ฐ๋ณ์์ ํ ๋น ๋ ์ ์์ต๋๋ค.
}
}
return [min, max];
}
- nums ๋ฐฐ์ด์ด 0 ์ผ๋ก ์์ํ๋ฉด..์ ๋๋ก ๋ ๋์์ด ์๋๋ค. (0์ด Nullish ํ๋ฏ๋ก)
- nums ๋ฐฐ์ด์ด ๋น์ด์๋ค๋ฉด ํจ์๋
[undefined,undefined]
๋ฅผ ๋ฐํํ๋ค. - ์์์ undefined ๋ฅผ min ์์๋ง ์ ์ธํ๊ณ , max ๋ ์ ์ธํ์ง ์์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. ๊ทธ๋ ๋ค๊ณ max ์ ๋ํ ์ฒดํฌ๋ฅผ ์ถ๊ฐํ๋ฉดโฆ๋ฒ๊ทธ๊ฐ ๋ ๋ฐ์ํ๋ค!!
- ๋ ๋์ ํด๋ฒ์ ์ฐพ์๋ณด๊ธฐ
function extent(nums: number[]) {
let result: [number, number] | null = null;
for (const num of nums) {
if (!result) {
result = [num, num];
} else {
result = [Math.min(result[0], num), Math.max(result[1], num)];
}
}
return result;
}
-
extent ์ ๊ฒฐ๊ด๊ฐ์ผ๋ก ๋จ์ผ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ์ค๊ณ ๊ฐ์
-
๋ฐ๋ผ์ ํ์ ์คํฌ๋ฆฝํธ๊ฐ null ๊ฐ ์ฌ์ด์ ๊ด๊ณ (min์ด null ์ด๋ฉด max ๋ null , vice versa)๋ฅผ ์๋ค.
-
์ฆ ํ ๊ฐ์ null ์ฌ๋ถ๊ฐ ๋ค๋ฅธ ๊ฐ์ null ์ฌ๋ถ์ ์์์ ์ผ๋ก ๊ด๋ จ๋๋๋ก ์ค๊ณํ์ง ๋ง๊ธฐ
-
API ์์ฑ ์์๋ ๋ฐํ ํ์ ์ ํฐ ๊ฐ์ฒด๋ก ๋ง๋ค๊ณ ๋ฐํ ํ์ ์ ์ฒด๊ฐ null ์ด๊ฑฐ๋ null ์ด ์๋๊ฒ ๋ง๋ค์ด์ผ ํ๋ค.
-
ํด๋์ค๋ฅผ ๋ง๋ค ๋๋, ํ์ํ ๋ชจ๋ ๊ฐ์ด ์ค๋น ๋์์ ๋ ์์ฑํ์ฌ null ์ด ์กด์ฌํ์ง ์๋๋ก ํ์.
์ ๋์จ์ ์ธํฐํ์ด์ค ๋ณด๋ค๋ ์ธํฐํ์ด์ค์ ์ ๋์จ ์ฌ์ฉํ๊ธฐ
interface Layer {
layout: FillLayout | LineLayout | PointLayout;
paint: FillPaint | LinePaint | PointPaint;
}
- ์์ ํ์ ์ ๊ฒฝ์ฐ..
- layout ์ด FillLayout ์ด๋ฉด์ paint ๊ฐ LinePaint ์ธ๊ฑด ๋ง์ด ๋์ง ์๋๋ฐ ์ด๋ฌํ ์กฐํฉ์ ํ์ฉํ๊ฒ ๋๋ค!
- ์๋์ ๊ฐ์ด ํ์ ๊ณ์ธต์ ๋ถ๋ฆฌํ์. ์๋ก์ ์ ๋์จ ํ์ ์ผ๋ก ๋ง๋ค ์ ์๋ค.
interface FillLayer {
layout: FillLayout;
paint: FillPaint;
}
interface LineLayer {
layout: LineLayout;
paint: LinePaint;
}
interface PointLayer {
layout: PointLayout;
paint: PointPaint;
}
type Layer = FillLayer | LineLayer | PointLayer;
- ๋ ๋์๊ฐ์ ํ๊ทธ๋ ์ ๋์จ ํ์ ์ผ๋ก ๋ฆฌํฉํฐ๋งํ์
interface FillLayer {
type: 'fill';
layout: FillLayout;
paint: FillPaint;
}
interface LineLayer {
type: 'line';
layout: LineLayout;
paint: LinePaint;
}
interface PointLayer {
type: 'point';
layout: PointLayout;
paint: PointPaint;
}
type Layer = FillLayer | LineLayer | PointLayer;
- ํ๊ทธ๋ ์ ๋์จ.. ํ๊ทธ๋? ๋ฐํ์์ ์ด๋ค ํ์ ์ Layer ๊ฐ ์ฌ์ฉ๋๋์ง ํ๋จํ๋๋ฐ ์ฐ์ธ๋ค.
- ์์ ์์์์ ํ๊ทธ๋ type ์ด ๋๋ค!
์์ 2
interface Person {
name: string;
placeOfBirth?: string;
dateOfBirth?: number;
}
- placeOfBirth ์์ฑ๊ณผ dateOfBirth ์์ฑ์ด ๋ ๋ค ๋์์ ์๊ฑฐ๋ ์์ด์ผ ํ๋๋ฐ, ํ๋๋ง ์กด์ฌํ๋ ์กฐํฉ์ด ์์ฑ ๊ฐ๋ฅํ๋ค
interface Person {
name: string;
birth?: {
place: string;
date: number;
};
}
- ์์ฒ๋ผ ๋๊ฐ์ ์์ฑ์ ํ๋์ ๊ฐ์ฒด๋ก ๋ชจ์ผ์.
- null ๊ฐ์ ๊ฒฝ๊ณ๋ก ๋๋๊ฒ๊ณผ ๋น์ทํ๊ตฌ๋ง!
string ํ์ ๋ณด๋ค ๋ ๊ตฌ์ฒด์ ์ธ ํ์ ์ฌ์ฉํ๊ธฐ
- ๋ณ์์ ๋ฒ์๋ฅผ ๋ณด๋ค ์ ํํ๊ฒ ํํํ๊ณ ์ถ๋ค๋ฉด string ํ์ ๋ณด๋ค๋ ๋ฌธ์์ด ๋ฆฌํฐ๋ด ํ์ ์ ์ ๋์จ ํ์ ์ ์ฌ์ฉํฉ์๋ค.
- ๊ฐ์ฒด ์์ฑ ์ด๋ฆ์ ํจ์ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์ ๋๋ string ๋ณด๋ค keyof T ๋ฅผ ์ฌ์ฉํฉ์๋ค.
function pluck(records: any[], key: string): any[] {
return records.map((r) => r[key]);
}
ํ์ ์๊ทธ๋์ฒ ๊ฐ์ 1 ๋ฒ
function pluck<T>(records: T[], key: string): any[] {
return records.map((r) => r[key]);
}
- ์๋ฌ๋จ
- key ํ์ ์ด string ์ด๋ผ์ ๋๋ฌด ๋์ด์.
๊ฐ์ 3๋ฒ
function pluck<T>(records: T[], key: keyof T): T[keyof T][] {
return records.map((r) => r[key]);
}
- ํ์ง๋ง.. ๋ง์ฝ T[โdateโ] ๋ ํ์
์ด Date ์ด๊ตฌ.. T[โtitleโ] ํ์
์ด String ์ด๋ผ๋ฉด.. ์์
T[keyof T][]
ํ์ ์(string | Date) []
์ด ๋๋ค. - ๊ทธ๋ฐ๋ฐโฆ key ๊ฐ์ด ํ๋๋ง ๋ค์ด๊ฐ๋ฉด, ์ฆ ๋งค๊ฐ๋ณ์๋ก ๋ง์ฝ โdateโ ๋ง ๋ค์ด๊ฐ๋๋ฐ ๋ฐํํ์
์ด
(string | Date) []
์ธ๊ฑฐ๋ฉด ๋๋ฌด ๋๋ค! - ๋ฐ๋ผ์ ๊ฐ์ ํ๊ธฐ ์ํด์ keyof T ์ ๋ถ๋ถ์งํฉ์ผ๋ก ๋๋ฒ์งธ ์ ๋๋ฆญ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฃ์
๊ฐ์ 2๋ฒ
function pluck<T, K extends keyof T>(records: T[], key: K): T[K][] {
return records.map((r) => r[key]);
}
๋ถ์ ํํ ํ์ ๋ณด๋ค๋ ๋ฏธ์์ฑ์ ํ์ ์ฌ์ฉํ๊ธฐ
- ํ์ ์ด ์๋ ๊ฒ ๋ณด๋ค ๋ถ์ ํํ๊ฒ ๋ ๋์๋ค.
- ์ ํํ๊ฒ ํ์ ์ ๋ชจ๋ธ๋ง ํ ์ ์๋ค๋ฉด, ๋ถ์ ํํ๊ฒ๋ ๋ชจ๋ธ๋งํ์ง๋ง์.
๋ฐ์ดํฐ๊ฐ ์๋, API ์ ๋ช ์ธ๋ฅผ ๋ณด๊ณ ํ์ ๋ง๋ค๊ธฐ
- ์์ ๋ฐ์ดํฐ๋ฅผ ์ฐธ๊ณ ํด ํ์ ์ ์์ฑํ๋ฉด ๋์์ ์๋ ๋ฐ์ดํฐ๋ค๋ง ๊ณ ๋ คํ๊ฒ ๋๋ฏ๋ก ์๊ธฐ์น ์์ ๊ณณ์์ ์ค๋ฅ๊ฐ ๋ฐ์ ํ ์ ์๋ค.
- ๋ฐ์ดํฐ์ ๋๋ฌ๋์ง ์๋ ์์ธ์ ์ธ ๊ฒฝ์ฐ๋ค์ด ๋ฌธ์ ๊ฐ ๋ ์ ์์ผ๋ฏ๋ก, ๋ฐ์ดํฐ๋ณด๋ค๋ ๋ช ์ธ๋ก๋ถํฐ ์ฝ๋๋ฅผ ์์ฑํ์.
ํด๋น๋ถ์ผ์ ์ฉ์ด๋ก ํ์ ์ด๋ฆ ์ง๊ธฐ
- ์์ฒด์ ์ผ๋ก ์ฉ์ด๋ฅผ ๋ง๋ค์ด ๋ด๋ ค๊ณ ํ์ง ๋ง๊ณ , ํด๋น ๋ถ์ผ์ ์ด๋ฏธ ์กด์ฌํ๋ ์ฉ์ด๋ฅผ ์ฌ์ฉํ์.
- ๋์ผํ ์๋ฏธ๋ฅผ ๋ํ๋ผ ๋๋ ๊ฐ์ ์ฉ์ด๋ฅผ ์ฌ์ฉํ์.
- data, info, thing, item, object, entity ์ ๊ฐ์ ๋ชจํธํ๊ณ ์๋ฏธ ์๋ ์ด๋ฆ์ ํผํ์.
- ์ด๋ฆ์ ์ง์ ๋๋ ํฌํจ๋ ๋ด์ฉ์ด๋, ๊ณ์ฐ ๋ฐฉ์์ด ์๋๋ผ ๋ฐ์ดํฐ ์์ฒด๊ฐ ๋ฌด์์ธ์ง ๊ณ ๋ คํ์. INodeList ๋ณด๋ค Directory ๊ฐ ๋ ์๋ฏธ์๋ ์ด๋ฆ์ด๋ค.
- ์? Directory ๋ ๊ตฌํ์ ์ธก๋ฉด์ด ์๋๋ผ ๊ฐ๋ ์ ์ธ ์ธก๋ฉด์์ ๋๋ ํฐ๋ฆฌ๋ฅผ ์๊ฐํ๊ฒ ํ๋ค.
- ์ข์ ์ด๋ฆ์ ์ถ์ํ์ ์์ค์ ๋์ด๊ณ , ์๋์น ์์ ์ถฉ๋์ ์ํ์ฑ์ ๋ฎ์ถ๋ค.
๊ณต์ ๋ช ์นญ์๋ ์ํ๋ฅผ ๋ถ์ด๊ธฐ
- ๊ตฌ์กฐ์ ํ์ดํ์ ํน์ฑ ๋๋ฌธ์ ์ฝ๋๊ฐ ์ด์ํ ๊ฒฐ๊ณผ๋ฅผ ๋ผ ์ ์๋ค.
interface Vector2D {
x: number;
y: number;
}
function calculateNorm(p: Vector2D) {}
const vec3D = { x: 3, y: 4, z: 1 };
calculateNorm(vec3D); // ์ ์!!
- ์ํ์ ์ผ๋ก๋ 2์ฐจ์ ๋ฒกํฐ๋ฅผ ์ฌ์ฉํด์ผ ์ด์น์ ๋ง๋๋ค.
- calculateNorm ํจ์๊ฐ 3์ฐจ์ ๋ฒกํฐ๋ฅผ ํ์ฉํ์ง ์๊ฒ ํ๋ ค๋ฉด ๊ณต์ ๋ช ์นญ(Nominal typing) ์ ์ฌ์ฉํ์
- ๊ณต์ ๋ช ์นญ์ ์ฌ์ฉํ๋ค๋ ๊ฒ์, ํ์ ์ด ์๋๋ผ ๊ฐ์ ๊ด์ ์์ Vector2D ๋ผ๊ณ ๋งํ๋ ๊ฒ!
interface Vector2D {
_brand: '2D';
x: number;
y: number;
}
function calculateNorm(p: Vector2D) {}
const vec3D = { x: 3, y: 4, z: 1 };
calculateNorm(vec3D); // _brand ์์ฑ์ด ํ์์ ์์ต๋๋ค.
- ๋ธ๋๋ฉ ๊ธฐ๋ฒ์ ํ์ ์์คํ ์์ ๋์ํ์ง๋ง, ๋ฐํ์์ ๋ธ๋๋๋ฅผ ๊ฒ์ฌํ๋ ๊ฒ๊ณผ ๋์ผํ ํจ๊ณผ๋ฅผ ์ป์ ์ ์๋ค.
- ํ์ ์์คํ ์ด๊ธฐ ๋๋ฌธ์ ๋ฐํ์ ์ค๋ฒํค๋๋ฅผ ์ค์ผ ์ ์๊ณ , ์ถ๊ฐ์์ฑ์ ๋ถ์ผ ์ ์๋ string ์ด๋ number์ ๊ฐ์ ๋ด์ฅ ํ์ ๋ ์ํํํ ์ ์๋ค.
type AbsoultePath = string & { _brand: 'abs' };
function listAbsolutePath(path: AbsoultePath) {
// ..
}
function isAbsolutePath(path: string): path is AbsoultePath {
return path.startsWith('/');
}
function f(path: string) {
if (isAbsolutePath(path)) {
listAbsolutePath(path);
}
listAbsolutePath(path); // error
}
- ์ด๋ฐ ์์ผ๋ก ์ํ(brand)๋ฅผ ๋ถ์ฌ์, ํ์ ์ด ํน์ ํ ์ฑ๊ฒฉ์ ๊ฐ์ก๋์ง ๊ตฌ๋ถํ ์ ์๋ค.
- ์ด๋, ๋ฐํ์์ if ๋ฌธ์ผ๋ก ์ฒดํฌํ๋ ๊ฒ๊ณผ ๊ฐ์ ํจ๊ณผ๋ฅผ ๋ด์ง๋ง, ๋ฐํ์์ด ์๋๋ผ ํ์ ์์คํ ์ผ๋ก ์๋ํ๊ธฐ ๋๋ฌธ์ ๋ฐํ์ ์ค๋ฒํค๋๊ฐ ์๋ค!
any ํ์ ์ ๊ฐ๋ฅํ ํ ์ข์ ๋ฒ์์์๋ง ์ฌ์ฉํ๊ธฐ
type Bar = 'example';
function processBar(b: Bar) {}
function f1() {
const x: any = 'foo';
processBar(x); // ์ด๋ ๊ฒ ํ์ง๋ง์์ค
}
function f2() {
const x = 'foo';
processBar(x as any); // ์ด๊ฒ ๋ซ๋ค.
}
- ์ 2๋ฒ์ด ๋ซ๋๊ฐ..?
- 2๋ฒ์์ any ํ์ ์ processBar ํจ์์ ๋งค๊ฐ๋ณ์์์๋ง ์ฌ์ฉ๋ ํํ์์ด๋ฏ๋ก ๋ค๋ฅธ ์ฝ๋์ ์ํฅ์ ๋ฏธ์น์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
- ์ฆ, f1 ์์ ํจ์์ ๋ง์ง๋ง๊น์ง x ์ ํ์ ์ด any ์ธ ๋ฐ๋ฉด, f2 ์์๋ processBar ํธ์ถ ์ดํ x ๊ฐ ๋ค์ ์๋ ํ์ ์ผ๋ก ๋์๊ฐ๋ค.
- ๋ํ f1 ์์ ์ค์๊ฐ์ x ๋ฅผ ๋ฆฌํดํ๋ค๋ฉด..?! -> ํด๋น ํจ์๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ๊ณณ์์ any ํ์ ์ด ์ ์ผ๋ณ์ฒ๋ผ ํผ์ง๋ค.
- ๋น์ทํ ๊ด์ ์์ ํ์ ์คํฌ๋ฆฝํธ๊ฐ ํจ์์ ๋ฐํ ํ์ ์ ์ถ๋ก ํ ์ ์๋ ๊ฒฝ์ฐ์๋ ํจ์์ ๋ฐํ ํ์ ์ ๋ช ์ํด์ผ ํ๋ค. ํจ์์ ๋ฐํ ํ์ ์ ๋ช ์ํ์ฌ any ํ์ ์ด ํจ์ ๋ฐ๊นฅ์ผ๋ก ์ํฅ์ ๋ฏธ์น๋ ๊ฒ์ ๋ฐฉ์ง ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
any ๋ฅผ ๊ตฌ์ฒด์ ์ผ๋ก ๋ณํํด์ ์ฌ์ฉํ๊ธฐ
- any ๋ฅผ ์ฌ์ฉ ํ ๋๋ ์ ๋ง ๋ชจ๋ ๊ฐ์ด ํ์ฉ๋์ด์ผ ํ๋์ง ๊ฒํ ํ๊ณ ์ฌ์ฉํ๊ธฐ.
- any ๋ณด๋ค ์ ํํ๊ฒ ๋ชจ๋ธ๋ง ํ ์ ์๋๋ก any[] ๋๋ {[id:string]:any} ๋ฅผ ์ฌ์ฉํ์
{[key: string]: any} ์ object ํ์
์ ์ฐจ์ด์
- object ํ์ ์ ๊ฐ์ฒด์ ํค๋ฅผ ์ด๊ฑฐํ ์ ์์ง๋ง, ์์ฑ์ ์ ๊ทผ ํ ์ ์๋ค.
ํจ์ ์์ผ๋ก ํ์ ๋จ์ธ๋ฌธ ๊ฐ์ถ๊ธฐ
- ์ธ๋ถ๋ก ๋๋ฌ๋ ํ์ ์ ์๋ ๊ฐ๋จํ์ง๋ง, ๋ด๋ถ ๋ก์ง์ด ๋ณต์กํด์ ์์ ํ ํ์ ์ผ๋ก ๊ตฌํํ๊ธฐ ์ด๋ ค์ด ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
- ํจ์ ๋ด๋ถ์๋ ํ์ ๋จ์ธ์ ์ฌ์ฉํ๊ณ , ํจ์ ์ธ๋ถ๋ก ๋๋ฌ๋๋ ํ์ ์ ์๋ฅผ ์ ํํ ๋ช ์ํ๋ ์ ๋๋ก ํํ์ ๋ด๋ ๊ด์ฐฎ๋ค.
- ํ๋ก์ ํธ ์ ๋ฐ์ ์ํํ ํ์ ๋จ์ธ๋ฌธ์ด ๋๋ฌ๋ ์๋ ๊ฒ ๋ณด๋ค, ์ ๋๋ก ํ์ ์ด ์ ์๋ ํจ์ ์์ผ๋ก ํ์ ๋จ์ธ๋ฌธ์ ๊ฐ์ถ๋๊ฒ ๋ ์ข์ ์ค๊ณ์ด๋ค.
any ์ ์งํ๋ฅผ ์ดํดํ๊ธฐ
- any ๊ฐ ์งํํ๋ค๋ ๊ฒ์, ์๋ any ํ์ ์ด ์ฝ๋์ ๋ฐ๋ผ์ ํน์ ํ์ ์ผ๋ก ์ขํ์ง๋ ํ์!
any ์งํ๋๋ ๊ฒฝ์ฐ
-
์์์ any ํ์ ์ ์ด๋ค ๊ฐ์ ํ ๋น ํ ๋ any ๊ฐ ํน์ ํ์ ์ผ๋ก ์ขํ์ ธ์ ์งํํ๋ค.
-
ํ์ง๋ง, ์ด๋ค ๋ณ์๊ฐ ์์์ any ์ํ์ผ ๋ ๊ฐ์ ์ฝ์ผ๋ ค๊ณ ํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
-
๋ช ์์ ์ผ๋ก any ๋ฅผ ์ ์ธํ ๊ฒฝ์ฐ any ์งํ๊ฐ ์ผ์ด๋์ง ์๋๋ค.
-
์์์ any ํ์ ์ ํจ์๋ฅผ ํธ์ถํด๋ ์งํํ์ง ์๋๋ค. ์ค๋ก์ง ๊ฐ ํ ๋น์ผ๋ก ์งํํ๋ค.
-
any ๋ฅผ ์งํ์ํค๋ ๋ฐฉ์ ๋ณด๋ค ๋ช ์์ ํ์ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์์ ํ ํ์ ์ ์ ์งํ๋ ๋ฐฉ๋ฒ์ด๋ค!
๋ชจ๋ฅด๋ ํ์ ์ ๊ฐ์๋ any ๋์ unknown ์ ์ฌ์ฉํ๊ธฐ
any ํ์
- ์ด๋ ํ ํ์ ์ด๋ any ํ์ ์ ํ ๋น ๊ฐ๋ฅํ๋ค.
- any ํ์ ์ ์ด๋ ํ ํ์ ์ผ๋ก๋ ํ ๋น ๊ฐ๋ฅํ๋ค. (never ์์ธ)
unknown ํ์
- ์ด๋ ํ ํ์ ์ด๋ unknown ํ์ ์ ํ ๋น ๊ฐ๋ฅํ๋ค.
- unknown ์ ์ค๋ก์ง unknown ๊ณผ any ์๋ง ํ ๋น ๊ฐ๋ฅํ๋ค.
any, unknown, never ์ฐจ์ด
- unknown ์ ํ์
์คํฌ๋ฆฝํธ์ ์ต์์ ํ์
์ด๋ค. ๋ฐ๋ผ์ ํ์
์คํฌ๋ฆฝํธ์ ์กด์ฌํ๋ ๋ชจ๋ ํ์
์ ํ ๋น ํ ์ ์๋ค. ๋ค์ ๋งํด์ ๋ชจ๋ ํ์
์ ๊ณตํต์ ์ธ ์ฐ์ฐ ๋ฐ์ ํ ์ ์๊ณ , ํ ๋น๋ ๊ฐ์ด ์ด๋ค ํ์
์ธ์ง ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ ํจ๋ถ๋ก ํด๋น ํ์
์๋ง ์กด์ฌํ๋ ํ๋กํผํฐ ์ ๊ทผ ํน์ ์ฐ์ฐ์ ํ ์ ์์ต๋๋ค.
- ๋ฐ๋ผ์ unknown ์ ํ์ ๊ฐ๋๋ฅผ ํ์๋ก ํ์ฌ ๋ฐํ์์๋ฌ๋ฅผ ๋ฐฉ์งํ๊ธฐ ๋๋ฌธ์ unknown ์ ๋ ์ ํธํฉ๋๋ค.
- any ๋ ํ์ ๊ฒ์ฌ๋ฅผ ํญ์ ๋ง์กฑํ๋ค. ๋ฐ๋ผ์ ๋ชจ๋ ํ์ ์ ์ฐ์ฐ์ ํ ์ ์๊ณ , unknown ์ฒ๋ผ ์กด์ฌํ์ง ์๋ ํ๋กํผํฐ์ ์ ๊ทผํด๋ ์ปดํ์ผ๋ฌ๋ ์๋ฌด๋ฐ ์๋ฌ๋ฅผ ๋์์ฃผ์ง ์๋๊ณ ๋ฐํ์์๋ฌ๋ฅผ ๋์ด๋ค.
- never ๋ ๋ชจ๋ ํ์
์ ํ์ ํ์
์ด๋ค. ๋ฐ๋ผ์, ๊ทธ ์ด๋ค ๊ฐ๋ never ํ์
์ ํ ๋น ํ ์ ์๋ค.
- ๊ทธ๋ฌ๋ฉด never ๋ฅผ ์ธ์ ์ฌ์ฉํ๋? ํจ์๊ฐ ์๋ฌด๊ฒ๋ ๋ฐํํ์ง ์์์ผ ํ ๋, never ๋ฅผ ๋ฐํํ์ ์ผ๋ก ์ง์ ํ์ฌ ํ์ ์ถ๋ก ์์ธ๋ฅผ ์ ๊ฑฐํ๋ค.
- ๋ฐํ ํ์ ์ void ๋ก ํ์ ๋์ ์ฐจ์ด์ ์ void ๋ null ํน์ undefined ๊ฐ์ ๋ฐํ์ ํ์ฉํ๋ค๋ ๊ฒ์ด๊ณ , never ๋ ๊ทธ๋ ์ง ์๋ค๋ ๊ฒ์ด๋ค.
๋ชฝํค ํจ์น ๋ณด๋ค๋ ์์ ํ ํ์ ์ ์ฌ์ฉํ๊ธฐ
- ๋ชฝํคํจ์น๋, ์๋ฐ์คํฌ๋ฆฝํธ์์ ๊ฐ์ฒด์ ํด๋์ค์ ์์์ ์์ฑ์ ์ถ๊ฐ ํ ์ ์๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ธฐ๋ฅ!
document.monkey = 'Hey';
// Error
// ์ข์ง ๋ชปํ ํด๊ฒฐ๋ฐฉ๋ฒ1 any ๋จ์ธ๋ฌธ ์ฌ์ฉํ๊ธฐ
(document as any).monkey = 'Hey';
- ํ์ง๋ง ์ต์ ์ ํด๊ฒฐ์ฑ ์ document ํน์ DOM ์ผ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฆฌํ๋ ๊ฒ์ด๋ค.
- ๋ถ๋ฆฌํ ์ ์์ ๊ฒฝ์ฐ ๋๊ฐ์ง ํด๊ฒฐ์ฑ ์ด ์กด์ฌํ๋ค.
- interface ํน์ ๊ธฐ๋ฅ์ธ โ๋ณด๊ฐโ ์ฌ์ฉํ๊ธฐ
interface Document {
monkey: string;
}
- ํ์ ์ด ๋ ์์ ํ๋ค.
- ๋ชฝํคํจ์น๊ฐ ์ด๋ค ๋ถ๋ถ์ ์ ์ฉ๋์๋์ง ์ ํํ ๊ธฐ๋ก์ด ๋จ๋๋ค.
- ์์ฑ์ ์๋์์ฑ์ ์ฌ์ฉ ํ ์ ์๋ค.
- ๋ชจ๋ ๊ด์ ์์ ์ ๋๋ก ๋์ํ๊ฒ ํ๋ ค๋ฉด global ์ ์ธ์ ์ถ๊ฐํด์ผํ๋ค.
declare global {
interface Document {
monkey: string;
}
}
- ํ์ง๋ง ์์ ๊ฐ์ด ๋ณด๊ฐ์ ์ ์ญ์ ์ผ๋ก ์ ์ฉํ๋ฉด ์ฝ๋์ ๋ค๋ฅธ ๋ถ๋ถ์ด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก๋ถํฐ ๋ถ๋ฆฌํ ์ ์๋ค.
- ๊ทธ๋ฆฌ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋๋ ๋์ ์์ฑ์ ํ ๋นํ๋ฉด ์คํ ์์ ์์ ๋ณด๊ฐ์ ์ ์ฉํ ๋ฐฉ๋ฒ์ด ์๋ค ใ ใ
- ํนํ ์น ํ์ด์ง ๋ด HTML ์๋ฆฌ๋จผํธ๋ฅผ ์กฐ์ํ ๋, ์ด๋ค ์๋ฆฌ๋จผํธ๋ ์์ฑ์ด ์๊ณ , ์ด๋ค ์๋ฆฌ๋จผํธ๋ ์์ฑ์ด ์๋ ๋ฌธ์ ๊ฐ ์๋ค.
- ๋ ๊ตฌ์ฒด์ ์ธ ํ์ ๋จ์ธ๋ฌธ ์ฌ์ฉํ๊ธฐ
interface MonkeyDocument extends Document {
monkey: string;
}
(document as MonkeyDocument).monkey = 'hey';
devDependencies ์ typescript ์ @types ์ถ๊ฐํ๊ธฐ
dependencies
- ํ์ฌ ํ๋ก์ ํธ๋ฅผ ์คํํ๋๋ฐ ํ์์ ์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค
devDependencies
- ํ์ฌ ํ๋ก์ ํธ๋ฅผ ๊ฐ๋ฐํ๊ณ ํ ์คํธํ๋ ๋ฐ ์ฌ์ฉ๋์ง๋ง, ๋ฐํ์์๋ ํ์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค
peerDependencies
- ๋ฐํ์์ ํ์ํ๊ธด ํ์ง๋ง, ์์กด์ฑ์ ์ง์ ๊ด๋ฆฌํ์ง ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค
- ๋ํ์ ์ธ ์๋ก ํ๋ก๊ทธ์ธ. ์ ์ด์ฟผ๋ฆฌ์ ํ๋ฌ๊ทธ์ธ์ ๋ค์ํ ๋ฒ์ ์ ์ ์ด์ฟผ๋ฆฌ์ ํธํ๋๋ฏ๋ก ์ ์ด์ฟผ๋ฆฌ์ ๋ฒ์ ์ ํ๋ฌ๊ทธ์ธ์์ ์ง์ ์ ํํ์ง ์๊ณ ํ๋ฌ๊ทธ์ธ์ด ์ฌ์ฉ๋๋ ์ค์ ํ๋ก์ ํธ์์ ์ ํํ๋๋ก ๋ง๋ค๋ ์ฌ์ฉํ๋ค.
ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ์์คํ ๋ ๋ฒจ๋ก ์ค์นํ์ง ์๋ ์ด์
- ํ์๋ค ๋ชจ๋๊ฐ ํญ์ ๋์ผํ ๋ฒ์ ์ ์ค์นํ๋ค๋ ๋ณด์ฅ์ด ์๋ค.
- ํ๋ก์ ํธ๋ฅผ ์ ์ ํ ๋ ๋ณ๋์ ๋จ๊ณ๊ฐ ์ถ๊ฐ๋๋ค.
ํ์ ์ ์ธ๊ณผ ๊ด๋ จ๋ ์ธ ๊ฐ์ง ๋ฒ์ ์ดํดํ๊ธฐ
์ธ๊ฐ์ง ๋ฒ์
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฒ์
- ํ์ ์ ์ธ(@types)์ ๋ฒ์
- ํ์ ์คํฌ๋ฆฝํธ์ ๋ฒ์
TsDocs ์ฌ์ฉํ๊ธฐ
- ํ์ ์ ์์ ์ฃผ์์ฒ๋ผ ์ฌ์ฉํ๊ธฐ!
- ๋๋ฌด ์ฅํฉํ๊ฒ ์ฐ์ง ๋ง๊ธฐ
- ์ต์คํฌํธ ๋ ํจ์, ํด๋์ค, ํ์ ์ ์ฃผ์์ ๋ฌ ๋๋ TSDocs ํํ๋ฅผ ์ฌ์ฉํ๊ธฐ
- ์ฃผ์์ ํ์ ์ ๋ณด ํฌํจํ์ง ์๊ธฐ
์ฝ๋ฐฑ์์ this ์ ๋ํ ํ์ ์ ๊ณตํ๊ธฐ
- ์๋ฐ์คํฌ๋ฆฝํธ์์ let ์ด๋ const ๋ก ์ ์ธ๋ ๋ณ์๋ ๋ ์์ปฌ ์ค์ฝํ์ด์ง๋ง, this ๋ ๋์ ์ค์ฝํ์ด๋ค.
- ์ฆ, ๋์ ์ค์ฝํ์ ๊ฐ์ โ์ ์๋ ๋ฐฉ์โ์ด ์๋๋ผ โํธ์ถ๋ ๋ฐฉ์โ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค!
class C {
vals = [1, 2, 3];
logSquares() {
for (const val of this.vals) {
console.log(vals * vals);
}
}
}
const c = new C();
const method = c.logSquares;
method(); // error
๊ทธ๋ฆฌ์ ์๋์ ๊ฐ์ด ๋ช ์์ ์ผ๋ก this ๋ฅผ ๋ฐ์ธ๋ฉ ํด์ฃผ์ด์ผ ํ๋ค.
class C {
vals = [1, 2, 3];
logSquares() {
for (const val of this.vals) {
console.log(vals * vals);
}
}
}
const c = new C();
const method = c.logSquares;
method.call(c); // ๋ฐ์ธ๋ฉ ใ
ใ
์ฝ๋ฐฑ ํจ์์์ this ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค๋ฉด ํ์ ๋ช ์ํด์ฃผ๊ธฐ
function addKeyListener{
el: HTMLElement,
fn: (this: HTMLElement, e: (KeyboardEvent)=>void )
}
์ค๋ฒ๋ก๋ฉ ํ์ ๋ณด๋ค๋ ์กฐ๊ฑด๋ถ ํ์ ์ ์ฌ์ฉํ๊ธฐ.
function double(x: number | string): number | string;
function double(x: any) {
return x + x;
}
- double ํจ์์ string ๋๋ number ํ์ ์ ๋งค๊ฐ๋ณ์๊ฐ ๋ค์ด์ฌ ์ ์๋ค.
- ๊ทธ๋์ ์๋์ ๊ฐ์ด ์ค๋ฒ๋ก๋ฉ์ ์ฌ์ฉํด์ ์ ๋์จ ํ์ ์ ์ถ๊ฐํ๋ค.
- ํ์ง๋ง..๋ฌธ์ ์ ์ด ์๋ค.
- string ํ์ ์ ๋งค๊ฐ๋ณ์๋ก ๋ฃ์ผ๋ฉด ๋ฐํ์ string ์ด ๋๋ค. vice versa
- but.. ์์ ์์ ์ ๋ฐ๋ฅด๋ฉด string ํ์ ์ ๋ฃ์ด๋ number ๋ฐํํ์ ์ด ๋๋ ๊ฒฝ์ฐ๋ ํฌํจ๋์ด ์๋ค.
- ์ ๋ค๋ฆญ์ ์ฌ์ฉํด์ ํด๊ฒฐํด๋ณด์!!
function double<T extends number | string>(x: T): T;
function double(x: any) {
return x + x;
}
const num = double(12); // ํ์
์ด 12
const str = double('x'); // ํ์
์ด "x"
- ํ์ ์ด ๋๋ฌด ๊ณผํ๊ฒ ๊ตฌ์ฒด์ ์ด๋ค.
- ๊ทธ๋ฌ๋ฉด ์ฌ๋ฌ๊ฐ์ง ํ์ ์ ์ธ์ผ๋ก ๋ถ๋ฆฌํด๋ณด์!!
function double(x: number): number;
function double(x: string): string;
function double(x: any) {
return x + x;
}
const num = double(12); // ํ์
์ด number
const str = double('x'); // ํ์
์ด string
- ์์ฃผ ์ ๋์ํ๋ค.
- ๊ทผ๋ฐ ์์ง๋ ๋ฌธ์ ๊ฐ ์๋ค. string ์ด๋ number ํ์ ์ ๊ฐ์ผ๋ก๋ ์ ๋์ํ์ง๋ง, ์ ๋์จ ํ์ ๊ด๋ จํด์ ๋ฌธ์ ๊ฐ ์๊ธด๋ค.
function double(x: number): number;
function double(x: string): string;
function double(x: any) {
return x + x;
}
const num = double(12); // ํ์
์ด 12
const str = double('x'); // ํ์
์ด "x"
function f(x: number | string) {
return double(x); // Error 'string' | 'number' ํ์์ ์ธ์๋
// 'string' ํ์์ ๋งค๊ฐ๋ณ์์ ํ ๋น๋ ์ ์์ต๋๋ค!!
}
- ์..?!
- ํ์ ์คํฌ๋ฆฝํธ๋ ์ค๋ฒ๋ก๋ฉ ํ์ ์ค์์ ์ผ์นํ๋ ํ์ ์ ์ฐพ์ ๋ ๊น์ง ์์ฐจ์ ์ผ๋ก ๊ฒ์ํ๋ค.
- ๊ทธ๋์ ์ค๋ฒ๋ก๋ฉ ํ์ ์ ๋ง์ง๋ง ์ ์ธ(string ๋ฒ์ )๊น์ง ๊ฒ์ํ์ ๋, string| number ํ์ ์ string ์ ํ ๋น๋ ์ ์๋ ๊ฒ์ด๋ค..ใ ใ
- ๊ทธ๋ฌ๋ฉด ์ธ๋ฒ์งธ์ ์ค๋ฒ๋ก๋ฉ ํ์ ์ ์ ๋์จํ์ ์ ์ถ๊ฐํ๋ฉด ๋์ง ์์๊น?! -> ๋งจ ์ฒ์ ๋ฌธ์ .. string ์ธ์ -> number ๋ฐํ (vice versa) ๊ฐ ๋จ์์์
- ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ์ข์ ๋ฐฉ๋ฒ์ ๋ฐ๋ก ์กฐ๊ฑด๋ถ ํ์ ์ ์ฌ์ฉํ๋ ๊ฒ!
์กฐ๊ฑด๋ถ ํ์ ์ฌ์ฉํ๊ธฐ
function double<T extends number | string>(x: T): T extends string ? string : number;
function double(x: any) {
return x + x;
}
- T ๊ฐ string ์ ๋ถ๋ถ์งํฉ์ด๋ฉด ๋ฐํ ํ์ ์ด string ์ด๋ค
- ๊ทธ ์ธ์ ๊ฒฝ์ฐ๋ ๋ฐํ ํ์ ์ด number ์ด๋ค.
-
number ์ธ๋ฑ์ค ์๊ทธ๋์ณ ๋ณด๋ค๋ Array, ํํ, ArrayLike ์ฌ์ฉํ๊ธฐ
-
๋ณ๊ฒฝ ๊ด๋ จ๋ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด readonly ์ฌ์ฉํ๊ธฐ
-
์ถ๋ก ๊ฐ๋ฅํ ํ์ ์ ์ฌ์ฉํด ์ฅํฉํ ์ฝ๋ ๋ฐฉ์งํ๊ธฐ
-
๋น๋๊ธฐ ์ฝ๋์๋ ์ฝ๋ฐฑ ๋์ async ํจ์ ์ฌ์ฉํ๊ธฐ
-
ํ์ ์ถ๋ก ์ ๋ฌธ๋งฅ์ด ์ด๋ป๊ฒ ์ฌ์ฉ๋๋์ง ์ดํดํ๊ธฐ
-
์ ๋์จ์ ์ธํฐํ์ด์ค ๋ณด๋ค๋ ์ธํฐํ์ด์ค์ ์ ๋์จ ์ฌ์ฉํ๊ธฐ
-
๋ถ์ ํํ ํ์ ๋ณด๋ค๋ ๋ฏธ์์ฑ์ ํ์ ์ฌ์ฉํ๊ธฐ
-
๋ฐ์ดํฐ๊ฐ ์๋, API ์ ๋ช ์ธ๋ฅผ ๋ณด๊ณ ํ์ ๋ง๋ค๊ธฐ
-
any ํ์ ์ ๊ฐ๋ฅํ ํ ์ข์ ๋ฒ์์์๋ง ์ฌ์ฉํ๊ธฐ
-
๋ชจ๋ฅด๋ ํ์ ์ ๊ฐ์๋ any ๋์ unknown ์ ์ฌ์ฉํ๊ธฐ
-
์ค๋ฒ๋ก๋ฉ ํ์ ๋ณด๋ค๋ ์กฐ๊ฑด๋ถ ํ์ ์ ์ฌ์ฉํ๊ธฐ.