본문으둜 κ±΄λ„ˆλ›°κΈ°

🐀 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와 κ΄€λ ¨λœ μž‘μ—…μ˜ 진척도λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ§€ν‘œλ‘œ ν™œμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.