π€ Chapter 3: νμ μΆλ‘
π₯ μμ΄ν 19. μΆλ‘ κ°λ₯ν νμ μ μ¬μ©ν΄ μ₯ν©ν μ½λ λ°©μ§νκΈ°β
νμ μ€ν¬λ¦½νΈμ λ§μ νμ ꡬ문μ μ¬μ€ λΆνμν©λλ€. λ€μκ³Ό κ°μ΄ μ½λμ λͺ¨λ λ³μμ νμ μ μ μΈνλ κ²μ λΉμμ°μ μ΄λ©° ννΈμλ μ€νμΌλ‘ μ¬κ²¨μ§λλ€.
let x: number = 12;
λ€μμ²λΌλ§ ν΄λ μΆ©λΆν©λλ€.
let x = 12;
νΈμ§κΈ°μμ x
μ λ§μ°μ€λ₯Ό μ¬λ € 보면, νμ
μ΄ number
λ‘ μ΄λ―Έ μΆλ‘ λμ΄ μμμ νμΈν μ μμ΅λλ€.
νμ
μΆλ‘ μ΄ λλ€λ©΄ λͺ
μμ νμ
ꡬ문μ νμνμ§ μμ΅λλ€. μ€νλ € λ°©ν΄κ° λ λΏμ
λλ€.
νμ μ€ν¬λ¦½νΈλ λ 볡μ‘ν κ°μ²΄λ μΆλ‘ ν μ μμ΅λλ€.
const person = {
name: 'Sojourner Truth'.
born: {
where: 'Swartekill, NY',
when: 'c.1797',
},
died: {
where: 'Battle Creek, MI',
when: 'Nov, 26. 1883',
}
};
νμ μ μλ΅νκ³ λ€μμ²λΌ μμ±ν΄λ μΆ©λΆν©λλ€.
λ€μ μμ μ²λΌ λ°°μ΄μ κ²½μ°λ κ°μ²΄μ λ§μ°¬κ°μ§μ λλ€. νμ μ€ν¬λ¦½νΈλ μ λ ₯μ λ°μ μ°μ°μ νλ ν¨μκ° μ΄λ€ νμ μ λ°ννλμ§ μ νν μκ³ μμ΅λλ€.
function square(nums: number[]) {
return nums.map(x => x * x);
}
const squares = square([1, 2, 3, 4]); // νμ
μ number[]
νμ
μ΄ μΆλ‘ λλ©΄ 리ν©ν°λ§ μμ μ©μ΄ν΄μ§λλ€. Product
νμ
κ³Ό κΈ°λ‘μ μν ν¨μλ₯Ό κ°μ ν΄ λ³΄κ² μ΅λλ€.
interface Product {
id: number;
name: string;
price: number;
}
function logProduct(product: Product) {
const id: number = product.id;
const name: string = product.name;
const price: number = product.price;
console.log(id, name, price);
}
κ·Έλ°λ° id
μ λ¬Έμλ λ€μ΄ μμ μ μμμ λμ€μ μκ² λμλ€κ³ κ°μ ν΄ λ³΄κ² μ΅λλ€. κ·Έλμ Product
λ΄μ id
νμ
μ λ³κ²½ν©λλ€. κ·Έλ¬λ©΄ logProduct
λ΄μ id
λ³μ μ μΈμ μλ νμ
κ³Ό λ§μ§ μκΈ° λλ¬Έμ μ€λ₯κ° λ°μν©λλ€.
interface Product {
id: string;
name: string;
price: number;
}
function logProduct(product: Product) {
const id: number = product.id; // ~~ 'string' νμμ 'number' νμμ ν λΉν μ μμ΅λλ€.
const name: string = product.name;
const price: number = product.price;
console.log(id, name, price);
}
logProduct
ν¨μ λ΄μ λͺ
μμ νμ
κ΅¬λ¬Έμ΄ μμλ€λ©΄, μ½λλ μλ¬΄λ° μμ μμ΄λ νμ
체컀λ₯Ό ν΅κ³Όνμ κ²λλ€. logProduct
λ λΉκ΅¬μ‘°ν ν λΉλ¬Έμ μ¬μ©ν΄ ꡬννλ κ² λ«μ΅λλ€.
λΉκ΅¬μ‘°ν ν λΉλ¬Έμ λͺ¨λ μ§μ λ³μμ νμ
μ΄ μΆλ‘ λλλ‘ ν©λλ€. μ¬κΈ°μ μΆκ°λ‘ λͺ
μμ νμ
ꡬ문μ λ£λλ€λ©΄ λΆνμν νμ
μ μΈμΌλ‘ μΈν΄ μ½λκ° λ²μ‘ν΄μ§λλ€.
function logProduct(product: Product) {
const { id, name, price }: { id: string; name: string; price: number; } = product;
console.log(id, name, price);
}
ν¨μ 맀κ°λ³μμ νμ ꡬ문μ μλ΅νλ κ²½μ°λ κ°νΉ μμ΅λλ€. κΈ°λ³Έκ°μ΄ μλ κ²½μ°λ₯Ό μλ‘ λ€μ΄ λ³΄κ² μ΅λλ€.
function parseNumber(str: string, base = 10) {
// ...
}
μ¬κΈ°μ κΈ°λ³Έκ°μ΄ 10μ΄κΈ° λλ¬Έμ base
μ νμ
μ number
λ‘ μΆλ‘ λ©λλ€.
λ³΄ν΅ νμ
μ λ³΄κ° μλ λΌμ΄λΈλ¬λ¦¬μμ, μ½λ°± ν¨μμ 맀κ°λ³μ νμ
μ μλμΌλ‘ μΆλ‘ λ©λλ€. λ€μ μμ μμ express HTTP μλ² λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νλ request
μ response
μ νμ
μ μΈμ νμνμ§ μμ΅λλ€.
app.get('/health', (request, response) => {
response.send('OK');
});
νμ μ΄ μΆλ‘ λ μ μμμλ μ¬μ ν νμ μ λͺ μνκ³ μΆμ λͺ κ°μ§ μν©μ΄ μμ΅λλ€. κ·Έμ€ νλλ κ°μ²΄ 리ν°λ΄μ μ μν λμ λλ€.
const elmo: Product = {
name: 'Tickle Me Elmo',
id: '048188 627152',
price: 28.99,
};
μ΄λ° μ μμ νμ
μ λͺ
μνλ©΄, μμ¬ μμ± μ²΄ν¬(μμ΄ν
11)κ° λμν©λλ€. μμ¬ μμ± μ²΄ν¬λ νΉν μ νμ μμ±μ΄ μλ νμ
μ μ€ν κ°μ μ€λ₯λ₯Ό μ‘λ λ° ν¨κ³Όμ μ
λλ€. κ·Έλ¦¬κ³ λ³μκ° μ¬μ©λλ μκ°μ΄ μλ ν λΉνλ μμ μ μ€λ₯κ° νμλλλ‘ ν΄ μ€λλ€.
λ§μ½ νμ
ꡬ문μ μ κ±°νλ€λ©΄ μμ¬ μμ± μ²΄ν¬κ° λμνμ§ μκ³ , κ°μ²΄λ₯Ό μ μΈν κ³³μ΄ μλλΌ κ°μ²΄κ° μ¬μ©λλ κ³³μμ νμ
μ€λ₯κ° λ°μν©λλ€.
λ§μ°¬κ°μ§λ‘ ν¨μμ λ°νμλ νμ
μ λͺ
μν μ¬ μ€λ₯λ₯Ό λ°©μ§ν μ μμ΅λλ€. νμ
μΆλ‘ μ΄ κ°λ₯ν μ§λΌλ ꡬνμμ μ€λ₯κ° ν¨μλ₯Ό νΈμΆν κ³³κΉμ§ μν₯μ λ―ΈμΉμ§ μλλ‘ νκΈ° μν΄ νμ
ꡬ문μ λͺ
μνλ κ² μ’μ΅λλ€.
μ£Όμ μμΈλ₯Ό μ‘°ννλ ν¨μλ₯Ό μμ±νλ€κ³ κ°μ ν΄ λ³΄κ² μ΅λλ€.
function getQuote(ticker: string) {
return fetch(`https://quotes.example.com/?q=${ticker}`)
.then(response => response.json());
}
μ΄λ―Έ μ‘°νν μ’ λ³΅μ λ€μ μμ²νμ§ μλλ‘ μΊμλ₯Ό μΆκ°ν©λλ€.
const cache: { [ticker: string]: number } = {};
function getQuote(ticker: string) {
if (ticker in cache) {
return cache[ticker];
}
return fetch(`https://quotes.example.com/?q=${ticker}`)
.then(response => response.json())
.then(quote => {
cache[ticker] = quote;
return quote;
});
}
μ€νν΄ λ³΄λ©΄ μ€λ₯λ getQuote
λ΄λΆκ° μλ getQuote
λ₯Ό νΈμΆν μ½λμμ λ°μν©λλ€.
μ΄λ μλλ λ°ν νμ
(Promise<number>
)μ λͺ
μνλ€λ©΄, μ νν μμΉμ μ€λ₯κ° νμλ©λλ€.
const cache: { [ticker: string]: number } = {};
function getQuote(ticker: string): Promise<number> {
if (ticker in cache) {
return cache[ticker]; // μλ¬
}
// ...
}
λ°ν νμ
μ λͺ
μνλ©΄, ꡬνμμ μ€λ₯κ° μ¬μ©μ μ½λμ μ€λ₯λ‘ νμλμ§ μμ΅λλ€.
μ€λ₯μ μμΉλ₯Ό μ λλ‘ νμν΄ μ£Όλ μ΄μ μΈμλ, λ°ν νμ
μ λͺ
μν΄μΌ νλ μ΄μ κ° λ κ°μ§ λ μμ΅λλ€.
첫 λ²μ§Έλ λ°ν νμ
μ λͺ
μνλ©΄ ν¨μμ λν΄ λμ± λͺ
ννκ² μ μ μκΈ° λλ¬Έμ
λλ€. λ°ν νμ
μ λͺ
μνλ €λ©΄ ꡬννκΈ° μ μ μ
λ ₯ νμ
κ³Ό μΆλ ₯ νμ
μ΄ λ¬΄μμΈμ§ μμμΌ ν©λλ€. μΆνμ μ½λκ° μ‘°κΈ λ³κ²½λμ΄λ κ·Έ ν¨μμ μκ·Έλμ²λ μ½κ² λ°κΎΈμ§ μμ΅λλ€. 미리 νμ
μ λͺ
μνλ λ°©λ²μ, ν¨μλ₯Ό ꡬννκΈ° μ μ ν
μ€νΈλ₯Ό λ¨Όμ μμ±νλ ν
μ€νΈ μ£Όλ κ°λ°(test driven development, TDD)κ³Ό λΉμ·ν©λλ€. μ 체 νμ
μκ·Έλμ²λ₯Ό λ¨Όμ μμ±νλ©΄ ꡬνμ λ§μΆμ΄ 주먹ꡬꡬμμΌλ‘ μκ·Έλμ²κ° μμ±λλ κ²μ λ°©μ§νκ³ μ λλ‘ μνλ λͺ¨μμ μ»κ² λ©λλ€.
λ°νκ°μ νμ
μ λͺ
μν΄μΌ νλ λ λ²μ§Έ μ΄μ λ λͺ
λͺ
λ νμ
μ μ¬μ©νκΈ° μν΄μμ
λλ€. λ°ν νμ
μ λͺ
μνλ©΄ λμ± μ§κ΄μ μΈ ννμ΄ λ©λλ€. κ·Έλ¦¬κ³ λ°ν κ°μ λ³λμ νμ
μΌλ‘ μ μνλ©΄ νμ
μ λν μ£Όμμ μμ±ν μ μμ΄μ, λμ± μμΈν μ€λͺ
μ΄ κ°λ₯ν©λλ€. μΆλ‘ λ λ°ν νμ
μ΄ λ³΅μ‘ν΄μ§μλ‘ λͺ
λͺ
λ νμ
μ μ 곡νλ μ΄μ μ 컀μ§λλ€.
π₯ μμ΄ν 20. λ€λ₯Έ νμ μλ λ€λ₯Έ λ³μ μ¬μ©νκΈ°β
μλ°μ€ν¬λ¦½νΈμμλ ν λ³μλ₯Ό λ€λ₯Έ λͺ©μ μ κ°μ§λ λ€λ₯Έ νμ
μΌλ‘ μ¬μ¬μ©ν΄λ λ©λλ€.
λ°λ©΄ νμ
μ€ν¬λ¦½νΈμμλ λ κ°μ§ μ€λ₯κ° λ°μν©λλ€.
let id = "12-34-56";
fetchProduct(id);
id = 123456;
// ~~ '123456' νμμ 'string' νμμ ν λΉν μ μμ΅λλ€.
fetchProductBySerialNumber(id);
νμ
μ€ν¬λ¦½νΈμμλ "12-34-56"μ΄λΌλ κ°μ λ³΄κ³ , id
μ νμ
μ string
μΌλ‘ μΆλ‘ νμ΅λλ€. string
νμ
μλ number
νμ
μ ν λΉν μ μκΈ° λλ¬Έμ μ€λ₯κ° λ°μν© λλ€.
μ¬κΈ°μ "λ³μμ κ°μ λ°λ μ μμ§λ§ κ·Έ νμ
μ λ³΄ν΅ λ°λμ§ μλλ€"λ μ€μν κ΄μ μ μ μ μμ΅λλ€. νμ
μ λ°κΏ μ μλ ν κ°μ§ λ°©λ²μ λ²μλ₯Ό μ’νλ κ²μΈλ°, μλ‘μ΄ λ³μκ°μ ν¬ν¨νλλ‘ νμ₯νλ κ²μ΄ μλλΌ νμ
μ λ μκ² μ ννλ κ²μ
λλ€.
id
μ νμ
μ λ°κΎΈμ§ μμΌλ €λ©΄, string
κ³Ό number
λ₯Ό λͺ¨λ ν¬ν¨ν μ μλλ‘ νμ
μ νμ₯νλ©΄ λ©λλ€. string|number
λ‘ νννλ©°, μ λμ¨ νμ
μ΄λΌκ³ ν©λλ€.
let id: string | number = "12-34-56";
fetchProduct(id);
id = 123456;
fetchProductBySerialNumber(id);
μ λμ¨ νμ
μΌλ‘ μ½λκ° λμνκΈ°λ νκ² μ§λ§ λ λ§μ λ¬Έμ κ° μκΈΈ μ μμ΅λλ€. id
λ₯Ό μ¬μ©ν λλ§λ€ κ°μ΄ μ΄λ€ νμ
μΈμ§ νμΈν΄μΌ νκΈ° λλ¬Έμ μ λμ¨ νμ
μ string
μ΄λ number
κ°μ κ°λ¨ν νμ
μ λΉν΄ λ€λ£¨κΈ° λ μ΄λ ΅μ΅λλ€. μ°¨λΌλ¦¬ λ³λμ λ³μλ₯Ό λμ
νλ κ²μ΄ λ«μ΅λλ€.
const id = "12-34-56";
fetchProduct(id);
const serial = 123456;
fetchProductBySerialNumber(serial);
μμ μμ μμ 첫 λ²μ§Έ id
μ μ¬μ¬μ©ν λ λ²μ§Έ id
λ μλ‘ κ΄λ ¨μ΄ μμμ΅λλ€. κ·Έλ₯ λ³μλ₯Ό μ¬μ¬μ©νμ λΏμ
λλ€. λ³μλ₯Ό 무λΆλ³νκ² μ¬μ¬μ©νλ©΄ νμ
체컀μ μ¬λ λͺ¨λμκ² νΌλμ μ€ λΏμ
λλ€.
λ€λ₯Έ νμ
μλ λ³λμ λ³μλ₯Ό μ¬μ©νλ κ² λ°λμ§ν μ΄μ λ λ€μκ³Ό κ°μ΅λλ€.
- μλ‘ κ΄λ ¨μ΄ μλ λ κ°μ κ°μ λΆλ¦¬ν©λλ€.
- λ³μλͺ μ λ ꡬ체μ μΌλ‘ μ§μ μ μμ΅λλ€.
- νμ μΆλ‘ μ ν₯μμν€λ©°, νμ κ΅¬λ¬Έμ΄ λΆνμν΄μ§λλ€.
- νμ μ΄ μ’ λ κ°κ²°ν΄μ§λλ€.
let
λμconst
λ‘ λ³μλ₯Ό μ μΈνκ² λ©λλ€.const
λ‘ λ³μλ₯Ό μ μΈνλ©΄ μ½λκ° κ°κ²°ν΄μ§κ³ , νμ μ²΄μ»€κ° νμ μ μΆλ‘ νκΈ°μλ μ’μ΅λλ€.
νμ μ΄ λ°λλ λ³μλ λλλ‘ νΌν΄μΌ νλ©°, λͺ©μ μ΄ λ€λ₯Έ κ³³μλ λ³λμ λ³μλͺ μ μ¬μ©ν΄μΌ ν©λλ€.
π₯ μμ΄ν 21. νμ λνκΈ°β
μμλ₯Ό μ¬μ©ν΄μ λ³μλ₯Ό μ΄κΈ°νν λ νμ μ λͺ μνμ§ μμΌλ©΄ νμ 체컀λ νμ μ κ²°μ ν΄μΌ ν©λλ€. μ΄ λ§μ μ§μ λ λ¨μΌ κ°μ κ°μ§κ³ ν λΉ κ°λ₯ν κ°λ€μ μ§ν©μ μ μΆν΄μΌ νλ€λ λ»μ λλ€. νμ μ€ν¬λ¦½νΈμμλ μ΄λ¬ν κ³Όμ μ "λνκΈ°"λΌκ³ λΆλ¦ λλ€.
벑ν°λ₯Ό λ€λ£¨λ λΌμ΄λΈλ¬λ¦¬λ₯Ό μμ±νλ€κ³ κ°μ ν΄ λ³΄κ² μ΅λλ€. 3D 벑ν°μ λν νμ κ³Ό κ·Έ μμλ€μ κ°μ μ»λ ν¨μλ₯Ό μμ±ν©λλ€.
interface Vector3 { x: number; y: number; z: number; }
function getComponent(vector: Vector3, axis: 'x' | 'y' | 'z') {
return vector[axis];
}
Vector3
ν¨μλ₯Ό μ¬μ©ν λ€μ μ½λλ λ°νμμ μ€λ₯ μμ΄ μ€νλμ§λ§, νΈμ§κΈ°μμλ μ€λ₯κ° νμλ©λλ€.
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"
νμ
μ ν λΉμ΄ λΆκ°λ₯νλ―λ‘ μ€λ₯κ° λ κ²μ
λλ€.
νμ
λνκΈ°κ° μ§νλ λ, μ£Όμ΄μ§ κ°μΌλ‘ μΆλ‘ κ°λ₯ν νμ
μ΄ μ¬λ¬ κ°μ΄κΈ° λλ¬Έμ κ³Όμ μ΄ μλΉν λͺ¨νΈν©λλ€.
νμ
μ€ν¬λ¦½νΈλ μμ±μμ μλλ₯Ό μΆμΈ‘ν©λλ€. κ·Έλ¬λ νμ
μ€ν¬λ¦½νΈκ° μ무리 μ리νλλΌλ μ¬λμ λ§μκΉμ§ μ½μ μλ μκ³ λ°λΌμ μΆμΈ‘ν λ΅μ΄ νμ μ³μ μλ μμ΅λλ€.
νμ
μ€ν¬λ¦½νΈλ x
μ νμ
μ string
μΌλ‘ μΆλ‘ ν λ, λͺ
νμ±κ³Ό μ μ°μ± μ¬μ΄μ κ· νμ μ μ§νλ €κ³ ν©λλ€. μΌλ°μ μΈ κ·μΉμ λ³μκ° μ μΈλ νλ‘λ νμ
μ΄ λ°λμ§ μμμΌ νλ―λ‘, string|RegExp
λ string|string[]
μ΄λ any
λ³΄λ€ string
μ μ¬μ©νλ κ² λ«μ΅λλ€.
νμ
μ€ν¬λ¦½νΈλ λνκΈ°μ κ³Όμ μ μ μ΄ν μ μλλ‘ λͺ κ°μ§ λ°©λ²μ μ 곡ν©λλ€. λνκΈ° κ³Όμ μ μ μ΄ν μ μλ 첫 λ²μ§Έ λ°©λ²μ const
μ
λλ€. λ§μ½ let
λμ const
λ‘ λ³μλ₯Ό μ μΈνλ©΄ λ μ’μ νμ
μ΄ λ©λλ€. μ€μ λ‘ const
λ₯Ό μ¬μ©νλ©΄ μμμ λ°μν μ€λ₯κ° ν΄κ²°λ©λλ€.
const x = 'x'; // νμ
μ΄ "x"
let vec = { x: 10, y: 20, z: 30 };
getComponent(vec, x); // μ μ
μ΄μ x
λ μ¬ν λΉλ μ μμΌλ―λ‘ νμ
μ€ν¬λ¦½νΈλ μμ¬μ μ¬μ§ μμ΄ λ μ’μ νμ
μΌλ‘ μΆλ‘ ν μ μμ΅λλ€. κ·Έλ¦¬κ³ λ¬Έμ 리ν°λ΄ νμ
x
λ x|y|z
μ ν λΉ κ°λ₯νλ―λ‘ μ½λκ° νμ
체컀λ₯Ό ν΅κ³Όν©λλ€.
κ·Έλ¬λ const
λ λ§λ₯μ΄ μλλλ€. κ°μ²΄μ λ°°μ΄μ κ²½μ°μλ μ¬μ ν λ¬Έμ κ° μμ΅λλ€. νν νμ
μ μΆλ‘ ν΄μΌ ν μ§, μμλ€μ μ΄λ€ νμ
μΌλ‘ μΆλ‘ ν΄μΌ ν μ§ μ μ μμ΅λλ€. λΉμ·ν λ¬Έμ κ° κ°μ²΄μμλ λ°μν©λλ€.
μμμ μΈκΈνλ―μ΄ νμ
μ€ν¬λ¦½νΈλ λͺ
νμ±κ³Ό μ μ°μ± μ¬μ΄μ κ· νμ μ μ§νλ €κ³ ν©λλ€. μ€λ₯λ₯Ό μ‘κΈ° μν΄μλ μΆ©λΆν ꡬ체μ μΌλ‘ νμ
μ μΆλ‘ ν΄μΌ νμ§λ§, μλͺ»λ μΆλ‘ μ ν μ λλ‘ κ΅¬μ²΄μ μΌλ‘ μννμ§λ μμ΅λλ€. μλ₯Ό λ€μ΄, 1κ³Ό κ°μ κ°μΌλ‘ μ΄κΈ°νλλ μμ±μ μ λΉν number
μ νμ
μΌλ‘ μΆλ‘ ν©λλ€.
νμ
μ μΆλ‘ μ κ°λλ₯Ό μ§μ μ μ΄νλ €λ©΄ νμ
μ€ν¬λ¦½νΈμ κΈ°λ³Έ λμμ μ¬μ μν΄μΌ ν©λλ€. νμ
μ€ν¬λ¦½νΈμ κΈ°λ³Έ λμμ μ¬μ μνλ μΈ κ°μ§ λ°©λ²μ΄ μμ΅λλ€.
첫 λ²μ§Έ, λͺ μμ νμ ꡬ문μ μ 곡νλ κ²μ λλ€.
const v: { x: 1|3|5 } = {
x: 1,
}; // νμ
μ΄ { x: 1|3|5; }
λ λ²μ§Έ, νμ
체컀μ μΆκ°μ μΈ λ¬Έλ§₯μ μ 곡νλ κ²μ
λλ€. (μλ₯Ό λ€μ΄, ν¨μμ 맀κ°λ³μλ‘ κ°μ μ λ¬) μμ΄ν
26μ νμ
μΆλ‘ κ³Όμ μμ λ¬Έλ§₯μ μν μ λν μμΈν λ΄μ©μ λ€λ£Ήλλ€.
μΈ λ²μ§Έ, const
λ¨μΈλ¬Έμ μ¬μ©νλ κ²μ
λλ€. const
λ¨μΈλ¬Έκ³Ό λ³μ μ μΈμ μ°μ΄λ let
μ΄λ const
μ νΌλν΄μλ μ λ©λλ€. const
λ¨μΈλ¬Έμ μ¨μ ν νμ
곡κ°μ κΈ°λ²μ
λλ€. λ€μ μμ λ₯Ό ν΅ν΄ κ° λ³μμ μΆλ‘ λ νμ
μ μ°¨μ΄μ μ μ΄ν΄λ³΄κ² μ΅λλ€.
const v1 = {
x: 1,
y: 2,
}; // νμ
μ { x: number; y: number; }
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; }
κ° λ€μ as const
λ₯Ό μμ±νλ©΄, νμ
μ€ν¬λ¦½νΈλ μ΅λν μ’μ νμ
μΌλ‘ μΆλ‘ ν©λλ€. v3
μλ λνκΈ°κ° λμνμ§ μμ΅λλ€. v3
μ΄ μ§μ§ μμλΌλ©΄, μ£Όμμ 보μ΄λ μΆλ‘ λ νμ
μ΄ μ€μ λ‘ μνλ ννμΌ κ²μ
λλ€. λν λ°°μ΄μ νν νμ
μΌλ‘ μΆλ‘ ν λλ as const
λ₯Ό μ¬μ©ν μ μμ΅λλ€.
const a1 = [1, 2, 3]; // νμ
μ΄ number[]
const a2 = [1, 2, 3] as const; // νμ
μ΄ readonly [1, 2, 3]
λνκΈ°λ‘ μΈν΄ μ€λ₯κ° λ°μνλ€κ³ μκ°λλ©΄, λͺ
μμ νμ
ꡬ문 λλ const
λ¨μΈλ¬Έμ μΆκ°νλ κ²μ κ³ λ €ν΄μΌ ν©λλ€. λ¨μΈλ¬ΈμΌλ‘ μΈν΄ μΆλ‘ μ΄ μ΄λ»κ² λ³ννλμ§ νΈμ§κΈ°μμ μ£ΌκΈ°μ μΌλ‘ νμ
μ μ΄ν΄λ³΄κΈ° λ°λλλ€.(μμ΄ν
6)
π₯ μμ΄ν 22. νμ μ’νκΈ°β
νμ
μ’νκΈ°λ νμ
μ€ν¬λ¦½νΈκ° λμ νμ
μΌλ‘λΆν° μ’μ νμ
μΌλ‘ μ§ννλ κ³Όμ μ λ§ν©λλ€. μλ§λ κ°μ₯ μΌλ°μ μΈ μμλ null
체ν¬μΌ κ²λλ€.
const el = document.getElementById('foo'); // νμ
μ΄ HTMLElement | null
if (el) {
el // νμ
μ΄ HTMLElement
el.innerHTML = 'Party Time'.blink();
} else {
el // νμ
μ΄ null
alert('No element #foo');
}
νμ 체컀λ μΌλ°μ μΌλ‘ μ΄λ¬ν 쑰건문μμ νμ μ’νκΈ°λ₯Ό μ ν΄λ΄μ§λ§, νμ λ³μΉμ΄ μ‘΄μ¬νλ€λ©΄ κ·Έλ¬μ§ λͺ»ν μλ μμ΅λλ€. νμ λ³μΉμ λν λ΄μ©μ μμ΄ν 24μμ λ€λ£¨κ² μ΅λλ€.
λΆκΈ°λ¬Έμμ μμΈλ₯Ό λμ§κ±°λ ν¨μλ₯Ό λ°ννμ¬ λΈλ‘μ λλ¨Έμ§ λΆλΆμμ λ³μμ νμ μ μ’ν μλ μμ΅λλ€.
const el = document.getElementById('foo'); // νμ
μ΄ HTMLElement | null
if (!el) throw new Error('Unable to find #foo');
el; // μ΄μ νμ
μ HTMLElement
el.innerHTML = 'Party Time'.blink();
μ΄ μΈμλ νμ
μ μ’νλ λ°©λ²μ λ§μ΄ μμ΅λλ€. λ€μμ instanceof
λ₯Ό μ¬μ©ν΄μ νμ
μ μ’νλ μμ μ
λλ€.
function contains(text: string, search: string | RegExp) {
if (search instanceof RegExp) {
search // νμ
μ΄ RegExp
return !!search.exec(text);
}
search // νμ
μ΄ string
return text.includes(search);
}
μμ± μ²΄ν¬λ‘λ νμ μ μ’ν μ μμ΅λλ€.
interface A { a: number }
interface B { b: number }
function pickAB(ab: A | B) {
if ('a' in ab) {
ab // νμ
μ΄ A
} else {
ab // νμ
μ΄ B
}
ab // νμ
μ΄ A | B
}
Array.isArray
κ°μ μΌλΆ λ΄μ₯ ν¨μλ‘λ νμ
μ μ’ν μ μμ΅λλ€.
function contains(text: string, terms: string|string[]) {
const termList = Array.isArray(terms) ? terms : [terms];
termList // νμ
μ΄ string[]
// ...
}
νμ μ μ£λΆλ¦¬ νλ¨νλ μ€μλ₯Ό μ μ§λ₯΄κΈ° μ¬μ°λ―λ‘ λ€μ νλ² κΌΌκΌΌν λ°μ Έ λ΄μΌ ν©λλ€.
function foo(x?: number|string|null) {
if (!x) {
x; // νμ
μ΄ string | number | null | undefined
}
}
λΉ λ¬Έμμ΄ ''
μ 0
λͺ¨λ false
κ° λκΈ° λλ¬Έμ, νμ
μ μ ν μ’νμ§μ§ μμκ³ x
λ μ¬μ ν λΈλ‘ λ΄μμ string
λλ number
κ° λ©λλ€.
νμ μ μ’νλ λ λ€λ₯Έ μΌλ°μ μΈ λ°©λ²μ λͺ μμ 'νκ·Έ'λ₯Ό λΆμ΄λ κ²μ λλ€.
interface UploadEvent { type: 'upload'; filename: string; contents: string }
interface DownloadEvent { type: 'download'; filename: string; }
type AppEvent = UploadEvent | DownloadEvent;
function handleEvent(e: AppEvent) {
switch (e.type) {
case 'download':
e // νμ
μ΄ DownloadEvent
break;
case 'upload':
e; // νμ
μ΄ UploadEvent
break;
}
}
μ΄ ν¨ν΄μ 'νκ·Έλ μ λμ¨' λλ 'ꡬλ³λ μ λμ¨'μ΄λΌκ³ λΆλ¦¬λ©°, νμ
μ€ν¬λ¦½νΈ μ΄λμμλ μ°Ύμλ³Ό μ μμ΅λλ€.
λ§μ½ νμ
μ€ν¬λ¦½νΈκ° νμ
μ μλ³νμ§ λͺ»νλ€λ©΄, μλ³μ λκΈ° μν΄ μ»€μ€ν
ν¨μλ₯Ό λμ
ν μ μμ΅λλ€.
function isInputElement(el: HTMLElement): el is HTMLInputElement {
return 'value' in el;
}
function getElementContent(el: HTMLElement) {
if (isInputElement(el)) {
el; // νμ
μ΄ HTMLInputElement
return el.value;
}
el; // νμ
μ΄ HTMLElement
return el.textContent;
}
μ΄λ¬ν κΈ°λ²μ 'μ¬μ©μ μ μ νμ
κ°λ'λΌκ³ ν©λλ€. λ°ν νμ
μ el is HTMLInputElement
λ ν¨μμ λ°νμ΄ true
μΈ κ²½μ°, νμ
체컀μκ² λ§€κ°λ³μμ νμ
μ μ’ν μ μλ€κ³ μλ € μ€λλ€.
μ΄λ€ ν¨μλ€μ νμ
κ°λλ₯Ό μ¬μ©νμ¬ λ°°μ΄κ³Ό κ°μ²΄μ νμ
μ’νκΈ°λ₯Ό ν μ μμ΅λλ€. μλ₯Ό λ€μ΄, λ°°μ΄μμ μ΄λ€ νμμ μνν λ undefined
κ° λ μ μλ νμ
μ μ¬μ©ν μ μμ΅λλ€.
const jackson5 = ['Jackie', 'Tito', 'Jermaine', 'Marlon', 'Michael'];
const members = ['Janet', 'Michael'].map(
who => jackson5.find(n => n === who)
); // νμ
μ΄ (string | undefined)[]
filter
ν¨μλ₯Ό μ¬μ©ν΄ undefined
λ₯Ό κ±Έλ¬ λ΄λ €κ³ ν΄λ μ λμνμ§ μμ κ²λλ€.
const members = ['Janet', 'Michael'].map(
who => jackson5.find(n => n === who)
).filter(who => who !== undefined); // νμ
μ΄ (string | undefined)[]
μ΄λ΄ λ νμ κ°λλ₯Ό μ¬μ©νλ©΄ νμ μ μ’ν μ μμ΅λλ€.
function isDefined<T>(x: T | undefined): x is T {
return x !== undefined;
}
const members = ['Janet', 'Michael'].map(
who => jackson5.find(n => n === who)
).filter(isDefined); // νμ
μ΄ string[]
π₯ μμ΄ν 23. νκΊΌλ²μ κ°μ²΄ μμ±νκΈ°β
κ°μ²΄λ₯Ό μμ±ν λλ μμ±μ νλμ© μΆκ°ν기보λ€λ μ¬λ¬ μμ±μ ν¬ν¨ν΄μ νκΊΌλ²μ μμ±ν΄μΌ νμ μΆλ‘ μ μ 리ν©λλ€.
interface Point { x: number; y: number; }
const pt: Point = {
x: 3,
y: 4,
}
μμ κ°μ²΄λ€μ μ‘°ν©ν΄μ ν° κ°μ²΄λ₯Ό λ§λ€μ΄μΌ νλ κ²½μ°μλ μ¬λ¬ λ¨κ³λ₯Ό κ±°μΉλ κ²μ μ’μ§ μμ μκ°μ
λλ€.
λ€μκ³Ό κ°μ΄ κ°μ²΄ μ κ° μ°μ°μ ...
λ₯Ό μ¬μ©νλ©΄ ν° κ°μ²΄λ₯Ό νκΊΌλ²μ λ§λ€μ΄ λΌ μ μμ΅λλ€.
const pt = { x: 3, y: 4 };
const id = { name: 'Pythagoras' };
const namedPoint = { ...pt, ...id };
namedPoint.name; // μ μ.
κ°μ²΄ μ κ° μ°μ°μλ₯Ό μ¬μ©νλ©΄ νμ κ±±μ μμ΄ νλ λ¨μλ‘ κ°μ²΄λ₯Ό μμ±ν μλ μμ΅λλ€. μ΄λ λͺ¨λ μ λ°μ΄νΈλ§λ€ μ λ³μλ₯Ό μ¬μ©νμ¬ κ°κ° μλ‘μ΄ νμ μ μ»λλ‘ νλ κ² μ€μν©λλ€.
const pt0 = {};
const pt1 = { ...pt0, x: 3 };
const pt: Point = { ...pt1, y: 4 }; // μ μ
νμ
μ μμ ν λ°©μμΌλ‘ μ‘°κ±΄λΆ μμ±μ μΆκ°νλ €λ©΄, μμ±μ μΆκ°νμ§ μλ null
λλ {}
μΌλ‘ κ°μ²΄ μ κ°λ₯Ό μ¬μ©νλ©΄ λ©λλ€.
declare let hasMiddle: boolean;
const firstLast = { first: 'Harry', last: 'Truman' };
const president = { ...firstLast, ...(hasMiddle ? { middle: 'S' } : {})};
νΈμ§κΈ°μμ president
μ¬λ²μ λ§μ°μ€λ₯Ό μ¬λ € 보면, νμ
μ΄ μ νμ μμ±μ κ°μ§ κ²μΌλ‘ μΆλ‘ λλ€λ κ²μ νμΈν μ μμ΅λλ€.
const president: {
middle?: string;
first: string;
last: string;
}
μ κ° μ°μ°μλ‘ νκΊΌλ²μ μ¬λ¬ μμ±μ μΆκ°ν μλ μμ΅λλ€.
declare let hasDates: boolean;
const nameTitle = { name: 'Khufu', title: 'Pharaoh' };
const pharaoh = {
...nameTitle,
...(hasDates ? { start: -2589, end: -2566 } : {})
};
νΈμ§κΈ°μμ pharaoh
μ¬λ²μ λ§μ°μ€λ₯Ό μ¬λ € 보면, μ΄μ λ νμ
μ΄ μ λμ¨μΌλ‘ μΆλ‘ λ©λλ€.
const pharaoh: {
start: number;
end: number;
name: string;
title: string;
} | {
name: string;
title: string;
}
start
μ end
κ° μ νμ νλμ΄κΈ°λ₯Ό μνλ€λ©΄ μ΄λ° κ²°κ³Όκ° λΉν©μ€λ¬μΈ μ μμ΅λλ€. μ΄ νμ
μμλ start
λ₯Ό μ½μ μ μμ΅λλ€.
μ΄ κ²½μ°μλ start
μ end
κ° νμ ν¨κ» μ μλ©λλ€. μ΄ μ μ κ³ λ €νλ©΄ μ λμ¨μ μ¬μ©νλ κ² κ°λ₯ν κ°μ μ§ν©μ λ μ νν ννν μ μμ΅λλ€. (μμ΄ν
32) κ·Έλ°λ° μ λμ¨λ³΄λ€λ μ νμ νλκ° λ€λ£¨κΈ°μλ λ μ¬μΈ μ μμ΅λλ€. μ νμ νλ λ°©μμΌλ‘ νννλ €λ©΄ λ€μμ²λΌ ν¬νΌ ν¨μλ₯Ό μ¬μ©νλ©΄ λ©λλ€.
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
);
pharaoh.start // μ μ, νμ
μ΄ number | undefined
κ°λ κ°μ²΄λ λ°°μ΄μ λ³νν΄μ μλ‘μ΄ κ°μ²΄λ λ°°μ΄μ μμ±νκ³ μΆμ μ μμ΅λλ€. μ΄λ° κ²½μ° λ£¨ν λμ λ΄μ₯λ ν¨μν κΈ°λ² λλ λ‘λμ κ°μ μ νΈλ¦¬ν° λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νλ κ²μ΄ 'νκΊΌλ²μ κ°μ²΄ μμ±νκΈ°' κ΄μ μμ 보면 μ³μ΅λλ€.
π₯ μμ΄ν 24. μΌκ΄μ± μλ λ³μΉ μ¬μ©νκΈ°β
λ³μΉμ λ¨λ°ν΄μ μ¬μ©νλ©΄ μ μ΄ νλ¦μ λΆμνκΈ° μ΄λ ΅μ΅λλ€. λͺ¨λ μΈμ΄μ μ»΄νμΌλ¬ κ°λ°μλ€μ 무λΆλ³ν λ³μΉ μ¬μ©μΌλ‘ 골μΉλ₯Ό μ©μ΄κ³ μμ΅λλ€. νμ μ€ν¬λ¦½νΈμμλ λ§μ°¬κ°μ§λ‘ λ³μΉμ μ μ€νκ² μ¬μ©ν΄μΌ ν©λλ€. κ·ΈλμΌ μ½λλ₯Ό μ μ΄ν΄ν μ μκ³ , μ€λ₯λ μ½κ² μ°Ύμ μ μμ΅λλ€.
λ€κ°νμ νννλ μλ£κ΅¬μ‘°λ₯Ό κ°μ ν΄ λ³΄κ² μ΅λλ€.
interface Coordinate {
x: number;
y: number;
}
interface BoundingBox {
x: [number, number];
y: [number, number];
}
interface Polygon {
exterior: Coordinate[];
holes: Coordinate[][];
bbox?: BoundingBox;
}
bbox
μμ±μ μ¬μ©νλ©΄ μ΄λ€ μ μ΄ λ€κ°νμ ν¬ν¨λλμ§ λΉ λ₯΄κ² 체ν¬ν μ μμ΅λλ€.
function isPointInPolygon(polygon: Polygon, pt: Coordinate) {
if (polygon.bbox) {
if (pt.x < polygon.bbox.x[0] || pt.x > polygon.bbox.x[1] || pt.y < polygon.bbox.y[0] || pt.y > polygon.bbox.y[1]) {
return false;
}
}
// ...
}
μ΄ μ½λλ μ μλνμ§λ§ λ°λ³΅λλ λΆλΆμ΄ μ‘΄μ¬ν©λλ€. νΉν polygon.bbox
λ 3μ€μ κ±Έμ³ 5λ²μ΄λ λ±μ₯ν©λλ€. λ€μ μ½λλ μ€λ³΅μ μ€μ΄κΈ° μν΄ μμ λ³μλ₯Ό λ½μλΈ λͺ¨μ΅μ
λλ€.
function isPointInPolygon(polygon: Polygon, pt: Coordinate) {
const box = polygon.bbox;
if (polygon.bbox) {
if (pt.x < box.x[0] || pt.x > box.x[1] || pt.y < box.y[0] || pt.y > box.y[1]) {
// error: κ°μ²΄κ° 'undefined'μΌ μ μμ΅λλ€.
return false;
}
}
// ...
}
(strictNullChecks
λ₯Ό νμ±ννλ€κ³ κ°μ νμ΅λλ€.) μ΄ μ½λλ λμνμ§λ§ νΈμ§κΈ°μμ μ€λ₯λ‘ νμλ©λλ€. κ·Έ μ΄μ λ polygon.bbox
λ₯Ό λ³λμ box
λΌλ λ³μΉμ λ§λ€μκ³ , 첫 λ²μ§Έ μμμμλ μ λμνλ μ μ΄ νλ¦ λΆμμ λ°©ν΄νκΈ° λλ¬Έμ
λλ€.
μμ± μ²΄ν¬λ polygon.bbox
μ νμ
μ μ μ νμ§λ§ box
λ κ·Έλ μ§ μμκΈ° λλ¬Έμ μ€λ₯κ° λ°μνμ΅λλ€. μ΄λ¬ν μ€λ₯λ "λ³μΉμ μΌκ΄μ± μκ² μ¬μ©νλ€"λ κΈ°λ³Έ μμΉμ μ§ν€λ©΄ λ°©μ§ν μ μμ΅λλ€.
μμ± μ²΄ν¬μ box
λ₯Ό μ¬μ©νλλ‘ μ½λλ₯Ό λ°κΏ λ³΄κ² μ΅λλ€.
function isPointInPolygon(polygon: Polygon, pt: Coordinate) {
const box = polygon.bbox;
if (box) {
if (pt.x < box.x[0] || pt.x > box.x[1] || pt.y < box.y[0] || pt.y > box.y[1]) {
return false;
}
}
// ...
}
νμ
체컀μ λ¬Έμ λ ν΄κ²°λμμ§λ§ μ½λλ₯Ό μ½λ μ¬λμκ²λ λ¬Έμ κ° λ¨μ μμ΅λλ€. box
μ bbox
λ κ°μ κ°μΈλ° λ€λ₯Έ μ΄λ¦μ μ¬μ©ν κ²μ
λλ€. κ°μ²΄ λΉκ΅¬μ‘°νλ₯Ό μ΄μ©νλ©΄ λ³΄λ€ κ°κ²°ν λ¬Έλ²μΌλ‘ μΌκ΄λ μ΄λ¦μ μ¬μ©ν μ μμ΅λλ€. λ°°μ΄κ³Ό μ€μ²©λ ꡬ쑰μμλ μμ μ¬μ©ν μ μμ΅λλ€.
function isPointInPolygon(polygon: Polygon, pt: Coordinate) {
const { bbox } = polygon;
if (bbox) {
const { x, y } = bbox;
if (pt.x < x[0] || pt.x > x[1] || pt.y < y[0] || pt.y > y[1]) {
return false;
}
}
// ...
}
κ·Έλ¬λ κ°μ²΄ λΉκ΅¬μ‘°νλ₯Ό μ΄μ©ν λλ λ κ°μ§λ₯Ό μ£Όμν΄μΌ ν©λλ€.
- μ 체
bbox
μμ±μ΄ μλλΌx
μy
κ° μ νμ μμ±μΈ κ²½μ°μ μμ± μ²΄ν¬κ° λ νμν©λλ€. λ°λΌμ νμ μ κ²½κ³μnull
κ°μ μΆκ°νλ κ²μ΄ μ’μ΅λλ€. bbox
μλ μ νμ μμ±μ΄ μ ν©νμ§λ§holes
λ κ·Έλ μ§ μμ΅λλ€.holes
κ° μ νμ μ΄λΌλ©΄, κ°μ΄ μκ±°λ λΉ λ°°μ΄μ΄μμ κ²λλ€. μ°¨μ΄κ° μλλ° μ΄λ¦μ ꡬλ³ν κ²μ λλ€. λΉ λ°°μ΄μ 'holes
μμ'μ λνλ΄λ μ’μ λ°©λ²μ λλ€.
λ³μΉμ νμ 체컀λΏλ§ μλλΌ λ°νμμλ νΌλμ μΌκΈ°ν μ μμ΅λλ€.
const { bbox } = polygon;
if (!bbox) {
calculatePolygonBbox(polygon); // polygon.bboxκ° μ±μμ§λλ€.
// μ΄μ polygon.bboxμ bboxλ λ€λ₯Έ κ°μ μ°Έμ‘°ν©λλ€!
}
νμ μ€ν¬λ¦½νΈμ μ μ΄ νλ¦ λΆμμ μ§μ λ³μμλ κ½€ μ λμν©λλ€. κ·Έλ¬λ κ°μ²΄ μμ±μλ μ£Όμν΄μΌ ν©λλ€.
function fn(p: Polygon) { /* ... */ }
polygon.bbox // νμ
μ΄ BoundingBox | undefined
if (polygon.bbox) {
polygon.bbox // νμ
μ΄ BoundingBox
fn(polygon);
polygon.bbox // νμ
μ΄ BoundingBox
}
fn(polygon)
νΈμΆμ polygon.bbox
λ₯Ό μ κ±°ν κ°λ₯μ±μ΄ μμΌλ―λ‘ νμ
μ BoundingBox | undefined
λ‘ λλ리λ κ²μ΄ μμ ν κ²μ
λλ€. κ·Έλ¬λ ν¨μλ₯Ό νΈμΆν λλ§λ€ μμ± μ²΄ν¬λ₯Ό λ°λ³΅ν΄μΌ νκΈ° λλ¬Έμ μ’μ§ μμ΅λλ€. κ·Έλμ νμ
μ€ν¬λ¦½νΈλ ν¨μκ° νμ
μ μ λ₯Ό 무ν¨ννμ§ μλλ€κ³ κ°μ ν©λλ€. κ·Έλ¬λ μ€μ λ‘λ 무ν¨νλ κ°λ₯μ±μ΄ μμ΅λλ€. polygon.bbox
λ‘ μ¬μ©νλ λμ bbox
μ§μ λ³μλ‘ λ½μλ΄μ μ¬μ©νλ©΄ bbox
μ νμ
μ μ νν μ μ§λμ§λ§, polygon.bbox
μ κ°κ³Ό κ°κ² μ μ§λμ§ μμ μ μμ΅λλ€.
π₯ μμ΄ν
25. λΉλκΈ° μ½λμλ μ½λ°± λμ async
ν¨μ μ¬μ©νκΈ°β
μ½λ°±μ΄ μ€μ²©λ μ½λλ μ§κ΄μ μΌλ‘ μ΄ν΄νκΈ° μ΄λ ΅μ΅λλ€. μμ²λ€μ λ³λ ¬λ‘ μ€ννκ±°λ μ€λ₯ μν©μ λΉ μ Έλμ€κ³ μΆλ€λ©΄ λμ± νΌλμ€λ¬μμ§λλ€.
ES2017μμλ async
μ await
ν€μλλ₯Ό λμ
νμ¬ μ½λ°± μ§μ₯μ λμ± κ°λ¨νκ² μ²λ¦¬ν μ μκ² λμμ΅λλ€.
async function fetchPages() {
const response1 = await fetch(url1);
const response2 = await fetch(url2);
const response3 = await fetch(url3);
// ...
}
await
ν€μλλ κ°κ°μ νλ‘λ―Έμ€κ° μ²λ¦¬λ λκΉμ§ fetchPages
ν¨μμ μ€νμ λ©μΆ₯λλ€. async
ν¨μ λ΄μμ await
μ€μΈ νλ‘λ―Έμ€κ° κ±°μ λλ©΄ μμΈλ₯Ό λμ§λλ€. μ΄λ₯Ό ν΅ν΄ μΌλ°μ μΈ try/catch
ꡬ문μ μ¬μ©ν μ μμ΅λλ€.
async function fetchPages() {
try {
const response1 = await fetch(url1);
const response2 = await fetch(url2);
const response3 = await fetch(url3);
// ...
} catch (e) {
// ...
}
}
μ½λ°±λ³΄λ€λ νλ‘λ―Έμ€λ async/await
λ₯Ό μ¬μ©ν΄μΌ νλ μ΄μ λ λ€μκ³Ό κ°μ΅λλ€.
- μ½λ°±λ³΄λ€λ νλ‘λ―Έμ€κ° μ½λλ₯Ό μμ±νκΈ° μ½μ΅λλ€.
- μ½λ°±λ³΄λ€λ νλ‘λ―Έμ€κ° νμ μ μΆλ‘ νκΈ° μ½μ΅λλ€.
νμ
μ€ν¬λ¦½νΈλ μΈ κ°μ§ response
λ³μ κ°κ°μ νμ
μ Response
λ‘ μΆλ‘ ν©λλ€. κ·Έλ¬λ μ½λ°± μ€νμΌλ‘ λμΌν μ½λλ₯Ό μμ±νλ €λ©΄ λ λ§μ μ½λμ νμ
κ΅¬λ¬Έμ΄ νμν©λλ€.
ννΈ μ
λ ₯λ νλ‘λ―Έμ€λ€ μ€ μ²« λ²μ§Έκ° μ²λ¦¬λ λ μλ£λλ Promise.race
λ νμ
μΆλ‘ κ³Ό μ λ§μ΅λλ€. Promise.race
λ₯Ό μ¬μ©νμ¬ νλ‘λ―Έμ€μ νμμμμ μΆκ°νλ λ°©λ²μ ννκ² μ¬μ©λλ ν¨ν΄μ
λλ€.
function timeout(millis: number): Promise<never> {
return new Promise((resolve, reject) => {
setTimeout(() => reject('timeout'), millis);
});
}
async function fetchWithTimeout(url: string, ms: number) {
return Promise.race([fetch(url), timeout(ms)]);
}
νμ
κ΅¬λ¬Έμ΄ μμ΄λ fetchWithTimeout
μ λ°ν νμ
μ Promise<Response>
λ‘ μΆλ‘ λ©λλ€. Promise.race
μ λ°ν νμ
μ μ
λ ₯ νμ
λ€μ μ λμ¨μ΄κ³ , μ΄λ² κ²½μ°λ Promise<Response | never>
κ° λ©λλ€. κ·Έλ¬λ never
μμ μ λμ¨μ μλ¬΄λ° ν¨κ³Όκ° μμΌλ―λ‘, κ²°κ³Όκ° Promise<Response>
λ‘ κ°λ¨ν΄μ§λλ€. νλ‘λ―Έμ€λ₯Ό μ¬μ©νλ©΄ νμ
μ€ν¬λ¦½νΈμ λͺ¨λ νμ
μΆλ‘ μ΄ μ λλ‘ λμν©λλ€.
κ°λ νλ‘λ―Έμ€λ₯Ό μ§μ μμ±ν΄μΌ ν λ, νΉν setTimeout
κ³Ό κ°μ μ½λ°± APIλ₯Ό λνν κ²½μ°κ° μμ΅λλ€. κ·Έλ¬λ μ νμ μ¬μ§κ° μλ€λ©΄ μΌλ°μ μΌλ‘λ νλ‘λ―Έμ€λ₯Ό μμ±νκΈ°λ³΄λ€ async/await
λ₯Ό μ¬μ©ν΄μΌ ν©λλ€. κ·Έ μ΄μ λ λ€μ λ κ°μ§μ
λλ€.
- μΌλ°μ μΌλ‘ λ κ°κ²°νκ³ μ§κ΄μ μΈ μ½λκ° λ©λλ€.
async
ν¨μλ νμ νλ‘λ―Έμ€λ₯Ό λ°ννλλ‘ κ°μ ν©λλ€.
// function getNumber(): Promise<number>
async function getNumber() {
return 42;
}
async
νμ΄ν ν¨μλ₯Ό λ§λ€ μλ μμ΅λλ€.
const getNumber = async () => 42; // νμ
μ΄ () => Promise<number>
νλ‘λ―Έμ€λ₯Ό μ§μ μμ±νλ©΄ λ€μκ³Ό κ°μ΅λλ€.
const getNumber = () => Promise.resolve(42); // νμ
μ΄ () => Promise<number>
ν¨μλ νμ λκΈ° λλ λΉλκΈ°λ‘ μ€νλμ΄μΌ νλ©° μ λ νΌμ©ν΄μλ μ λ©λλ€. μ½λ°±μ΄λ νλ‘λ―Έμ€λ₯Ό μ¬μ©νλ©΄ λ°(half)λκΈ° μ½λλ₯Ό μμ±ν μ μμ§λ§, async
λ₯Ό μ¬μ©νλ©΄ νμ λΉλκΈ° μ½λλ₯Ό μμ±νλ μ
μ
λλ€.
async
ν¨μμμ νλ‘λ―Έμ€λ₯Ό λ°ννλ©΄ λ λ€λ₯Έ νλ‘λ―Έμ€λ‘ λνλμ§ μμ΅λλ€. λ°ν νμ
μ Promise<Promise<T>>
κ° μλ Promise<T>
κ° λ©λλ€. νμ
μ€ν¬λ¦½νΈλ₯Ό μ¬μ©νλ©΄ νμ
μ λ³΄κ° λͺ
νν λλ¬λκΈ° λλ¬Έμ λΉλκΈ° μ½λμ κ°λ
μ μ‘λ λ° λμμ΄ λ©λλ€.
// function getJSON(url: string): Promise<any>
async function getJSON(url: string) {
const response = await fetch(url);
const jsonPromise = response.json(); // νμ
μ΄ Promise<any>
return jsonPromise;
}
π₯ μμ΄ν 26. νμ μΆλ‘ μ λ¬Έλ§₯μ΄ μ΄λ»κ² μ¬μ©λλμ§ μ΄ν΄νκΈ°β
λ¬Έλ§₯μ κ³ λ €ν΄ νμ μ μΆλ‘ νλ©΄ κ°λ μ΄μν κ²°κ³Όκ° λμ΅λλ€.
μλ°μ€ν¬λ¦½νΈλ μ½λμ λμκ³Ό μ€ν μμλ₯Ό λ°κΎΈμ§ μμΌλ©΄μ ννμμ μμλ‘ λΆλ¦¬ν΄ λΌ μ μμ΅λλ€. μλ₯Ό λ€μ΄, λ€μ λ λ¬Έμ₯μ λμΌν©λλ€.
// μΈλΌμΈ νν
setLanguage('JavaScript');
// μ°Έμ‘° νν
let language = 'JavaScript';
setLanguage(language);
νμ μ€ν¬λ¦½νΈμμλ λ€μ 리ν©ν°λ§μ΄ μ¬μ ν λμν©λλ€.
function setLanguage(language: string) { /* ... */ }
setLanguage('JavaScript');
let language = 'JavaScript';
setLanguage(language);
μ΄μ λ¬Έμμ΄ νμ μ λ νΉμ ν΄μ λ¬Έμμ΄ λ¦¬ν°λ΄ νμ μ μ λμ¨μΌλ‘ λ°κΎΌλ€κ³ κ°μ ν΄ λ³΄κ² μ΅λλ€.
type Language = 'JavaScript' | 'TypeScript' | 'Python';
function setLanguage(language: Language) { /* ... */ }
setLanguage('JavaScript'); // μ μ
let language = 'JavaScript';
setLanguage(language); // string νμμ μΈμλ Language νμμ 맀κ°λ³μμ ν λΉλ μ μμ΅λλ€.
μΈλΌμΈ ννμμ νμ
μ€ν¬λ¦½νΈλ ν¨μ μ μΈμ ν΅ν΄ 맀κ°λ³μκ° Language
νμ
μ΄μ΄μΌ νλ€λ κ²μ μκ³ μμ΅λλ€. ν΄λΉ νμ
μ λ¬Έμμ΄ λ¦¬ν°λ΄ JavaScript
λ ν λΉ κ°λ₯νλ―λ‘ μ μμ
λλ€. κ·Έλ¬λ μ΄ κ°μ λ³μλ‘ λΆλ¦¬ν΄λ΄λ©΄, νμ
μ€ν¬λ¦½νΈλ ν λΉ μμ μ νμ
μ μΆλ‘ ν©λλ€. μ΄λ² κ²½μ°λ string
μΌλ‘ μΆλ‘ νκ³ , Language
νμ
μΌλ‘ ν λΉμ΄ λΆκ°λ₯νλ―λ‘ μ€λ₯κ° λ°μνμ΅λλ€.
μ΄λ° λ¬Έμ λ₯Ό ν΄κ²°νλ λ κ°μ§ λ°©λ²μ΄ μμ΅λλ€. 첫 λ²μ§Έ ν΄λ²μ νμ
μ μΈμμ language
μ κ°λ₯ν κ°μ μ ννλ κ²μ
λλ€.
let language: Language = 'JavaScript';
setLanguage(language); // μ μ
λ λ²μ§Έ ν΄λ²μ language
λ₯Ό μμλ‘ λ§λλ κ²μ
λλ€.
const language = 'JavaScript';
setLanguage(language); // μ μ
const
λ₯Ό μ¬μ©νμ¬ νμ
체컀μκ² language
λ λ³κ²½ν μ μλ€κ³ μλ € μ€λλ€. λ°λΌμ νμ
μ€ν¬λ¦½νΈλ language
μ λν΄μ λ μ νν νμ
μΈ λ¬Έμμ΄ λ¦¬ν°λ΄ JavaScript
λ‘ μΆλ‘ ν μ μμ΅λλ€.
κ·Έλ°λ° μ΄ κ³Όμ μμ μ¬μ©λλ λ¬Έλ§₯μΌλ‘λΆν° κ°μ λΆλ¦¬νμ΅λλ€. λ¬Έλ§₯κ³Ό κ°μ λΆλ¦¬νλ©΄ μΆνμ κ·Όλ³Έ μ μΈ λ¬Έμ λ₯Ό λ°μμν¬ μ μμ΅λλ€.
νν μ¬μ© μ μ£Όμμ β
μ΄λμ΄ κ°λ₯ν μ§λλ₯Ό λ³΄μ¬ μ£Όλ νλ‘κ·Έλ¨μ μμ±νλ€κ³ μκ°ν΄ λ³΄κ² μ΅λλ€.
// 맀κ°λ³μλ (latitude, longitude) μμ
λλ€.
function panTo(where: [number, number]) { /* ... */ }
panTo([10, 20]); // μ μ
const loc = [10, 20];
panTo(loc); // number[] νμμ μΈμλ [number, number] νμμ 맀κ°λ³μμ ν λΉλ μ μμ΅λλ€.
any
λ₯Ό μ¬μ©νμ§ μκ³ μ€λ₯λ₯Ό κ³ μΉ μ μλ λ°©λ²μ μκ°ν΄ λ³΄κ² μ΅λλ€. any
λμ const
λ‘ μ μΈνλ©΄ λλ€λ λ΅μ΄ λ μ€λ₯Ό μλ μκ² μ§λ§ loc
μ μ΄λ―Έ const
λ‘ μ μΈν μνμ
λλ€. 그보λ€λ νμ
μ€ν¬λ¦½νΈκ° μλλ₯Ό μ νν νμ
ν μ μλλ‘ νμ
μ μΈμ μ 곡νλ λ°©λ²μ μλν΄ λ³΄κ² μ΅λλ€.
const loc: [number, number] = [10, 20];
panTo(loc); // μ μ
any
λ₯Ό μ¬μ©νμ§ μκ³ μ€λ₯λ₯Ό κ³ μΉ μ μ λ λ λ€λ₯Έ λ°©λ²μ μμ λ¬Έλ§₯μ μ 곡νλ κ²μ
λλ€. const
λ λ¨μ§ κ°μ΄ κ°λ¦¬ν€λ μ°Έμ‘°κ° λ³νμ§ μλ μμ μμμΈ λ°λ©΄, as const
λ κ·Έ κ°μ΄ λ΄λΆκΉμ§ μμλΌλ μ¬μ€μ νμ
μ€ν¬λ¦½νΈμκ² μλ € μ€λλ€.
const loc = [10, 20] as const;
panTo(loc); // readonly [10, 20] νμμ readonlyμ΄λ©° λ³κ²½ κ°λ₯ν νμ [number, number]μ ν λΉν μ μμ΅λλ€.
νΈμ§κΈ°μμ loc
μ λ§μ°μ€λ₯Ό μ¬λ €λ³΄λ©΄, νμ
μ μ΄μ number[]
κ° μλλΌ readonly[10, 20]
μΌλ‘ μΆλ‘ λ¨μ μ μ μμ΅λλ€. κ·Έλ°λ° μνκΉκ²λ μ΄ μΆλ‘ μ panTo
μ νμ
μκ·Έλμ²λ where
μ λ΄μ©μ΄ λΆλ³μ΄λΌκ³ 보μ₯νμ§ μμ΅λλ€. μ¦, loc
맀κ°λ³μκ° readonly
νμ
μ΄λ―λ‘ λμνμ§ μμ΅λλ€.
λ°λΌμ any
λ₯Ό μ¬μ©νμ§ μκ³ μ€λ₯λ₯Ό κ³ μΉ μ μλ μ΅μ μ ν΄κ²°μ±
μ panTo
ν¨μμ readonly
ꡬ문μ μΆκ°νλ κ²μ
λλ€.
function panTo(where: readonly [number, number]) { /* ... */ }
const loc = [10, 20] as const;
panTo(loc); // μ μ
νμ
μκ·Έλμ²λ₯Ό μμ ν μ μλ κ²½μ°λΌλ©΄ νμ
ꡬ문μ μ¬μ©ν΄μΌ ν©λλ€.
as const
λ λ¬Έλ§₯ μμ€κ³Ό κ΄λ ¨ν λ¬Έμ λ₯Ό κΉλνκ² ν΄κ²°ν μ μμ§λ§, ν κ°μ§ λ¨μ μ κ°μ§κ³ μμ΅λλ€. λ§μ½ νμ
μ μμ μ€μκ° μλ€λ©΄(μλ₯Ό λ€μ΄, ννμ μΈ λ²μ§Έ μμλ₯Ό μΆκ°νλ€λ©΄) μ€λ₯λ νμ
μ μκ° μλλΌ νΈμΆλλ κ³³μμ λ°μνλ€λ κ²μ
λλ€. νΉν μ¬λ¬ κ²Ή μ€μ²©λ κ°μ²΄μμ μ€λ₯κ° λ°μνλ€λ©΄ κ·Όλ³Έμ μΈ μμΈμ νμ
νκΈ° μ΄λ ΅μ΅λλ€.
const loc = [10, 20, 30] as const; // μ€μ μ€λ₯λ μ¬κΈ°μ λ°μν©λλ€.
panTo(loc); // μλ¬ λ‘κ·Έκ° μ¬κΈ°μ λνλ©λλ€.
κ°μ²΄ μ¬μ© μ μ£Όμμ β
λ¬Έλ§₯μμ κ°μ λΆλ¦¬νλ λ¬Έμ λ 무μμ΄ λ¦¬ν°λ΄μ΄λ ννμ ν¬ν¨νλ ν° κ°μ²΄μμ μμλ₯Ό λ½μλΌ λλ λ°μν©λλ€.
type Language = 'JavaScript' | 'TypeScript' | 'Python';
interface GovernedLanguage {
language: Language;
organization: string;
}
function complain(language: GovernedLanguage) { /* ... */ }
complain({ language: 'TypeScript', organization: 'Microsoft' }); // μ μ
const ts = {
language: 'TypeScript',
organization: 'Microsoft',
};
complain(ts); // μλ¬ λ°μ
μ΄ λ¬Έμ λ νμ μ μΈμ μΆκ°νκ±°λ μμ λ¨μΈμ μ¬μ©ν΄ ν΄κ²°ν©λλ€.