# ๐ Item39 ~ 43
# Item39. any
๋ฅผ ๊ตฌ์ฒด์ ์ผ๋ก ๋ณํํด์ ์ฌ์ฉํ๊ธฐ
any
ํ์ ์ ๊ฐ์ ๊ทธ๋๋ก ์ ๊ท์์ด๋ ํจ์์ ๋ฃ๋ ๊ฒ์ ๊ถ์ฅํ์ง ์๋๋ค.
// bad!
function getLengthBad(array: any) {
return array.length;
}
// good!
function getLength(array: any[]) {
return array.length;
}
getLength
ํจ์์ ๊ฐ์ด ์์ฑํด์ผ ํ๋ ์ด์- ํจ์ ๋ด์
array.length
ํ์ ์ด ์ฒดํฌ๋จ - ํจ์์ ๋ฐํ ํ์
์ด
any
๋์number
๋ก ์ถ๋ก ๋จ - ํจ์ ํธ์ถ๋ ๋ ๋งค๊ฐ๋ณ์๊ฐ ๋ฐฐ์ด์ธ์ง ์ฒดํฌ๋จ
- ํจ์ ๋ด์
- ํจ์์ ๋งค๊ฐ๋ณ์ ๊ตฌ์ฒดํ ์์
function hasTwelveLetterKey(o: {[key: string]: any}) {
for (const key in o) {
if (key.length === 12) {
return true;
}
}
return false;
}
- ํจ์์ ํ์
์
any
์ ์ฉํ๋ ์์
type Fn0 = () => any; // ๋งค๊ฐ๋ณ์ ์์ด ํธ์ถ ๊ฐ๋ฅํ ๋ชจ๋ ํจ์
type Fn1 = (arg: any) => any; // ๋งค๊ฐ๋ณ์ 1๊ฐ
type Fn2 = (...args: any[]) => any; // ๋ชจ๋ ๊ฐ์์ ๋งค๊ฐ๋ณ์ ("Function" ํ์
๊ณผ ๋์ผ)
const numArgsBad = (...args: any) => args.length; // any๋ฅผ ๋ฐํ
const numArgsGood = (...args: any[]) => args.length; // number๋ฅผ ๋ฐํ
any
๋ฅผ ์ฌ์ฉํ ๋๋ ์ ๋ง๋ก ๋ชจ๋ ๊ฐ์ด ํ์ฉ๋์ด์ผ๋ง ํ๋์ง ๋ฉด๋ฐํ ๊ฒํ ํด์ผ ํ๋ค.any
๋ณด๋ค ๋ ์ ํํ๊ฒ ๋ชจ๋ธ๋งํ ์ ์๋๋กany[]
๋๋{[id: string]: any}
๋๋() => any
์ฒ๋ผ ๊ตฌ์ฒด์ ์ธ ํํ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
# Item40. ํจ์ ์์ผ๋ก ํ์ ๋จ์ธ๋ฌธ ๊ฐ์ถ๊ธฐ
- ํจ์์ ๋ชจ๋ ๋ถ๋ถ์ ์์ ํ ํ์
์ผ๋ก ๊ตฌํํ๋ ๊ฒ์ด ์ด์์ ์ด์ง๋ง, ๋ถํ์ํ ์์ธ ์ํฉ๊น์ง ๊ณ ๋ คํด ๊ฐ๋ฉฐ ํ์
์ ๋ณด๋ฅผ ํ๋ค๊ฒ ๊ตฌ์ฑํ ํ์๋ ์๋ค.
- ํจ์ ๋ด๋ถ์๋ ํ์ ๋จ์ธ์ ์ฌ์ฉํ๊ณ ํจ์ ์ธ๋ถ๋ก ๋๋ฌ๋๋ ํ์ ์ ์๋ฅผ ์ ํํ ๋ช ์ํ๋ ์ ๋๋ก ๋๋ด๋ ๊ฒ ์ข๋ค.
- ํ๋ก์ ํธ ์ ๋ฐ์ ์ํํ ํ์ ๋จ์ธ๋ฌธ์ด ๋๋ฌ๋ ์๋ ๊ฒ๋ณด๋ค, ์ ๋๋ก ํ์ ์ด ์ ์๋ ํจ์ ์์ผ๋ก ํ์ ๋จ์ธ๋ฌธ์ ๊ฐ์ถ๋ ๊ฒ์ด ๋ ์ข์ ์ค๊ณ์ด๋ค.
# (1) cacheLast
ํจ์ ์์
declare function cacheLast<T extends Function>(fn: T): T;
declare function shallowEqual(a: any, b: any): boolean;
function cacheLast<T extends Function)(fn: T): T {
let lastArgs: any[] | null = null;
let lastResult: any;
return function(...args: any[]) {
// ~~~~~~~~~~~~~~~~~~~~~
// '(...args: any[]) => any' ํ์์ 'T' ํ์์ ํ ๋นํ ์ ์์ต๋๋ค.
if (!lastArgs || !shallowEqual(lastArgs, args)) {
lastResult = fn(...args);
lastArgs = args;
}
return lastResult;
}
}
- ํ์
์คํฌ๋ฆฝํธ๋ ๋ฐํ๋ฌธ์ ์๋ ํจ์์ ์๋ณธ ํจ์์ ์๋ ํจ์
T
ํ์ ์ด ์ด๋ค ๊ด๋ จ์ด ์๋์ง ์์ง ๋ชปํ์ฌ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.- ๊ทธ๋ฌ๋ ๊ฒฐ๊ณผ์ ์ผ๋ก ์๋ณธ ํจ์
T
ํ์ ๊ณผ ๋์ผํ ๋งค๊ฐ๋ณ์๋ก ํธ์ถ๋๊ณ ๋ฐํ๊ฐ ์ญ์ ์์ํ ๊ฒฐ๊ณผ๊ฐ ๋๊ธฐ ๋๋ฌธ์, ํ์ ๋จ์ธ๋ฌธ์ ์ถ๊ฐํด์ ์ค๋ฅ๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ์ด ํฐ ๋ฌธ์ ๊ฐ ๋์ง๋ ์๋๋ค.
- ๊ทธ๋ฌ๋ ๊ฒฐ๊ณผ์ ์ผ๋ก ์๋ณธ ํจ์
function cacheLast<T extends Function)(fn: T): T {
let lastArgs: any[] | null = null;
let lastResult: any;
return function(...args: any[]) {
// ~~~~~~~~~~~~~~~~~~~~~
// '(...args: any[]) => any' ํ์์ 'T' ํ์์ ํ ๋นํ ์ ์์ต๋๋ค.
if (!lastArgs || !shallowEqual(lastArgs, args)) {
lastResult = fn(...args);
lastArgs = args;
}
return lastResult;
} as unknown as T;
}
# (2) ๊ฐ์ฒด ๋น๊ต shallowObjectEqual
ํจ์ ์์
declare function shallowObjectEqual<T extends object>(a: T, b: T): boolean;
declare function shallowEqual(a: any, b: any): boolean;
function shallowObjectEqual<T extends object>(a: T, b: T): boolean {
for (const [k, aVal] of Object.entries(a)) {
if (!(k in b) || aVal !== (b as any)[k]) {
return false;
}
}
return Object.keys(a).length === Object.keys(b).length;
}
k in b
๊ตฌ๋ฌธ์ผ๋ก ์ฒดํฌํ๊ธฐ ๋๋ฌธ์b as any
ํ์ ๋จ์ธ๋ฌธ์ ์์ ํ๋ค.- ๊ฐ์ฒด๊ฐ ๊ฐ์์ง ์ฒดํฌํ๊ธฐ ์ํด ๊ฐ์ฒด ์ํ์ ๋จ์ธ๋ฌธ์ด ์ฝ๋์ ์ง์ ๋ค์ด๊ฐ๋ ๊ฒ๋ณด๋ค, ์์ ์ฝ๋์ฒ๋ผ ๋ณ๋์ ํจ์๋ก ๋ถ๋ฆฌํด ๋ด๋ ๊ฒ์ด ํจ์ฌ ์ข์ ์ค๊ณ์ด๋ค.
# Item41. any
์ ์งํ๋ฅผ ์ดํดํ๊ธฐ
# ๐ ํ์ ์ ์งํ
- ๋ฐฐ์ด์ ๋ค์ํ ํ์ ์ ์์๋ฅผ ๋ฃ์ผ๋ฉด ๋ฐฐ์ด์ ํ์ ์ด ํ์ฅ๋๋ฉฐ ์งํํ๋ค.
function range(start: number, limit: number) {
const out = []; // ํ์
์ด any[]
for (let i = start; i < limit; i++) {
out.push(i); // out์ ํ์
์ด any[]
}
return out; // ํ์
์ด number[]
}
- ๋ํ ์กฐ๊ฑด๋ฌธ์์๋ ๋ถ๊ธฐ์ ๋ฐ๋ผ ํ์
์ด ๋ณํ ์๋ ์๋ค.
- ๋ง์ฝ
noImplicitAny
์ค์ ์ ๋ ๊ฒฝ์ฐ์๋ ์๋ ์ถ๋ก ๋๋ ํ์ ์ด ๋ชจ๋any
๋ก ์กํ๊ฒ ๋๋ค.
- ๋ง์ฝ
let val; // ํ์
์ด any
if (Math.random() < 0.5) {
val = /hello/;
val; // ํ์
์ด RegExp
} else {
val = 12;
val; // ํ์
์ด number
}
val; // ํ์
์ด number | RegExp
try/catch
๋ธ๋ก ์์์ ๋ณ์๋ฅผ ํ ๋นํ ๋ ๋ณ์์ ์ด๊น๊ฐ์ดnull
์ธ ๊ฒฝ์ฐ๋any
์ ์งํ๊ฐ ์ผ์ด๋๋ค.
let val = null; // ํ์
์ด any
try {
somethingDangerous();
val = 12;
val; // ํ์
์ด number
} catch (e) {
console.warn('alas!');
}
val; // ํ์
์ด number | null
โ๏ธ Check Point!
- ํ์ ์ ์งํ๋ ๊ฐ์ ํ ๋นํ๊ฑฐ๋ ๋ฐฐ์ด์ ์์๋ฅผ ๋ฃ์ ํ์๋ง ์ผ์ด๋๊ธฐ ๋๋ฌธ์, ํธ์ง๊ธฐ์์๋ ์ด์ํ๊ฒ ๋ณด์ผ ์ ์๋ค.
- ํ ๋น์ด ์ผ์ด๋ ์ค์ ํ์
์ ์กฐ์ฌํด ๋ด๋ ์ฌ์ ํ
any
๋๋any[]
๋ก ๋ณด์ผ ๊ฒ์ด๋ค.
- ์์์
any
ํ์ ์ ์ด๋ค ๊ฐ์ ํ ๋นํ ๋๋งany
ํ์ ์ ์งํ๊ฐ ์ผ์ด๋๋ค.- ๊ทธ๋ฆฌ๊ณ ์ด๋ค ๋ณ์๊ฐ ์์์
any
์ํ์ผ ๋ ๊ฐ์ ์ฝ์ผ๋ ค๊ณ ํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. - ๋ํ ํจ์ ํธ์ถ์ ๊ฑฐ์ณ๋ ์งํํ์ง ์๋๋ค.
- ๊ทธ๋ฆฌ๊ณ ์ด๋ค ๋ณ์๊ฐ ์์์
function makeSquares(start: number, limit: number) {
const out = []; // 'out' ๋ณ์๋ ์ผ๋ถ ์์น์์ ์์์ ์ผ๋ก 'any[]' ํ์์ด๋ค.
range(start, limit).forEach(i => {
out.push(i * i);
});
return out; // 'out' ๋ณ์์๋ ์์์ ์ผ๋ก 'any[]' ํ์์ด ํฌํจ๋๋ค.
}
- ์ ์ฝ๋์ ๊ฐ์ด ๋ฃจํ๋ก ์ํํ๋ ๋์ , ๋ฐฐ์ด์
map
,filter
๋ฉ์๋๋ฅผ ํตํด ๋จ์ผ ๊ตฌ๋ฌธ์ผ๋ก ๋ฐฐ์ด์ ์์ฑํ์ฌany
์ ์ฒด๋ฅผ ์งํ์ํค๋ ๋ฐฉ๋ฒ์ ์๊ฐํด๋ณผ ์ ์๋ค. - ํ์
์ ์์ ํ๊ฒ ์งํค๊ธฐ ์ํด์๋ ์์์
any
๋ฅผ ์งํ์ํค๋ ๋ฐฉ์๋ณด๋ค ๋ช ์์ ํ์ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ข์ ์ค๊ณ์ด๋ค.
# Item42. ๋ชจ๋ฅด๋ ํ์
์ ๊ฐ์๋ any
๋์ unknown
์ ์ฌ์ฉํ๊ธฐ
# (1) ํจ์์ ๋ฐํ๊ฐ๊ณผ ๊ด๋ จ๋ unknown
interface Book {
name: string;
author: string;
}
function parseYAML(yaml: string): any {
// ...
}
- ์
parseYAML
ํจ์ ์์์ฒ๋ผ ํจ์์ ๋ฐํ ํ์ ์ผ๋กany
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ข์ง ์๋ค.- ํจ์๋ฅผ ํธ์ถํ ๊ณณ์์ ๋ฐํ๊ฐ์ ์ํ๋ ํ์ ์ผ๋ก ํ ๋นํ๋ ๊ฒ์ด ์ด์์ ์ด๋ค.
const book: Book = parseYAML(`
name: Jane Eyre
author: Charlotte Bronte
`);
- ๊ทธ๋ฌ๋ ํจ์์ ๋ฐํ๊ฐ์์ ํ์
์ ์ธ์ ๊ฐ์ ํ ์ ์์ผ๋ฏ๋ก, ํธ์ถํ ๊ณณ์์ ํ์
์ ์ธ์ ์๋ตํ๊ฒ ๋๋ฉด
book
๋ณ์๋ ์์์ any
ํ์ ์ด ๋๋ค.
const book = parseYAML(`
name: Jane Eyre
author: Charlotte Bronte
`);
alert(book.title); // ์ค๋ฅ ์์, ๋ฐํ์์ "undefined" ๊ฒฝ๊ณ
book('read'); // ์ค๋ฅ ์์, ๋ฐํ์
์ "TypeError: book์ ํจ์๊ฐ ์๋๋๋ค" ์์ธ ๋ฐ์
- ๋์
parseYAML
์ดunknown
ํ์ ์ ๋ฐํํ๊ฒ ๋ง๋๋ ๊ฒ์ด ๋ ์์ ํ๋ค.
function safeParseYAML(yaml: string): unknown {
return parseYAML(yaml);
}
const book = safeParseYAML(`
name: Jane Eyre
author: Charlotte Bronte
`);
alert(book.title); // ~~~ ๊ฐ์ฒด๊ฐ 'unknown' ํ์์
๋๋ค.
book('read'); // ~~~ ๊ฐ์ฒด๊ฐ 'unknown' ํ์์
๋๋ค.
- ํ์
์ฒด์ปค๋ ์งํฉ ๊ธฐ๋ฐ์ด๊ธฐ ๋๋ฌธ์
any
๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ ์ฒด์ปค๊ฐ ๋ฌด์ฉ์ง๋ฌผ์ด ๋๋ค๋ ๊ฒ์ ์ฃผ์ํด์ผ ํ๋ค. unknown
ํ์ ์ ์ด๋ ํ ํ์ ์ด๋unknown
์ ํ ๋น ๊ฐ๋ฅํ์ง๋งunknown
ํ์ ์ ์ค์งunknown
๊ณผany
์๋ง ํ ๋น ๊ฐ๋ฅํ๋ค.- ๋ฐ๋ฉด
never
ํ์ ์unknown
ํ์ ๊ณผ ์ ๋ฐ๋์ด๋ค. ์ด๋ค ํ์ ๋never
์ ํ ๋นํ ์ ์์ง๋ง, ์ด๋ ํ ํ์ ์ผ๋ก๋ ํ ๋น ๊ฐ๋ฅํ ์ ์๋ค.
- ๋ฐ๋ฉด
- ํํธ
unknown
์ํ๋ก ์ฌ์ฉํ๋ ค๊ณ ํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ์ฌ ์ ์ ํ ํ์ ์ผ๋ก ๋ณํํ๋๋ก ๊ฐ์ ํ ์ ์๋ฐ.- ํจ์์ ๋ฐํ ํ์
์ธ
unknown
๊ทธ๋๋ก ๊ฐ์ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก ํ์ ๋จ์ธ์ ํด์ผ ํ๋ค.
- ํจ์์ ๋ฐํ ํ์
์ธ
const book = safeParseYAML(`
name: Jane Eyre
author: Charlotte Bronte
`) as Book;
# (2) ๋ณ์ ์ ์ธ๊ณผ ๊ด๋ จ๋ unknown
- ์ด๋ ํ ๊ฐ์ด ์์ง๋ง ๊ทธ ํ์
์ ๋ชจ๋ฅด๋ ๊ฒฝ์ฐ์
unknown
์ ์ฌ์ฉํ๋ค. - ํ์
๋จ์ธ๋ฌธ์ด
unknown
์์ ์ํ๋ ํ์ ์ผ๋ก ๋ณํํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ์๋๋ค.instanceof
๋ฅผ ์ฒดํฌํ ํunknown
์์ ์ํ๋ ํ์ ์ผ๋ก ๋ณํํ ์ ์๋ค.
function processValue(val: unknown) {
if (val instanceof Date) {
val; // ํ์
์ด Date
}
}
- ๋ํ ์ฌ์ฉ์ ์ ์ ํ์
๊ฐ๋๋
unknown
์์ ์ํ๋ ํ์ ์ผ๋ก ๋ณํํ ์ ์๋ค.
function isBook(val: unknown): val is Book {
return (
typeof(val) === 'object' && val !== null && 'name' in val && 'author' in val
);
}
function processValue(val: unknown) {
if (isBook(val)) {
val; // ํ์
์ด Book
}
}
- ๋๋ ์๋์ ๊ฐ์ด ์ ๋ค๋ฆญ์ ์ฌ์ฉํ ์๋ ์์ง๋ง ํ์
์คํฌ๋ฆฝํธ์์๋ ์ข์ ์คํ์ผ์ด ์๋๋ค.
- ํ์ ๋จ์ธ๋ฌธ๊ณผ ๋ฌ๋ผ ๋ณด์ด์ง๋ง ๊ธฐ๋ฅ์ ์ผ๋ก๋ ๋์ผํ๋ค.
- ์ ๋ค๋ฆญ๋ณด๋ค๋
unknown
์ ๋ฐํํ๊ณ ์ฌ์ฉ์๊ฐ ์ง์ ๋จ์ธ๋ฌธ์ ์ฌ์ฉํ๊ฑฐ๋ ์ํ๋ ๋๋ก ํ์ ์ ์ขํ๋๋ก ๊ฐ์ ํ๋ ๊ฒ์ด ์ข๋ค.
function safeParseYAML<T>(yaml: string): T {
return parseYAML(yaml);
}
# (3) ๋จ์ธ๋ฌธ๊ณผ ๊ด๋ จ๋ unknown
declare const foo: Foo;
let barAny = foo as any as Bar; // Bad!
let barUnk = foo as unknown as Bar; // Recommend!
barAny
,barUnk
๋ชจ๋ ๊ธฐ๋ฅ์ ์ผ๋ก ๋์ผํ์ง๋ง,unknown
ํํ๊ฐ ๋ ์์ ํ๋ค.any
์ ๊ฒฝ์ฐ๋ ๋ถ๋ฆฌ๋๋ ์๊ฐ ๊ทธ ์ํฅ๋ ฅ์ด ์ ์ผ๋ณ์ผ๋ก ํผ์ง์ง๋งunknown
์ ๊ฒฝ์ฐ๋ ๋ถ๋ฆฌ๋๋ ์ฆ์ ์ค๋ฅ๋ฅผ ๋ฐ์ํ๊ฒ ๋๋ฏ๋ก ๋ ์์ ํ๋ค.
# (4) ์กฐ๊ธ ๋ค๋ฅธ ํํ์ unknown
object
๋๋{}
๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ ์ญ์unknown
๋งํผ ๋ฒ์๊ฐ ๋์ ํ์ ์ด์ง๋ง,unknown
๋ณด๋ค๋ ๋ฒ์๊ฐ ์ฝ๊ฐ ์ข๋ค.{}
ํ์ ์null
๊ณผundefined
๋ฅผ ์ ์ธํ ๋ชจ๋ ๊ฐ์ ํฌํจํ๋ค.object
ํ์ ์ ๋ชจ๋ ๋น๊ธฐ๋ณธํ(non-primitive) ํ์ ์ผ๋ก ์ด๋ฃจ์ด์ง๋ค. ์ฌ๊ธฐ์๋true
๋๋12
๋๋"foo"
๊ฐ ํฌํจ๋์ง ์์ง๋ง ๊ฐ์ฒด์ ๋ฐฐ์ด์ ํฌํจ๋๋ค.
unknown
ํ์ ์ด ๋์ ๋๊ธฐ ์ ์๋{}
๊ฐ ๋ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋์์ง๋ง, ์ต๊ทผ์๋{}
๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๊ฝค ๋๋ฌผ๋ค.- ์ ๋ง๋ก
null
,undefined
๊ฐ ๋ถ๊ฐ๋ฅํ๋ค๊ณ ํ๋จ๋๋ ๊ฒฝ์ฐ๋งunknown
๋์{}
๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
- ์ ๋ง๋ก
# Item43. ๋ชฝํค ํจ์น๋ณด๋ค๋ ์์ ํ ํ์ ์ ์ฌ์ฉํ๊ธฐ
- ๊ฐ์ฒด์ ์์์ ์์ฑ์ ์ถ๊ฐํ๋ ๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ์ข์ ์ค๊ณ๊ฐ ์๋๋ค.
- ์๋ฅผ ๋ค์ด
window
๋๋ DOM ๋ ธ๋์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๋ค๊ณ ๊ฐ์ ํด๋ณด์. - ๊ทธ๋ฌ๋ฉด ๊ทธ ๋ฐ์ดํฐ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ญ ๋ณ์๊ฐ ๋๋ค.
- ์ ์ญ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ฉด ์์ฐ์ค์ ํ๋ก๊ทธ๋จ ๋ด์์ ์๋ก ๋ฉ๋ฆฌ ๋จ์ด์ง ๋ถ๋ถ๋ค ๊ฐ์ ์์กด์ฑ์ ๋ง๋ค๊ฒ ๋๋ค.
- ๊ทธ๋ฌ๋ฉด ํจ์๋ฅผ ํธ์ถํ ๋๋ง๋ค ์ฌ์ด๋ ์ดํํธ๋ฅผ ๊ณ ๋ คํด์ผ๋ง ํ๋ค.
- ์๋ฅผ ๋ค์ด
- ํ์ ์คํฌ๋ฆฝํธ ํ๊ฒฝ์์๋ ๋ ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ์๊ธด๋ค.
document.monkey = 'Tamarin'; // ~~~ 'Document' ์ ํ์ 'monkey' ์์ฑ์ด ์์ต๋๋ค.
- ์์ ๊ฐ์ ์ค๋ฅ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด
document
์any
ํ์ ์ ๋จ์ธํด์ค ์ ์๋ค.- ํ์ง๋ง ํ์ ์ฒด์ปค๋ ํต๊ณผํ์ง๋ง ํ์ ์์ ์ฑ์ ์์คํ๊ณ , ์ธ์ด ์๋น์ค๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค.
- ์ต์ ์ ํด๊ฒฐ์ฑ
์
document
๋๋ DOM์ผ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฆฌํ๋ ๊ฒ์ด๋ค.- ๋ง์ผ ๋ถ๋ฆฌํ ์ ์๋ค๋ฉด ๋ ๊ฐ์ง ์ฐจ์ ์ฑ ์ด ์กด์ฌํ๋ค.
# ๐ interface
์ ๋ณด๊ฐ(augmentation) ์ฌ์ฉ
interface Document {
/** ๋ชฝํค ํจ์น์ ์(genus) ๋๋ ์ข
(species) */
monkey: string;
}
document.monkey = 'Tamarin'; // ์ ์
any
๋ณด๋ค ๋ณด๊ฐ์ ์ฌ์ฉํ ๋ฐฉ๋ฒ์ด ๋ ์ข์ ์ - ํ์ ์ด ๋ ์์ ํ๋ค. ํ์ ์ฒด์ปค๋ ์คํ๋ ์๋ชป๋ ํ์ ์ ํ ๋น์ ์ค๋ฅ๋ก ํ์ํ๋ค.
- ์์ฑ์ ์ฃผ์์ ๋ถ์ผ ์ ์๋ค.
- ์์ฑ์ ์๋์์ฑ์ ์ฌ์ฉํ ์ ์๋ค.
- ๋ชฝํค ํจ์น๊ฐ ์ด๋ ๋ถ๋ถ์ ์ ์ฉ๋์๋์ง ์ ํํ ๊ธฐ๋ก์ด ๋จ๋๋ค.
- ๊ทธ๋ฌ๋ ๋ชจ๋ ๊ด์ ์์(ํ์
์คํฌ๋ฆฝํธ ํ์ผ์ด
import/export
๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ), ์ ๋๋ก ๋์ํ๊ฒ ํ๋ ค๋ฉดglobal
์ ์ธ์ ์ถ๊ฐํด์ผ ํ๋ค.
export {};
declare global {
interface Document {
/** ๋ชฝํค ํจ์น์ ์(genus) ๋๋ ์ข
(species) */
monkey: string;
}
}
document.monkey = 'Tamarin'; // ์ ์
- ์ฃผ์ ์ฌํญ
- ๋ณด๊ฐ์ ์ ์ญ์ ์ผ๋ก ์ฌ์ฉ๋๋ฏ๋ก ์ฝ๋์ ๋ค๋ฅธ ๋ถ๋ถ์ด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก๋ถํฐ ๋ถ๋ฆฌํ ์ ์๋ค.
- ์ ํ๋ฆฌ์ผ์ด์
์ด ์คํ๋๋ ๋์ ์์ฑ์ ํ ๋นํ๋ฉด ์คํ ์์ ์์ ๋ณด๊ฐ์ ์ ์ฉํ ๋ฐฉ๋ฒ์ด ์๋ค.
- ex) ์น ํ์ด์ง ๋ด์ HTML Element ์กฐ์์ ์์ฑ์
string | undefined
์ ๊ฐ์ด ์ ์ธํ ์ ์์ด ๋ ์ ํํ ์ ์์ง๋ง ๋ค๋ฃจ๊ธฐ์๋ ๋ ๋ถํธํด์ง๋ค.
- ex) ์น ํ์ด์ง ๋ด์ HTML Element ์กฐ์์ ์์ฑ์
# ๐ ๋ ๊ตฌ์ฒด์ ์ธ ํ์ ๋จ์ธ๋ฌธ ์ฌ์ฉ
interface MonkeyDocument extends Document {
/** ๋ชฝํค ํจ์น์ ์(genus) ๋๋ ์ข
(species) */
monkey: string;
}
(document as MonkeyDocument).monkey = 'Tamarin'; // ์ ์
MonkeyDocument
๋Document
๋ฅผ ํ์ฅํ๋ฏ๋ก ํ์ ๋จ์ธ๋ฌธ์ ์ ์์ด๋ฉฐ ํ ๋น๋ฌธ์ ํ์ ์ ์์ ํ๋ค.- ๋ํ
Document
ํ์ ์ ๊ฑด๋๋ฆฌ์ง ์๊ณ ๋ณ๋๋ก ํ์ฅํ๋ ์๋ก์ด ํ์ ์ ๋์ ํ๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ์์ญ ๋ฌธ์ ๋ ํด๊ฒฐํ ์ ์๋ค.(import ํ๋ ๊ณณ์ ์์ญ์๋ง ํด๋น)
- ๋ํ
- ๋ฐ๋ผ์ ๋ชฝํค ํจ์น๋ ์์ฑ์ ์ฐธ์กฐํ๋ ๊ฒฝ์ฐ์๋ง ๋จ์ธ๋ฌธ์ ์ฌ์ํ๊ฑฐ๋ ์๋ก์ด ๋ณ์๋ฅผ ๋์
ํ๋ฉด ๋๋ค.
- ๊ทธ๋ฌ๋ ๋ชฝํค ํจ์น๋ฅผ ๋จ์ฉํด์๋ ์ ๋๋ฉฐ ๊ถ๊ทน์ ์ผ๋ก ๋ ์ ์ค๊ณ๋ ๊ตฌ์กฐ๋ก ๋ฆฌํฉํ ๋งํ๋ ๊ฒ์ด ์ข๋ค.