π€ Chapter 8. νμ μ€ν¬λ¦½νΈλ‘ λ§μ΄κ·Έλ μ΄μ νκΈ°
π₯ μμ΄ν 58. λͺ¨λ μλ°μ€ν¬λ¦½νΈλ‘ μμ±νκΈ°β
ECMAScript λͺ¨λ μ¬μ©νκΈ°β
ES2015λΆν°λ μν¬νΈμ μ΅μ€ν¬νΈλ₯Ό μ¬μ©νλ ECMAScript λͺ¨λμ΄ νμ€μ΄ λμμ΅λλ€. λ§μ½ λ§μ΄κ·Έλ μ΄μ λμμΈ μλ°μ€ν¬λ¦½νΈ μ½λκ° λ¨μΌ νμΌμ΄κ±°λ λΉνμ€ λͺ¨λ μμ€ν μ μ¬μ© μ€μ΄λΌλ©΄ ES λͺ¨λλ‘ μ ννλ κ²μ΄ μ’μ΅λλ€. ES λͺ¨λ μμ€ν μ νμ μ€ν¬λ¦½νΈμμλ μ λμνλ©°, λͺ¨λ λ¨μλ‘ μ νν μ μκ² ν΄ μ£ΌκΈ° λλ¬Έμ μ μ§μ λ§μ΄κ·Έλ μ΄μ μ΄ μνν΄μ§λλ€.
// a.ts
import * as b from './b';
// b.ts
export const name = 'Module B';
νλ‘ν νμ λμ ν΄λμ€ μ¬μ©νκΈ°β
λ§μ΄κ·Έλ μ΄μ νλ €λ μ½λμμ λ¨μν κ°μ²΄λ₯Ό λ€λ£° λ νλ‘ν νμ μ μ¬μ©νκ³ μλ€λ©΄ ν΄λμ€λ‘ λ°κΎΈλ κ²μ΄ μ’μ΅λλ€.
class Person {
first: string;
last: string;
constructor(first: string, last: string) {
this.first = first;
this.last = last;
}
getName() {
return this.first + ' ' + this.last;
}
}
const marie = new Person('Marie', 'Curie');
const personName = marie.getName();
var
λμ let
/const
μ¬μ©νκΈ°β
μλ°μ€ν¬λ¦½νΈ var
ν€μλμ μ€μ½ν κ·μΉμ λ¬Έμ κ° μλ€λ κ²μ λ리 μλ €μ§ μ¬μ€μ
λλ€. var
λμ let
κ³Ό const
λ₯Ό μ¬μ©νλ©΄ μ λλ‘ λ λΈλ‘ μ€μ½ν κ·μΉμ κ°μ§λ©°, κ°λ°μλ€μ΄ μΌλ°μ μΌλ‘ κΈ°λνλ λ°©μμΌλ‘ λμν©λλ€.
for(;;)
λμ for-of
λλ λ°°μ΄ λ©μλ μ¬μ©νκΈ°β
λͺ¨λ μλ°μ€ν¬λ¦½νΈμμλ for-of
루νκ° μ‘΄μ¬ν©λλ€.
for (const el of array) {
// ...
}
for-of
루νλ μ½λκ° μ§§κ³ μΈλ±μ€ λ³μλ₯Ό μ¬μ©νμ§λ μκΈ° λλ¬Έμ μ€μλ₯Ό μ€μΌ μ μμ΅λλ€. μΈλ±μ€ λ³μκ° νμν κ²½μ°μ forEach
λ©μλλ₯Ό μ¬μ©νλ©΄ λ©λλ€.
array.forEach((ei, i) => {
// ...
});
ν¨μ ννμλ³΄λ€ νμ΄ν ν¨μ μ¬μ©νκΈ°β
this
ν€μλλ μΌλ°μ μΈ λ³μλ€κ³Όλ λ€λ₯Έ μ€μ½ν κ·μΉμ κ°μ§κΈ° λλ¬Έμ, μλ°μ€ν¬λ¦½νΈμμ κ°μ₯ μ΄λ €μ΄ κ°λ
μ€ νλμ
λλ€. μΌλ°μ μΌλ‘λ this
κ° ν΄λμ€ μΈμ€ν΄μ€λ₯Ό μ°Έμ‘°νλ κ²μ κΈ°λνμ§λ§ λ€μ μμ μ²λΌ μμμΉ λͺ»ν κ²°κ³Όκ° λμ€λ κ²½μ°λ μμ΅λλ€.
class Foo {
method() {
console.log(this);
[1, 2].forEach(function(i) {
console.log(this);
});
}
}
const f = new Foo();
f.method();
// strict λͺ¨λμμ Foo, undefined, undefinedλ₯Ό μΆλ ₯ν©λλ€.
// non-strict λͺ¨λμμ Foo, window, window (!)λ₯Ό μΆλ ₯ν©λλ€.
λμ νμ΄ν ν¨μλ₯Ό μ¬μ©νλ©΄ μμ μ€μ½νμ this
λ₯Ό μ μ§ν μ μμ΅λλ€.
class Foo {
method() {
console.log(this);
[1, 2].forEach(i => {
console.log(this);
});
}
}
const f = new Foo();
f.method();
// νμ Foo, Foo, Fooλ₯Ό μΆλ ₯ν©λλ€.
μ»΄νμΌλ¬ μ΅μ
μ noImplicitThis
(λλ strict
)λ₯Ό μ€μ νλ©΄, νμ
μ€ν¬λ¦½νΈκ° this
λ°μΈλ© κ΄λ ¨λ μ€λ₯λ₯Ό νμν΄ μ£Όλ―λ‘ μ€μ νλ κ²μ΄ μ’μ΅λλ€.
λ¨μΆ κ°μ²΄ ννκ³Ό ꡬ쑰 λΆν΄ ν λΉ μ¬μ©νκΈ°β
const x = 1, y = 2, z = 3;
const pt = { x, y, z };
const obj = {
onClickLong: function(e) {
// ...
}
onClickCompact(e) {
// ...
}
}
λ¨μΆ κ°μ²΄ ννμ λ°λλ κ°μ²΄ ꡬ쑰 λΆν΄μ λλ€.
const { props } = obj;
const { a, b } = props;
ν¨μ 맀κ°λ³μ κΈ°λ³Έκ° μ¬μ©νκΈ°β
λͺ¨λ μλ°μ€ν¬λ¦½νΈμμλ 맀κ°λ³μμ κΈ°λ³Έκ°μ μ§μ μ§μ ν μ μμ΅λλ€.
function parseNum(str, base = 10) {
return parseInt(str, base);
}
μ μμ€ νλ‘λ―Έμ€λ μ½λ°± λμ async/await
μ¬μ©νκΈ°β
async
μ await
λ₯Ό μ¬μ©νλ©΄ μ½λκ° κ°κ²°ν΄μ Έμ λ²κ·Έλ μ€μλ₯Ό λ°©μ§ν μ μκ³ , λΉλκΈ° μ½λμ νμ
μ λ³΄κ° μ λ¬λμ΄ νμ
μΆλ‘ μ κ°λ₯νκ² νλ€λ κ²μ
λλ€.
async function getJSON(url: string) {
const response = await fetch(url);
return response.json();
}
μ°κ΄ λ°°μ΄ κ°μ²΄ λμ Map
κ³Ό Set
μ¬μ©νκΈ°β
function countWordsMap(text: string) {
const counts = new Map<string, number>();
for (const word of text.split(/[\s,.]+/)) {
count.set(word, 1 + (counts.get(word) || 0));
}
return counts;
}
νμ μ€ν¬λ¦½νΈμ use strict λ£μ§ μκΈ°β
ES5μμλ λ²κ·Έκ° λ μ μλ μ½λ ν¨ν΄μ μ€λ₯λ₯Ό νμν΄ μ£Όλ μ격 λͺ¨λ(strict mode)κ° λμ λμμ΅λλ€.
'use strict';
function foo() {
x = 10; // strict λͺ¨λμμλ μ€λ₯
}
νμ
μ€ν¬λ¦½νΈμμ μνλλ μμ μ± κ²μ¬κ° μ격 λͺ¨λλ³΄λ€ ν¨μ¬ λ μ격ν 체ν¬λ₯Ό νκΈ° λλ¬Έμ, νμ
μ€ν¬λ¦½νΈ μ½λμμ 'use strict'
λ 무μλ―Έν©λλ€. νμ
μ€ν¬λ¦½νΈ μ½λμ 'use strict'
λ₯Ό μ°μ§ μκ³ , λμ alwaysStrict
μ€μ μ μ¬μ©ν΄μΌ ν©λλ€.
π₯ μμ΄ν
59. νμ
μ€ν¬λ¦½νΈ λμ
μ μ @ts-check
μ JSDoc
μΌλ‘ μνν΄ λ³΄κΈ°β
@ts-check
μ§μμλ₯Ό μ¬μ©νμ¬ νμ
μ²΄μ»€κ° νμΌμ λΆμνκ³ , λ°κ²¬λ μ€λ₯λ₯Ό λ³΄κ³ νλλ‘ μ§μν©λλ€. κ·Έλ¬λ @ts-check
μ§μμλ λ§€μ° λμ¨ν μμ€μΌλ‘ νμ
체ν¬λ₯Ό μννλλ°, μ¬μ§μ΄ noImplicitAny
μ€μ μ ν΄μ ν κ²λ³΄λ€ νκ±°μ΄ μ²΄ν¬λ₯Ό μννλ€λ μ μ μ£Όμν΄μΌ ν©λλ€.
@ts-check
const person = { first: 'Grace', last: 'Hopper' };
2 * person.first
// ~~~~~~~~~~~~ μ°μ μ°μ° μ€λ₯Έμͺ½μ 'any', 'number', 'bigint' λλ μ΄κ±°ν νμμ΄μ΄μΌ ν©λλ€.
@ts-check
μ§μμλ₯Ό μ¬ μ©νλ©΄ νμ
λΆμΌμΉλ ν¨μμ 맀κ°λ³μ κ°μ λΆμΌμΉ κ°μ κ°λ¨ν μ€λ₯ μΈμλ, λ€μμ μκ°νλ λͺ κ°μ§ μλ―Έ μλ μ€λ₯λ€μ μ°ΎμλΌ μ μμ΅λλ€.
- μ μΈλμ§ μμ μ μ λ³μ
- μ μ μλ λΌμ΄λΈλ¬λ¦¬
- DOM λ¬Έμ
- λΆμ νν JSDoc
P.301 ~ P.306 μ°Έκ³
μμ½β
- νμΌ μλ¨μ
// @ts-check
λ₯Ό μΆκ°νλ©΄ μλ°μ€ν¬λ¦½νΈμμλ νμ 체ν¬λ₯Ό μνν μ μμ΅λλ€. - μ μ μ μΈκ³Ό μλνν° λΌμ΄λΈλ¬λ¦¬μ νμ μ μΈμ μΆκ°νλ λ°©λ²μ μ΅νμλ€.
- JSDoc μ£Όμμ μ νμ©νλ©΄ μλ°μ€ν¬λ¦½νΈ μνμμλ νμ λ¨μΈκ³Ό νμ μΆλ‘ μ ν μ μμ΅λλ€.
- JSDoc μ£Όμμ μ€κ° λ¨κ³μ΄κΈ° λλ¬Έμ λ무 곡λ€μΌ νμλ μμ΅λλ€. μ΅μ’
λͺ©νλ
.ts
λ‘ λ νμ μ€ν¬λ¦½νΈ μ½λμμ λͺ μ¬ν©μλ€.
π₯ μμ΄ν 60. allowJsλ‘ νμ μ€ν¬λ¦½νΈμ μλ°μ€ν¬λ¦½νΈ κ°μ΄ μ¬μ©νκΈ°β
μκ·λͺ¨ νλ‘μ νΈλ νκΊΌλ²μ νμ μ€ν¬λ¦½νΈλ‘ μ νν μ μμ΅λλ€. κ·Έλ¬λ λκ·λͺ¨ νλ‘μ νΈλ νκΊΌλ²μ μμ νλ κ²μ΄ λΆκ°λ₯νλ―λ‘ μ μ§μ μΌλ‘ μ νν μ μμ΄μΌ ν©λλ€. κ·Έλ¬λ €λ©΄ λ§μ΄κ·Έλ μ΄μ κΈ°κ° μ€μ μλ°μ€ν¬λ¦½νΈμ νμ μ€ν¬λ¦½νΈκ° λμμ λμν μ μλλ‘ ν΄μΌ ν©λλ€.
νμ
μ€ν¬λ¦½νΈμ μλ°μ€ν¬λ¦½νΈκ° 곡쑴νλ λ°©λ²μ ν΅μ¬μ allowJs
μ»΄νμΌλ¬ μ΅μ
μΈλ°, νμ
μ€ν¬λ¦½νΈ νμΌκ³Ό μλ°μ€ν¬λ¦½νΈ νμΌμ μλ‘ μν¬νΈν μ μκ² ν΄μ€λλ€.
νμ
체ν¬μ κ΄λ ¨μ΄ μμ§λ§, κΈ°μ‘΄ λΉλ κ³Όμ μ νμ
μ€ν¬λ¦½νΈ μ»΄νμΌλ¬λ₯Ό μΆκ°νκΈ° μν΄μ allowJs
μ΅μ
μ΄ νμν©λλ€. λν λͺ¨λ λ¨μλ‘ νμ
μ€ν¬λ¦½νΈλ‘ μ ννλ κ³Όμ μμ ν
μ€νΈλ₯Ό μνν΄μΌ νκΈ° λλ¬Έμ allowJs
μ΅μ
μ΄ νμν©λλ€.
λ²λ€λ¬μ νμ
μ€ν¬λ¦½νΈκ° ν΅ν©λμ΄ μκ±°λ, νλ¬κ·ΈμΈ λ°©μμΌλ‘ ν΅ν©μ΄ κ°λ₯νλ€λ©΄ allowJs
λ₯Ό κ°λ¨ν μ μ©ν μ μμ΅λλ€.
κΈ°μ‘΄ μλ°μ€ν¬λ¦½νΈ μ½λμ νΉλ³ν κ·μΉμ΄ μλ€λ©΄, νμ
μ€ν¬λ¦½νΈκ° μμ±ν μ½λκ° κΈ°μ‘΄ μλ°μ€ν¬λ¦½νΈ μ½λμ κ·μΉμ λ°λ₯΄λλ‘ μΆλ ₯ μ΅μ
μ μ‘°μ ν΄μΌ ν μλ μμ΅λλ€.
νμ
μ€ν¬λ¦½νΈλ‘ λ§μ΄κ·Έλ μ΄μ
νλ λμμ λΉλμ ν
μ€νΈκ° λμνκ² νλ κ²μ΄ νλ€κΈ°λ νμ§λ§, μ λλ‘ λ μ μ§μ λ§μ΄κ·Έλ μ΄μ
μ μμνκΈ° μν΄ λ°λμ νμν©λλ€.
π₯ μμ΄ν 61. μμ‘΄μ± κ΄κ³μ λ°λΌ λͺ¨λ λ¨μλ‘ μ ννκΈ°β
μ μ§μ λ§μ΄κ·Έλ μ΄μ μ ν λλ λͺ¨λ λ¨μλ‘ κ°κ°κ²©ν νλ κ²μ΄ μ΄μμ μ λλ€. κ·Έλ°λ° ν λͺ¨λμ 골λΌμ νμ μ 보λ₯Ό μΆκ°νλ©΄, ν΄λΉ λͺ¨λμ΄ μμ‘΄νλ λͺ¨λμμ λΉλ‘―λλ νμ μ€λ₯κ° λ°μνκ² λ©λλ€. μμ‘΄μ±κ³Ό κ΄λ ¨λ μ€λ₯ μμ΄ μμ νλ €λ©΄, λ€λ₯Έ λͺ¨λμ μμ‘΄νμ§ μλ μ΅νλ¨ λͺ¨λλΆν° μμ μ μμν΄μ μμ‘΄μ±μ μ΅μλ¨μ μλ λͺ¨λμ λ§μ§λ§μΌλ‘ μμ±ν΄μΌ ν©λλ€.
νλ‘μ νΈ λ΄μ μ‘΄μ¬νλ λͺ¨λμ μλνν° λΌμ΄λΈλ¬λ¦¬μ μμ‘΄νμ§λ§ μλνν° λΌμ΄λΈλ¬λ¦¬λ ν΄λΉ λͺ¨λμ μμ‘΄νμ§ μκΈ° λλ¬Έμ, μλνν° λΌμ΄λΈλ¬λ¦¬ νμ
μ 보λ₯Ό κ°μ₯ λ¨Όμ ν΄κ²°ν΄μΌ ν©λλ€. μΌλ°μ μΌλ‘ @types
λͺ¨λμ μ€μΉνλ©΄ λ©λλ€.
μΈλΆ APIλ₯Ό νΈμΆνλ κ²½μ°μλ μκΈ° λλ¬Έμ μΈλΆ APIμ νμ μ 보λ μΆκ°ν΄μΌ ν©λλ€. μΈλΆ APIμ νμ μ 보λ νΉλ³ν λ¬Έλ§₯μ΄ μκΈ° λλ¬Έμ νμ μ€ν¬λ¦½νΈκ° μΆλ‘ νκΈ° μ΄λ ΅μ΅λλ€. κ·Έλ¬λ―λ‘ APIμ λν μ¬μμ κΈ°λ°μΌλ‘ νμ μ 보λ₯Ό μμ±ν΄μΌ ν©λλ€.
λ§μ΄κ·Έλ μ΄μ ν λλ νμ μ 보 μΆκ°λ§ νκ³ , 리ν©ν°λ§μ ν΄μλ μ λ©λλ€. μ€λλ νλ‘μ νΈμΌμλ‘ κ°μ μ΄ νμν λΆλΆμ μμ£Ό λ§μ£ΌμΉκ² μ§λ§, λΉμ₯μ λͺ©νλ μ½λ κ°μ μ΄ μλλΌ νμ μ€ν¬λ¦½νΈλ‘ μ ννλ κ²μμ λͺ μ¬ν΄μΌ ν©λλ€.
μ μΈλμ§ μμ ν΄λμ€ λ©€λ²β
μλ°μ€ν¬λ¦½νΈλ ν΄λμ€ λ©€λ² λ³μλ₯Ό μ μΈν νμκ° μμ§λ§, νμ μ€ν¬λ¦½νΈμμλ λͺ μμ μΌλ‘ μ μΈν΄μΌ ν©λλ€.
class Greeting {
greeting: string;
name: any;
constructor(name) {
this.greeting = 'Hello';
this.name = name;
}
greet() {
return this.greeting + ' ' + this.name;
}
}
νμ μ΄ λ°λλ κ°β
λ€μ μ½λλ μλ°μ€ν¬λ¦½νΈμΌ λλ λ¬Έμ κ° μμ§λ§, νμ μ€ν¬λ¦½νΈκ° λλ μκ° μ€λ₯κ° λ°μν©λλ€.
const state = {};
state.name = 'New York'; // {} μ νμ name μμ±μ΄ μμ΅λλ€.
state.capital = 'Albany'; // {} μ νμ capital μμ±μ΄ μμ΅λλ€.
νκΊΌλ²μ κ°μ²΄λ₯Ό μμ±νλ©΄ κ°λ¨ν μ€λ₯λ₯Ό ν΄κ²°ν μ μμ΅λλ€. (μμ΄ν 23)
const state = {
name: 'New York',
capital: 'Albany',
};
νκΊΌλ²μ μμ±νκΈ° κ³€λν κ²½μ°μλ μμλ°©νΈμΌλ‘ νμ λ¨μΈλ¬Έμ μ¬μ©ν μλ μμ΅λλ€.
interface State {
name: string;
capital: string;
}
const state = {} as State;
state.name = 'New York';
state.capital = 'Albany';
λΉμ₯μ λ§μ΄κ·Έλ μ΄μ μ΄ μ€μνκΈ° λλ¬Έμ νμ λ¨μΈλ¬Έμ μ¬μ©ν κ²μ΄λ©°, λ§μ΄κ·Έλ μ΄μ μ΄ μλ£λ νμλ μμ΄ν 9λ₯Ό μ°Έκ³ νμ¬ λ¬Έμ λ₯Ό μ λλ‘ ν΄κ²°ν΄μΌ ν©λλ€.
λ§μ§λ§ λ¨κ³λ‘, ν μ€νΈ μ½λλ₯Ό νμ μ€ν¬λ¦½νΈλ‘ μ ννλ©΄ λ©λλ€. λ‘μ§ μ½λκ° ν μ€νΈ μ½λμ μμ‘΄νμ§ μκΈ° λλ¬Έμ, ν μ€νΈ μ½λλ νμ μμ‘΄μ± κ΄κ³λμ μ΅μλ¨μ μμΉνλ©° λ§μ΄κ·Έλ μ΄μ μ λ§μ§λ§ λ¨κ³κ° λλ κ²μ μμ°μ€λ¬μ΄ μΌμ λλ€. κ·Έλ¦¬κ³ μ΅νλ¨μ λͺ¨λλΆν° νμ μ€ν¬λ¦½νΈλ‘ μ ννλ μμ€μλ ν μ€νΈ μ½λλ λ³κ²½λμ§ μμκ³ , ν μ€νΈλ₯Ό μνν μ μμμ κ²λλ€. λ§μ΄κ·Έλ μ΄μ κΈ°κ° μ€μ ν μ€νΈλ₯Ό μνν μ μλ€λ κ²μ μμ²λ μ΄μ μ λλ€.
π₯ μμ΄ν
62. λ§μ΄κ·Έλ μ΄μ
μ μμ±μ μν΄ noImplicitAny
μ€μ νκΈ°β
noImplicitAny
κ° μ€μ λμ§ μμ μνμμλ νμ
μ μΈμμ λΉλ‘―λλ μ€μ μ€λ₯κ° μ¨μ΄ μκΈ° λλ¬Έμ λ§μ΄κ·Έλ μ΄μ
μ΄ μλ£λμλ€κ³ ν μ μμ΅λλ€. noImplicitAny
μ€μ μ νμ§ μμΌλ©΄, νμ
체ν¬λ λ§€μ° νμ ν΄μ§λλ€. μ²μμλ noImplicitAny
λ₯Ό λ‘컬μλ§ μ€μ νκ³ μμ
νλ κ²μ΄ μ’μ΅λλ€. μλνλ©΄ μ격μμλ μ€μ μ λ³νκ° μκΈ° λλ¬Έμ λΉλκ° μ€ν¨νμ§ μκΈ° λλ¬Έμ
λλ€. λ‘컬μμλ§ μ€λ₯λ‘ μΈμλκΈ° λλ¬Έμ, μμ ν λΆλΆλ§ 컀λ°ν μ μμ΄μ μ μ§μ λ§μ΄κ·Έλ μ΄μ
μ΄ κ°λ₯ν©λλ€.
ννΈ, νμ
μ²΄μ»€κ° λ°μνλ μ€λ₯μ κ°μλ noImplicitAny
μ κ΄λ ¨λ μμ
μ μ§μ²λλ₯Ό λνλ΄λ μ§νλ‘ νμ©ν μ μμ΅λλ€.