LHS_EffectiveTypescript_11 - YDP-SPLOUNGE-CLUB/typescript-study GitHub Wiki
νμκ° μλ μμ‘΄μ±μ λΆλ¦¬ν λλ ꡬ쑰μ νμ΄νμ μ¬μ©νλ©΄ λλ€.
CSV νμΌμ νμ±νλ λΌμ΄λΈλ¬λ¦¬λ₯Ό μμ±νλ€κ³ κ°μ ν΄λ³΄μ.
CSV νμΌμ λ΄μ©μ λ§€κ°λ³μλ‘ λ°κ³ μ΄ μ΄λ¦μ κ°μΌλ‘ λ§€ννλ κ°μ²΄λ€μ μμ±νμ¬ λ°°μ΄λ‘ λ°ννλ€. κ·Έλ¦¬κ³ NodeJS μ¬μ©μλ₯Ό μν΄ λ§€κ°λ³μμ Buffer νμ μ νμ©νλ€.
function parseCSV(contents: string | Buffer): { [column: string]: string }[] {
if (typeof contents === 'object') {
// It's a buffer
return parseCSV(contents.toString('utf8'))
} // COMPRESS
return []
// END
}Buffer νμ
μ npm install --save-dev @types/node λ₯Ό ν΅ν΄ μ»μ μ μλ€.
κ·Έλ¬λ @types/nodeλ₯Ό devDependenciesλ‘ ν¬ν¨νλ©΄ λ€μ λ κ·Έλ£Ήμ λΌμ΄λΈλ¬λ¦¬ μ¬μ©μλ€μκ² λ¬Έμ κ° μκΈ΄λ€.
- @typesμ 무κ΄ν μλ°μ€ν¬λ¦½νΈ κ°λ°μ
- NodeJSμ 무κ΄ν νμ μ€ν¬λ¦½νΈ μΉ κ°λ°μ
κ°μκ° νμν λͺ¨λλ§ μ¬μ©ν μ μλλ‘ κ΅¬μ‘°μ νμ΄νμ μ μ©ν μ μλ€.
interface CsvBuffer {
toString(encoding: string): string
}
function parseCSV(contents: string | CsvBuffer): { [column: string]: string }[] {
// COMPRESS
return []
// END
}CsvBuffer λ Buffer μΈν°νμ΄μ€λ³΄λ€ ν¨μ¬ μ§§μΌλ©΄μλ μ€μ λ‘ νμν λΆλΆλ§μ λΌμ΄ λ΄μ΄ λͺ μνλ€. λν ν΄λΉ νμ μ΄ Bufferμ νΈνλκΈ° λλ¬Έμ NodeJS νλ‘μ νΈμμλ μ€μ Buffer μΈμ€ν΄μ€λ‘ parseCSVλ₯Ό νΈμΆνλ κ²μ΄ κ°λ₯νλ€.
곡κ°ν λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νλ μλ°μ€ν¬λ¦½νΈ μ¬μ©μκ° @types μμ‘΄μ±μ κ°μ§μ§ μκ² ν΄μΌ νλ€. κ·Έλ¦¬κ³ μΉ κ°λ°μκ° NodeJS κ΄λ ¨λ μμ‘΄μ±μ κ°μ§μ§ μκ² ν΄μΌ νλ€.
λ§μ½ μμ±μ€μΈ λΌμ΄λΈλ¬λ¦¬κ° μμ‘΄νλ λΌμ΄λΈλ¬λ¦¬μ ꡬνκ³Ό 무κ΄νκ² νμ μλ§ μμ‘΄νλ€λ©΄, νμν μ μΈλΆλ§ μΆμΆνμ¬ μμ±μ€μΈ λΌμ΄λΈλ¬λ¦¬μ λ£λ κ²(λ―Έλ¬λ§ , mirroring)μ κ³ λ €ν΄λ³΄λ κ²λ μ’λ€.
NodeJS κΈ°λ° νμ μ€ν¬λ¦½νΈ μ¬μ©μμκ²λ λ³νκ° μμ§λ§, μΉ κΈ°λ°μ΄λ μλ°μ€ν¬λ¦½νΈ λ± λ€λ₯Έ λͺ¨λ μ¬μ©μμκ²λ λ λμ μ¬μμ μ 곡ν μ μλ€.
λ€λ₯Έ λΌμ΄λΈλ¬λ¦¬μ νμ μ΄ μλ ꡬνμ μμ‘΄νλ κ²½μ°μλ λμΌν κΈ°λ²μ μ μ©ν μ μκ³ νμ μμ‘΄μ±μ νΌν μ μλ€. κ·Έλ¬λ νλ‘μ νΈμ μμ‘΄μ±μ΄ λ€μν΄μ§κ³ νμ μμ‘΄μ±μ΄ μΆκ°λ¨μ λ°λΌ λ―Έλ¬λ§κΈ°λ²μ μ μ©νκΈ° μ΄λ €μμ§λ€.
λ€λ₯Έ λΌμ΄λΈλ¬λ¦¬μ νμ μ μΈμ λλΆλΆμ μΆμΆν΄μΌ νλ€λ©΄, μ°¨λΌλ¦¬ λͺ μμ μΌλ‘ @types μμ‘΄μ±μ μΆκ°νλ κ² λ«λ€.
νμ μ ν μ€νΈν λλ νΉν ν¨μ νμ μ λμΌμ±(equality)κ³Ό ν λΉ κ°λ₯μ± (assignability) μ μ°¨μ΄μ μ μκ³ μμ΄μΌ νλ€.
νμ μ μΈλ ν μ€νΈλ₯Ό κ±°μ³μΌ νλ€. κ·Έλ¬λ νμ μ μΈμ ν μ€νΈνκΈ°λ λ§€μ° μ΄λ ΅λ€.
κ·Έλμ νμ μ μΈμ λν ν μ€νΈμ½λλ₯Ό μμ±ν λ νμ μ€ν¬λ¦½νΈκ° μ 곡νλ λꡬλ₯Ό μ¬μ©νμ¬ λ¨μΈλ¬ΈμΌλ‘ λμ°κΈ° μμμ΄μ§λ§, μ΄λ° λ°©λ²μλ λͺ κ°μ§ λ¬Έμ κ° μλ€.
κΆκ·Ήμ μΌλ‘λ dtslint λλ νμ μμ€ν μΈλΆμμ νμ μ κ²μ¬νλ μ μ¬ν λꡬλ₯Ό μ¬μ©νλ κ²μ΄ λ μμ νκ³ κ°λ¨νλ€.
μ νΈλ¦¬ν° λΌμ΄λΈλ¬λ¦¬μμ μ 곡νλ map ν¨μμ νμ μ μΈμ μμ±νλ€κ³ κ°μ
declare function map<U, V>(array: U[], fn: (u: U) => V): V[]νμ μ μΈμ΄ μμν νμ μΌλ‘ κ²°κ³Όλ₯Ό λ΄λμ§ μ²΄ν¬ν μ μλ ν κ°μ§ λ°©λ²μ ν¨μλ₯Ό νΈμΆνλ ν μ€νΈ νμΌμ μμ±νλ κ²μ΄λ€. (ꡬν체λ₯Ό μν λ³λμ ν μ€νΈλ μλ€κ³ κ°μ )
map(['2017', '2018', '2019'], v => Number(v))μ΄ μ½λλ μ€λ₯ 체ν¬λ₯Ό μννμ§λ§ νμ μ΄ μ‘΄μ¬νλ€.
μλ₯Ό λ€μ΄ mapμ 첫 λ²μ§Έ λ§€κ°λ³μμ λ°°μ΄μ΄ μλ λ¨μΌ κ°μ΄ μμλ€λ©΄ λ§€κ°λ³μμ νμ μ λν μ€λ₯λ μ‘μ μ μλ€. κ·Έλ¬λ λ°νκ°μ λν 체ν¬κ° λλ½λμ΄ μκΈ° λλ¬Έμ μμ ν ν μ€νΈλΌκ³ ν μ μλ€.
μ½λ°±μ΄ μλ ν¨μλ₯Ό ν μ€νΈν λ, μ½λ°± λ§€κ°λ³μμ μΆλ‘ λ νμ μ 체ν¬ν΄μΌ νλ€. λν thisκ° APIμ μΌλΆλΆμ΄λΌλ©΄ μμ ν μ€νΈν΄μΌ νλ€.
λ°νκ°μ νΉμ νμ μ λ³μμ ν λΉνμ¬ κ°λ¨ν λ°ν νμ μ 체ν¬ν μ μλ λ°©λ²μ μμ보μ.
declare function map<U, V>(array: U[], fn: (u: U) => V): V[]
const lengths: number[] = map(['john', 'paul'], name => name.length)μ΄ μ½λλ μΌλ°μ μΌλ‘ λΆνμν νμ μ μΈμ ν΄λΉνλ€. κ·Έλ¬λ ν μ€νΈ μ½λ κ΄μ μμλ μ€μν μν μ νκ³ μλ€.
number[] νμ
μ μΈμ map ν¨μμ λ°ν νμ
μ΄ number[]μμ 보μ₯νλ€.
νμ κ΄λ ¨λ ν μ€νΈμμ anyλ₯Ό μ£Όμν΄μΌ νλ€. λ μ격ν ν μ€νΈλ₯Ό μν΄ dtslintκ°μ λꡬλ₯Ό μ¬μ©νλ κ²μ΄ μ’λ€.
declare module 'overbar';μ΄ μ μΈμ μ 체 λͺ¨λμ any νμ μ ν λΉνλ€. λ°λΌμ ν μ€νΈλ μ λΆ ν΅κ³Όνκ² μ§λ§, λͺ¨λ νμ μμ μ±μ ν¬κΈ°νκ² λλ€. λ λμ μ μ, ν΄λΉ λͺ¨λμ μνλ λͺ¨λ ν¨μμνΈμΆλ§λ€ μμμ μΌλ‘ any νμ μ λ°ννκΈ° λλ¬Έμ μ½λ μ λ°μ κ±Έμ³ νμ μμ μ±μ μ§μμ μΌλ‘ 무λλ¨λ¦¬κ² λλ€λ κ²μ΄λ€.
noImplicitAnyλ₯Ό μ€μ νλλΌλ νμ μ μΈμ ν΅ν΄ μ¬μ ν any νμ μ΄ μ겨λκ² λλ€. νμ μμ€ν λ΄μμ μμμ anyνμ μ λ°κ²¬ν΄ λ΄λ κ²μ λ§€μ° μ΄λ ΅λ€.
μ΄λ¬ν μ΄λ €μ λλ¬Έμ νμ 체컀μ λ 립μ μΌλ‘ λμνλ λꡬλ₯Ό μ¬μ©ν΄μ νμ μ μΈμ ν μ€νΈ νλ λ°©λ²μ΄ κΆμ₯λλ€.
DefinitelyTyped μ νμ μ μΈμ μν λꡬλ dtslint μ΄λ€. dtslint λ νΉλ³ν ννμ μ£Όμμ ν΅ν΄ λμνλ€.
declare function map<U, V>(array: U[], fn: (this: U[], u: U, i: number, array: U[]) => V): V[]
const beatles = ['john', 'paul', 'george', 'ringo']
map(
beatles,
function (
name, // $ExpectType string
i, // $ExpectType number
array, // $ExpectType string[]
) {
this // $ExpectType string[]
return name.length
},
) // $ExpectType number[]dtslintλ ν λΉ κ°λ₯μ±μ 체ν¬νλ λμ κ° μ¬λ²μ νμ μ μΆμΆνμ¬ κΈμ μμ²΄κ° κ°μμ§ λΉκ΅νλ€.
μΌλ°μ μΌλ‘ νμ μ€ν¬λ¦½νΈ μ½λμμ λͺ¨λ νμ μ 보λ₯Ό μ κ±°νλ©΄ μλ°μ€ν¬λ¦½νΈκ° λμ§λ§, μ΄κ±°ν, λ§€κ°λ³μ μμ±, νΈλ¦¬ν μ¬λμ μν¬νΈ, λ°μ½λ μ΄ν°λ νμ μ 보λ₯Ό μ κ±°νλ€κ³ μλ°μ€ν¬λ¦½νΈκ° λμ§λ μλλ€.
λ§μ μΈμ΄μμ λͺλͺ κ°μ λͺ¨μμ λνλ΄κΈ° μν΄ μ΄κ±°νμ μ¬μ©νλ€. νμ μ€ν¬λ¦½νΈμμλ μ΄κ±°νμ μ¬μ©ν μ μλ€.
enum Flavor {
VANILLA = 0,
CHOCOLATE = 1,
STRAWBERRY = 2,
}
let flavor = Flavor.CHOCOLATE // νμ
μ΄ Flavor
Flavor // μλμμ± μΆμ²: VANILLA, CHOCOLATE, STRAWBERRY
Flavor[0] // κ°μ΄ "VANILLA"κ·Έλ¬λ νμ μ€ν¬λ¦½νΈμ μ΄κ±°νμ λͺ κ°μ§ λ¬Έμ κ° μλ€. νμ μ€ν¬λ¦½νΈμ μ΄κ±°νμ λ€μ λͺ©λ‘μ²λΌ μν©μ λ°λΌ λμνλ€.
- μ«μ μ΄κ±°ν(μ μμ μ Flavor)μ 0, 1, 2 μΈμ λ€λ₯Έ μ«μκ° ν λΉλλ©΄ λ§€μ° μννλ€. ( μ΄ λ°©λ²μ μλ λΉνΈ νλκ·Έ ꡬ쑰λ₯Ό νννκΈ° μν΄ μ€κ³λμλ€. )
- μμ μ΄κ±°νμ 보ν΅μ μ΄κ±°νκ³Ό λ¬λ¦¬ λ°νμμ μμ ν μ κ±°λλ€. μμ μμ λ₯Ό const enum Flavorλ‘ λ°κΎΈλ©΄ μ»΄νμΌλ¬λ Flavor.CHOCOLATEμ 0μΌλ‘ λ°κΏλ²λ¦°λ€. μ΄λ° κ²°κ³Όλ κΈ°λνμ§ μμ κ²μ΄λ©°, λ¬Έμμ΄ μ΄κ±°νκ³Ό μ«μ μ΄κ±°νκ³Ό μ ν λ€λ₯Έ λμμ΄λ€.
- preserveConstEnums νλκ·Έλ₯Ό μ€μ ν μνμ μμ μ΄κ±°νμ 보ν΅μ μ΄κ±°νμ²λΌ λ°νμ μ½λμ μμ μ΄κ±°ν μ 보λ₯Ό μ μ§νλ€.
- λ¬Έμμ΄ μ΄κ±°νμ λ°νμμ νμ μμ μ±κ³Ό ν¬λͺ μ±μ μ 곡νλ€. κ·Έλ¬λ νμ μ€ν¬λ¦½νΈμ λ€λ₯Έ ꡬ쑰μ νμ΄νμ΄ μλ λͺ λͺ©μ νμ΄νμ μ¬μ©νλ€.
μΌλ°μ μΌλ‘ ν΄λμ€λ₯Ό μ΄κΈ°νν λ μμ±μ ν λΉνκΈ° μν΄ μμ±μμ λ§€κ°λ³μλ₯Ό μ¬μ©νλ€.
class Person {
name: string
constructor(name: string) {
this.name = name
}
}νμ μ€ν¬λ¦½νΈλ λ κ°κ²°ν λ¬Έλ²μ μ 곡νλ€.
class Person {
constructor(public name: string) {}
}μμ μ public name μ 'λ§€κ°λ³μ μμ±' μ΄λΌκ³ λΆλ¦¬λ©°,
λ©€λ² λ³μλ‘ nameμ μ μΈν μ΄μ μμ μ λμΌνκ² λμνλ€.
κ·Έλ¬λ λ§€κ°λ³μ μμ±κ³Ό κ΄λ ¨λ λͺ κ°μ§ λ¬Έμ μ μ΄ μ‘΄μ¬νλ€.
- μΌλ°μ μΌλ‘ νμ μ€ν¬λ¦½νΈ μ»΄νμΌμ νμ μ²΄μ»€κ° μ΄λ£¨μ΄μ§λ―λ‘ μ½λκ° μ€μ΄λ€μ§λ§, λ§€κ°λ³μ μμ±μ μ½λκ° λμ΄λλ λ¬Έλ²μ΄λ€.
- λ§€κ°λ³μ μμ±μ΄ λ°νμμλ μ€μ λ‘ μ¬μ©λμ§λ§, νμ μ€ν¬λ¦½νΈ κ΄μ μμλ μ¬μ©λμ§ μλ κ²μ²λΌ 보μΈλ€.
- λ§€κ°λ³μ μμ±κ³Ό μΌλ° μμ±μ μμ΄μ μ¬μ©νλ©΄ ν΄λμ€μ μ€κ³κ° νΌλμ€λ¬μμ§λ€.
λ§€κ°λ³μ μμ±μ μ¬μ©νλ κ²μ΄ μ’μμ§μ λν΄μλ μ°¬λ° λ Όλμ΄ μλ€. κΈμ΄μ΄λ λ§€κ°λ³μ μμ±μ μ νΈνμ§ μμ§λ§, μ΄λ€ μ΄λ€μ μ½λμμ΄ μ€μ΄ λ€μ΄μ μ’μνκΈ°λ νλ€.
Node.js : require μ module.exports μ μ¬μ© AMD : define ν¨μμ μ½λ°±μ μ¬μ© νμ μ€ν¬λ¦½νΈ : module ν€μλ μ 'νΈλ¦¬ν μ¬λμ' μν¬νΈλ₯Ό μ¬μ©
ECMAScript2015 κ° κ³΅μμ μΌλ‘ λͺ¨λμμ€ν μ λμ ν μ΄ν νμ μ€ν¬λ¦½νΈλ μΆ©λμ νΌνκΈ° μν΄ moduleκ³Ό κ°μ κΈ°λ₯μ νλ namespace ν€μλλ₯Ό μΆκ°νλ€.
namespace foo {
function bar() {}
}
/// <reference path="oter.ts"/>
foo.bar();νΈλ¦¬νμ¬λμμν¬νΈ μ module ν€μλλ νΈνμ±μ μν΄ λ¨μμμ λΏμ΄λ©°, μ΄μ λ ECMAScript2015 μ€νμΌμ λͺ¨λ(importμ export)μ μ¬μ©ν΄μΌ νλ€.
νμ μ€ν¬λ¦½νΈμ μν μ λͺ ννκ² νλ €λ©΄, μ΄κ±°ν, λ§€κ°λ³μ μμ±, νΈλ¦¬ν μ¬λμ μν¬νΈ, λ°μ½λ μ΄ν°λ μ¬μ©νμ§ μλ κ²μ΄ μ’λ€.
λ°μ½λ μ΄ν° λ μ²μμ μ΅κ·€λ¬ νλ μμν¬λ₯Ό μ§μνκΈ° μν΄ μΆκ°λμμΌλ©°
tscondig.jsonμ experimetalDecorators μμ±μ μ€μ νκ³ μ¬μ©ν΄μΌ νλ€.
μ΅κ·€λ¬λ₯Ό μ¬μ©νκ±°λ μ λν μ΄μ μ΄ νμν νλ μμν¬λ₯Ό μ¬μ©νκ³ μλκ² μλλΌλ©΄, λ°μ½λ μ΄ν°κ° νμ€μ΄ λκΈ° μ κΉμ§λ νμ μ€ν¬λ¦½νΈμμ λ°μ½λ μ΄ν°λ₯Ό μ¬μ©νμ§ μλκ² μ’λ€.
κ°μ²΄λ₯Ό μνν λ, ν€κ° μ΄λ€ νμ μΈμ§ μ νν νμ νκ³ μλ€λ©΄ let k: keyof μ for-in 루νλ₯Ό μ¬μ©νμ. ν¨μμ λ§€κ°λ³μλ‘ μ°μ΄λ κ°μ²΄μλ μΆκ°μ μΈ ν€κ° μ‘΄μ¬ν μ μλ€λ μ μ λͺ μ¬νμ.
μ΄ν΄λ₯Ό λκΈ° μν΄ μΈν°νμ΄μ€μ ν¨μκ° κ°λ―Έλ λ€λ₯Έ μμ λ₯Ό μ΄ν΄λ³΄μ.
interface ABC {
a: string
b: string
c: number
}
function foo(abc: ABC) {
for (const k in abc) {
// const k: string
const v = abc[k]
// ~~~~~~ Element implicitly has an 'any' type
// because type 'ABC' has no index signature }
}k μ λνμ¬ μ€λ₯κ° λ°μνλ€.
μ΄μ κ°μ μ€λ₯λ (let k: keyof ABC) κ°μ μ μΈμΌλ‘ μ€λ₯λ₯Ό μ κ±°ν μ μλ€.
κ°μ²΄λ₯Ό μννλ©° ν€μ κ°μ μ»λ μΌλ°μ μΈ λ°©λ²μ Object.entries λ₯Ό μ¬μ©νλ κ²μ΄λ€.
κ³¨μΉ μν νμ λ¬Έμ μμ΄, λ¨μ§ κ°μ²΄μ ν€μ κ°μ μννκ³ μΆλ€λ©΄ μ΄λ»κ² ν΄μΌ ν κΉ? Object.entries λ₯Ό μ¬μ©νλ©΄ λλ€.
interface ABC {
a: string
b: string
c: number
}
function foo(abc: ABC) {
for (const [k, v] of Object.entries(abc)) {
k // Type is string
v // Type is any
}
}μλ°μ€ν¬λ¦½νΈλ₯Ό μ¬μ©ν λλ μ κ²½μ°μ§ μμκ² μ§λ§, DOMμλ νμ κ³μΈ΅ κ΅¬μ‘°κ° μλ€. DOM νμ μ νμ μ€ν¬λ¦½νΈμμ μ€μν μ 보μ΄λ©°, λΈλΌμ°μ κ΄λ ¨ νλ‘μ νΈμμ νμ μ€ν¬λ¦½νΈλ₯Ό μ¬μ©ν λ μ μ©νλ€.
Node, Element, HTMLElement, EventTarget κ°μ μ°¨μ΄μ , Eventμ MouseEvent μ°¨μ΄μ μ μμμΌνλ€.
λ€μ HTML μ½λλ₯Ό 보μ.
<p id="quote">and <i>yet</i> it moves</p>λΈλΌμ°μ μμ μλ°μ€ν¬λ¦½νΈ μ½μμ μ΄κ³ p μ리먼νΈμ μ°Έμ‘°λ₯Ό μ»μ΄ 보면,
HTMLParagraphElement νμ
μ΄λΌλ κ²μ μ μ μλ€.
const p = document.getElementByTagName('p')[0];
p instanceof HTMLParagraphElement
// μ°Έ trueHTMLParagraphElement λ HTMLElementμ μλΈνμ
μ΄κ³
HTMLElementλ Elementμ μλΈ νμ
μ΄λ€.
λν Elementλ Nodeμ μλΈνμ
μ΄κ³
Nodeλ EventTargetμ μλΈ νμ
μ΄λ€.
κ³μΈ΅ ꡬ쑰μ λ°λ₯Έ νμ μ λͺ κ°μ§ μμ
| νμ | μμ |
|---|---|
| EventTarget | window, XMLHttpRequest |
| Node | document, Text, Comment |
| Element | HTMLElement, SVGElement ν¬ν¨ |
| HTMLElement |
<i>, <b>
|
| HTMLButtonElement | <button> |
DOM μ리먼νΈμ μ΄λ²€νΈμλ μΆ©λΆν ꡬ체μ μΈ νμ μ 보λ₯Ό μ¬μ©νκ±°λ, νμ μ€ν¬λ¦½νΈκ° μΆλ‘ ν μ μλλ‘ λ¬Έλ§₯ μ 보λ₯Ό νμ©ν΄μΌ νλ€.
보ν΅μ HTML νκ·Έ κ°μ ν΄λΉνλ 'button' κ°μ 리ν°λ΄ κ°μ μ¬μ©νμ¬ DOMμ λν μ νν νμ μ μ»μ μ μλ€. μλ₯Ό λ€λ©΄ λ€μκ³Ό κ°λ€.
document.getElementsByTagName('p')[0] // HTMLParagraphElement
document.createElement('button') // HTMLButtonElement
document.querySelector('div') // HTMLDivElementκ·Έλ¬λ νμ μ νν νμ μ μ»μ μ μλ κ²μ μλλ€. νΉν document.getElementByIdμμ λ¬Έμ κ° λ°μνκ² λλ€.
document.getElementById('my-div') // HTMLElementμΌλ°μ μΌλ‘ νμ λ¨μΈλ¬Έμ μ§μν΄μΌνμ§λ§ DOM κ΄λ ¨ν΄μλ νμ μ€ν¬λ¦½νΈλ³΄λ€ μ°λ¦¬κ° λ μ νν μκ³ μλ κ²½μ°μ΄λ―λ‘ λ¨μΈλ¬Έμ μ¬μ©ν΄λ μ’λ€.
#my-div κ° div νκ·ΈλΌλ κ²μ μκ³ μμΌλ―λ‘ λ¬Έμ κ° λμ§ μλλ€.
document.getElementById('my-div') as HTMLDivElementstritNullChecksκ° μ€μ λ μνλΌλ©΄, document.getElementByIdκ° nullμΈ κ²½μ°λ₯Ό 체ν¬ν΄μΌνλ€. μ€μ μ½λμμ document.getElementByIdκ° nullμΌ κ°λ₯μ±μ΄ μλ€λ©΄ if λΆκΈ°λ¬Έμ μΆκ°νλλ‘ νμ.
document.getElementById('my-div')!;EventTarget μ΄νμλ λ€μ μ€λ₯κ° λ°μνλ€. μ€λ₯μ μμΈμ μ΄ν΄λ³΄μ.
function handleDrag(eDown: Event) {
// ...
const dragStart = [eDown.clientX, eDown.clientY]
// ~~~~~~~ Property 'clientX' does not exist on 'Event'
// ~~~~~~~ Property 'clientY' does not exist on 'Event' // ...}νμμ μ΄ν΄λ΄€λ EventTarget νμ μ κ³μΈ΅ κ΅¬μ‘°λΏ μλλΌ, Event νμ μλ λ³λμ κ³μΈ΅ κ΅¬μ‘°κ° μλ€. Mozilla λ¬Έμμλ 52κ° μ΄μμ Event μ’ λ₯κ° λμ΄λμ΄ μλ€.
Eventλ κ°μ₯ μΆμνλ μ΄λ²€νΈμ΄λ€. λ ꡬ체μ μΈ νμ λ€μ λ€μκ³Ό κ°λ€.
- UIEvent : λͺ¨λ μ’ λ₯μ μ¬μ©μ μΈν°νμ΄μ€ μ΄λ²€νΈ
- MouseEvent : ν΄λ¦μ²λΌ λ§μ°μ€λ‘λΆν° λ°μλλ μ΄λ²€νΈ
- TouchEvent : λͺ¨λ°μΌ κΈ°κΈ°μ ν°μΉ μ΄λ²€νΈ
- WheelEvent : μ€ν¬λ‘€ ν μ λλ €μ λ°μλλ μ΄λ²€νΈ
- KeyboardEvent : ν€ λλ¦ μ΄λ²€νΈ
clientX, clientY μμ λ°μν μ€λ₯μ μμΈμ,
handleDrag ν¨μμ λ§€κ°λ³μλ Eventλ‘ μ μΈλ λ°λ©΄
clientX, clientY λ³΄λ€ κ΅¬μ²΄μ μΈ MouseEvent νμ
μ μκΈ° λλ¬Έμ΄λ€.
'mousedown' μ΄λ²€νΈ νΈλ€λ¬λ₯Ό μΈλΌμΈ ν¨μλ‘ λ§λ€λ©΄ νμ μ€ν¬λ¦½νΈλ λ λ§μ λ¬Έλ§₯ μ 보λ₯Ό μ¬μ©νκ² λκ³ , λλΆλΆμ μ€λ₯λ₯Ό μ κ±°ν μ μλ€.
λν λ§€κ°λ³μ νμ μ Event λμ MouseEvent λ‘ μ μΈν μ μλ€.
λ€μ μμ λ λ°©κΈ μΈκΈν μΈλΌμΈ ν¨μμ μ΄λ²€νΈ νμ λ³κ²½μ μ μ©ν΄μ μ€λ₯λ₯Ό μ κ±°ν μ½λμ΄λ€.
function addDragHandler(el: HTMLElement) {
el.addEventListener('mousedown', eDown => {
const dragStart = [eDown.clientX, eDown.clientY]
const handleUp = (eUp: MouseEvent) => {
el.classList.remove('dragging')
el.removeEventListener('mouseup', handleUp)
const dragEnd = [eUp.clientX, eUp.clientY]
console.log(
'dx, dy = ',
[0, 1].map(i => dragEnd[i] - dragStart[i]),
)
}
el.addEventListener('mouseup', handleUp)
})
}public, protected, private μ κ·Ό μ μ΄μλ νμ μμ€ν μμλ§ κ°μ λ λΏμ΄λ€. λ°νμμλ μμ©μ΄ μμΌλ©° λ¨μΈλ¬Έμ ν΅ν΄ μ°νν μ μλ€. μ κ·Ό μ μ΄μλ‘ λ°μ΄ν°λ₯Ό κ°μΆλ €κ³ ν΄μλ μλλ€.
μλ°μ€ν¬λ¦½νΈλ ν΄λμ€μ λΉκ³΅κ° μμ±μ λ§λ€ μ μλ€.
λ§μ μ΄κ° λΉκ³΅κ°μμ±μμ λνλ΄κΈ° μν΄ μΈλμ€μ½μ΄ _ λ₯Ό μ λμ¬λ‘ λΆμ΄λ κ²μ΄ κ΄λ‘λ‘ μΈμ λ λΏμ΄μλ€.
class Foo {
_private = 'secret123';
}κ·Έλ¬λ μμ±μ μΈλμ€μ½μ΄λ₯Ό λΆμ΄λ κ²μ λ¨μν λΉκ³΅κ°λΌκ³ νμν κ²λΏμ΄λ€. λ°λΌμ μΌλ°μ μΈ μμ±κ³Ό λμΌνκ² ν΄λμ€ μΈλΆλ‘ 곡κ°λμ΄ μλ€λ μ μ μ£Όμν΄μΌνλ€.
const f = new Foo();
f._private; // 'secret123'νμ μ€ν¬λ¦½νΈμλ public, protected, private μ κ·Ό μ μ΄μλ₯Ό μ¬μ©ν΄μ 곡κ°κ·μΉμ κ°μ νλ κ²μΌλ‘ μ€ν΄ν μ μλ€.
class Diary {
private secret = 'cheated on my English test'
}
const diary = new Diary()
diary.secret
// ~~~~~~ Property 'secret' is private and only
// accessible within class 'Diary'κ·Έλ¬λ public, protected, private κ°μ μ κ·Όμ μ΄μλ νμ μ€ν¬λ¦½νΈ ν€μλμ΄κΈ° λλ¬Έμ μ»΄νμΌ νμλ μ κ±°λλ€
νμ€ν λ°μ΄ν°λ₯Ό κ°μΆκ³ μΆλ€λ©΄ ν΄λ‘μ λ₯Ό μ¬μ©ν΄μΌνλ€.
declare function hash(text: string): number
class PasswordChecker_ {
checkPassword: (password: string) => boolean
constructor(passwordHash: number) {
this.checkPassword = (password: string) => {
return hash(password) === passwordHash
}
}
}
const checker = new PasswordChecker(hash('s3cret'))
checker.checkPassword('s3cret') // Returns trueμμ μ½λλ₯Ό μ΄ν΄λ³΄λ©΄ PasswordCheckerμ μμ±μ μΈλΆμμ passwordHash λ³μμ μ κ·Όν μ μκΈ° λλ¬Έμ μ 보λ₯Ό μ¨κΈ°λ λͺ©μ μ λ¬μ±νλ€.
class PasswordChecker {
#passwordHash: number;
constructor(passwordHash: number) {
this.#passwordHash = passwordHash;
}
checkPassword(password: string) {
return hash(password) === this.#passwordHash;
}
}
const checker = new PasswordChecker(hash('s3cret'));
checker.checkPassword('secret'); // false
checker.checkPassword('s3cret'); // trueνΉμ μ λμ¬ # μ λΆμ¬μ νμ
체ν¬μ λ°νμ λͺ¨λμμ λΉκ³΅κ°λ‘ λ§λλ μν μ νλ€.
λ§μ½ μ€κ³ κ΄μ μ μΊ‘μνκ° μλ '보μ'μ λν΄ κ±±μ νκ³ μλ€λ©΄, λ΄μ₯λ νλ‘ν νμ ν¨μμ λν λ³μ‘° κ°μ λ¬Έμ λ₯Ό μκ³ μμ΄μΌ νλ€.
μλ³Έ μ½λκ° μλ λ³νλ μλ°μ€ν¬λ¦½νΈ μ½λλ₯Ό λλ²κΉ νμ§ λ§μ. μμ€λ§΅μ μ¬μ©ν΄μ λ°νμμ νμ μ€ν¬λ¦½νΈ μ½λλ₯Ό λλ²κΉ νμ. λν, μμ€λ§΅μ΄ μ΅μ’ μ μΌλ‘ λ³νλ μ½λμ μμ ν λ§€νλμλμ§ νμΈνμ.
νμ μ€ν¬λ¦½νΈ μ½λλ₯Ό μ€ννλ€λ κ²μ, μλ°ν λ§νμλ©΄ νμ μ€ν¬λ¦½νΈ μ»΄νμΌλ¬κ° μμ±ν μλ°μ€ν¬λ¦½νΈ μ½λλ₯Ό μ€ννλ€λ κ²μ΄λ€.
μ¬μ€ μ»΄νμΌλ¬λΏ μλλΌ μμΆκΈ°(minifier)λ μ μ²λ¦¬κΈ°(preprocessor)μ²λΌ, κΈ°μ‘΄ μ½λλ₯Ό λ€λ₯Έ ννμ μ½λλ‘ λ³ννλ λꡬλ€μκ²λ λͺ¨λ ν΄λΉλλ€.
μ΄λ¬ν λ³νΈλ κ³Όμ λ€μ΄ ν¬λͺ νκ³ μ§κ΄μ μ΄λΌλ©΄ μ΄μμ μΌ κ²μ΄λ€. μλ°μ€ν¬λ¦½νΈ μ½λλ₯Ό μ΄ν΄λ³Ό νμ μμ΄ λ§μΉ νμ μ€ν¬λ¦½νΈ μ½λκ° μ§μ μ€νλλ κ²μ²λΌ λκ»΄μ§λ€λ©΄ λ§μ΄λ€.
νμ§λ§ νμ€μ κ·Έλ μ§ λͺ»νλ€.
λλ²κΉ μ΄ νμν μμ μ λΉλ‘μ νμ μ€ν¬λ¦½νΈκ° μ§μ μ€νλλ κ²μ΄ μλλΌλ μ¬μ€μ κΉ¨λ«κ² λ κ²μ΄λ€.
λλ²κ±°λ λ°νμμ λμνλ©°, νμ¬ λμνλ μ½λκ° μ΄λ€ κ³Όμ μ κ±°μ³μ λ§λ€μ΄μ§ κ²μΈμ§ μμ§ λͺ»νλ€. λλ²κΉ μ νλ©΄ 보κ²λλ μ½λλ μ μ²λ¦¬κΈ°, μ»΄νμΌλ¬, μμΆκΈ°λ₯Ό κ±°μΉ μλ°μ€ν¬λ¦½νΈ μ½λμΌ κ²μ΄λ€.
μ΄λ κ² λ³νλ μλ°μ€ν¬λ¦½νΈ μ½λλ 볡μ‘ν΄ λλ²κΉ νκΈ° λ§€μ° μ΄λ ΅λ€.
λλ²κΉ λ¬Έμ λ₯Ό ν΄κ²°νκΈ°μν΄ λΈλΌμ°μ μ μ‘°μ¬λ€μ μλ‘ νλ ₯νμ¬ μμ€λ§΅ μ΄λΌλ ν΄κ²°μ± μ λ΄λμλ€.
μμ€λ§΅μ λ³νλ μ½λμ μμΉμ μ¬λ²λ€μ μλ³Έ μ½λμ μλ μμΉμ μ¬λ²λ€λ‘ λ§€ννλ€. λλΆλΆμ λΈλΌμ°μ μ λ§μ IDEκ° μμ€λ§΅μ μ§μνλ€.
μ½λκ° λ³΅μ‘νκ² λ³νλλ€λ©΄ μμ€λ§΅μ΄ νμνλ€. νμ μ€ν¬λ¦½νΈκ° μμ€λ§΅μ μμ±ν μ μλλ‘ tsconfig.json μμ sourceMap μ΅μ μ μ€μ νλ©΄ ts νμΌμ λν΄μ .js .js.map λ κ°μ νμΌμ μμ±νλ€.
.js.map νμΌμ΄ λ°λ‘ μμ€λ§΅μ΄λ€.
μμ€λ§΅μ΄ .js νμΌκ³Ό κ°μ΄ μμΌλ©΄ λΈλΌμ°μ μμ λλ²κ±°μμ μλ‘μ΄ index.ts νμΌμ΄ λνλλ€. μ΄μ μνλ λλ‘ λΈλ μ΄ν¬ν¬μΈνΈλ₯Ό μ€μ ν μ μκ³ λ³μλ₯Ό μ‘°μ¬ν μ μλ€.
μμ€λ§΅μ μλ³Έ μ½λκ° κ·Έλλ‘ ν¬ν¨λλλ‘ μ€μ λμ΄ μμ μλ μλ€. 곡κ°λμ§ μλλ‘ μ€μ μ νμΈνλλ‘ νμ.
μμ€λ§΅μ λ€μκ³Ό κ°μ μ¬νλ€μ΄ μλ€.
- νμ μ€ν¬λ¦½νΈμ ν¨κ» λ²λ€λ¬λ μμΆκΈ°λ₯Ό μ¬μ©νκ³ μλ€λ©΄, λ²λ€λ¬λ μμΆκΈ°κ° κ°μμ μμ€λ§΅μ μμ±νκ² λλ€. μ΄μμ μΈ λλ²κΉ νκ²½μ΄ λλ €λ©΄ μμ±λ μλ°μ€ν¬λ¦½νΈκ° μλ μλ³Έ νμ μ€ν¬λ¦½νΈ μμ€λ‘ λ§€νλλλ‘ ν΄μΌνλ€. λ²λ€λ¬κ° κΈ°λ³Έμ μΌλ‘ νμ μ€ν¬λ¦½νΈλ₯Ό μ§μνλ€λ©΄ λ³λ μ€μ μμ΄ μ λμν΄μΌνλ€. κ·Έλ μ§ μλ€λ©΄ λ²λ€λ¬κ° μμ€λ§΅μ μΈμν μ μλλ‘ μΆκ°μ μΈ μ€μ μ΄ νμνλ€.
- μμ© νκ²½μ μμ€λ§΅μ΄ μ μΆλκ³ μλμ§ νμΈν΄μΌνλ€. λλ²κ±°λ₯Ό μ΄μ§ μλ μ΄μμ μμ€λ§΅μ΄ λ‘λλμ§ μμΌλ―λ‘ μ€μ μ¬μ©μμκ²λ μ±λ₯ μ νλ λ°μνμ§ μλλ€. κ·Έλ¬λ μμ€λ§΅μ μλ³Έ μ½λμ μΈλΌμΈ 볡μ¬λ³Έμ΄ ν¬ν¨λμ΄μλ€λ©΄ 곡κ°ν΄μλ μλ λ΄μ©μ΄ λ€μ΄μμ μ μλ€. μ μ§ μ£Όμμ΄λ λ΄λΆ λ²κ·Έ μΆμ μ μν URLμ 곡κ°ν νμκ° μλ€.
NodeJS νλ‘κ·Έλ¨μ λλ²κΉ μλ μμ€λ§΅μ μ¬μ©ν μ μλ€. λ³΄ν΅ νΈμ§κΈ°κ° μλ μΈμνκ±°λ NodeJS νλ‘μΈμ€λ₯Ό λΈλΌμ°μ λλ²κ±°μ μ°κ²°νλ©΄ λλ€. μμΈν λ΄μ©μ NodeJSλ¬Έμλ₯Ό μ°Έκ³ νλλ‘νμ.