๐๏ธ 06. ์ ์ธ ํ์ผ๊ณผ ์ค์ : ๋ ๊ฑฐ์ JS๋ฅผ ์ฐ์ํ๊ฒ ํ์ด๋ผ
๐ ๊ฐ์
tsconfig.json์ ๋ผ๋์ .d.ts๋ฅผ ํ์ฉํ ์ ์ญ ์ค์ฝํ ํ์ ํ์ฅ ๊ธฐ๋ฒ
๐ ์ด ๋ฌธ์๋ฅผ ์ฝ๊ธฐ ์ ์
โฑ๏ธ ์์ ์ฝ๊ธฐ ์๊ฐ: 10๋ถ(์ ์ฒด) / ํต์ฌ ํํธ๋ง: 6๋ถ
๐บ๏ธ ์ด ๋ฌธ์์ ํ๋ฆ
[tsconfig.json์ ๋ ๊ฐ์ง ํต์ฌ ์ถ] โ [.d.ts์ ์กด์ฌ ์ด์ ] โ [๊ธ๋ก๋ฒ ๊ณต๊ฐ ์นจํฌํ๊ธฐ(declare global)]
๐ฏ ์ด ๋ฌธ์๋ฅผ ๋ค ์ฝ์ผ๋ฉด ํ ์ ์๋ ๊ฒ
-
strict๋ชจ๋์ ์ง์ ํ ์๋ฏธ๋ฅผ ์ดํดํ๊ณ ํ๋ก์ ํธ ์ค์ ์ ์ด์ ๋ฅผ ์ค๋ช ํ ์ ์๋ค. - ํ๊ฒ(Target)๊ณผ ๋ชจ๋(Module) ์ค์ ์ด ์ ํ๋ก ํธ์๋ ํ๊ฒฝ์์ ๋๋ ์ง๋์ง ์ดํดํ๋ค.
- ํ์ ์ง์์ด ์๋ ์ฌ๋ด ๊ตฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์๋์ฐ(Window) ๊ฐ์ฒด๋ฅผ ์์ ์์ฌ๋ก ํ์ ํ์ฅํ ์ ์๋ค.
๐บ๏ธ ์ด ๋ฌธ์์ ๋ฐฐ๊ฒฝ ์ธ๊ณ๊ด: '์์๋ค ์ปค๋ฎค๋ํฐ'
- ๐ฃ ์์ฒ ( ํ๋ก์ ํธ ๊ฒฝ๊ณ๋ฅผ ์ ๋ฆฌํ๋ ์ค ): "๋ฆฌ๋ ๋! ํ์ฌ์ ์์ ๋ถํฐ ๋ด๋ ค์ค๋ jQuery ๊ธฐ๋ฐ ์ ๋๋ฉ์ด์
์คํฌ๋ฆฝํธ(
youngsoo-magic.js)๋ฅผ ๊ฐ์ ธ๋ค ์ฐ๋ ค๋๋ฐ,importํ์๋ง์ VScode๊ฐCould not find a declaration file for module์๋ฌ๋ฅผ ๋ณด์ฌ์ค๋๋ค. ํ์ ์ด ์๋ ์ฝ๋๋ ํ๋ก์ ํธ์ ์์ ํ๊ฒ ๋ค์ฌ์ฌ ๋ฐฉ๋ฒ์ด ์์๊น์?" - ๐ฆ ์ํธ ( ๋ฆฌ๋ ): "์์ฒ ๋, ํ์
์คํฌ๋ฆฝํธ๋ importํ ๋ชจ๋์ ํ์
์ ์ธ์ ์ฐพ์์ผ ์์ ํ๊ฒ ๊ฒ์ฌํ ์ ์์ด์. ํ์
์ด ์๋ JS ํ์ผ์ด๋ผ๋ ์ฐ๋ฆฌ๊ฐ
.d.ts๋ก ์ต์ ๊ณ์ฝ์ ์ ์ด์ค ์ ์์ฃ . ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ ์ธ์ ์ด๋๊น์ง ํฌํจํ ์ง ์ ํ๋ ๊ธฐ์คํ๊ฐtsconfig.json์ ๋๋ค. ์ค๋ ๊ทธ ๋ ๊ฐ์ง ํต์ ๊ถ์ ์ฅ์ด๋ณด์ฃ ."
๐ค ์ ์์์ผ ํ๋๊ฐ: '์ค์ '์ ๋๋ ค์ํ์ง ๋ง๋ผ
๋ณดํต ์ฃผ๋์ด ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๋ค์ npx create-next-app์ด๋ vite๊ฐ ๋ง๋ค์ด ์ฃผ๋ tsconfig.json์ ๋จ ํ ๋ฒ๋ ์ด์ด๋ณด์ง ์๊ณ ์ด์ด ํผํด ๋ค๋๋๋ค. ๋ฌด์ธ๊ฐ ๊ฑด๋๋ฆฌ๋ฉด ํฐ์ผ ๋ ๊ฒ ๊ฐ๊ธฐ ๋๋ฌธ์ด์ฃ .
ํ์ง๋ง ํ๋ก์ ํธ๋ฅผ ์งํํ๋ค ๋ณด๋ฉด ํ์ฐ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ์๊ธฐ์ ๋ด์ฐฉํฉ๋๋ค.
- "์คํ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊น์๋๋ฐ ํ์
์ ์๊ฐ ์๋..." (
npm i @types/xxx๋ ์ ํตํจ) - "์ธ๋ผ์ธ ์คํฌ๋ฆฝํธ๋ก ๋ฃ์ด๋ ๊ตฌ๊ธ ์ ๋๋ฆฌํฑ์ค ์ ์ญ ๊ฐ์ฒด
window.ga๋ฅผ ์ฐ๊ณ ์ถ์๋ฐ TS๊ฐ ํ๋ด..."
์ด๋ ์ค์ ๊ณผ ์ ์ธ ํ์ผ์ ๊ฐ๋
์ ๋ชจ๋ฅด๋ฉด, // @ts-ignore ๋ as any๋ก ํธ์ถ๋ถ๋ง๋ค ํ์
๊ฒ์ฌ๋ฅผ ๊บผ๋ฒ๋ฆฌ๊ธฐ ์ฝ์ต๋๋ค. 5๋
์ฐจ์ ์ํคํ
์ฒ๋ ์ด๋ฐ ์์ธ๋ฅผ ์จ๊ธฐ๋ ๋์ , ํ์
์ด ์๋ ๊ฒฝ๊ณ์ ํ์ด ๊ณต์ ํ ๊ณ์ฝ์ ๋ถ์ด๋ ๊ฒ์์ ์์ํฉ๋๋ค.
โ๏ธ 1. tsconfig.json์ ๋ผ๋ ์ดํดํ๊ธฐ
tsconfig.json ์ต์
์ ์์ญ ๊ฐ๊ฐ ๋์ง๋ง, ํ์
์์ ์ฐ๋ฆฌ๊ฐ ์ปจํธ๋กคํด์ผ ํ ํต์ฌ ์ถ์ ํฌ๊ฒ ๋ ๊ฐ์ง์
๋๋ค.
์ถ A: ์ปดํ์ผ ํ๋ฆฌํฐ (์๊ฒฉํจ์ ์ ๋)
{
"compilerOptions": {
"strict": true, // ์ ๊ท ํ๋ก์ ํธ๋ผ๋ฉด ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ผ๊ณ ์์ํ๊ธฐ
"noImplicitAny": true, // "๊ท์ฐฎ์์ any๋ก ๋๋ ๊ฑฐ ๋ค ์ก์๋ผ ๊ฑฐ์ผ!"
"strictNullChecks": true // "null ์ด๋ undefined๊ฐ ๋ค์ด์ฌ ์ ์๋ ๊ฐ๋ฅ์ฑ ์ ๋ถ ์ฐจ๋จํด!"
}
}๐ฆ ์ํธ์ ๋ฆฌ๋ทฐ ์ฝ๋ฉํธ: "
strict: true๋ ์ ์ต์ ๋ค์ ๋ค ์ผ์ฃผ๋ ์ค์์น์ ๋๋ค. ๊ตฌํ JS ํ๋ก์ ํธ๋ฅผ ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ํน์ํ ์ํฉ์ด ์๋๋ผ๋ฉด ์ผ๊ณ ์์ํ๋ ํธ์ด ์์ ํฉ๋๋ค. ๋์จํ ์ค์ ์ ๋น์ฅ์ ํธํ์ง๋ง, ๋ฐํ์์์ ํ์ธํด์ผ ํ ์ผ์ด ๋์ด๋ฉ๋๋ค."
์ถ B: ํ๊ฒ๊ณผ ํ๊ฒฝ ์ค์ (์ด๋์ ๋๋ฆด ๊ฒ์ธ๊ฐ)
์ด ๋ถ๋ถ์ด ๋ง์ ์ฌ๋๋ค์ ํท๊ฐ๋ฆฌ๊ฒ ํฉ๋๋ค.
{
"compilerOptions": {
// 1. ๋ด๊ฐ ๋ณํํ ์ต์ข
JS ๋ฌธ๋ฒ ์์ค
"target": "ES6",
// 2. ๋ชจ๋ ์์คํ
์ ๋ญ ์ธ ๊ฑด๊ฐ? (CommonJS vs ESNext)
"module": "ESNext",
// 3. ๋ธ๋ผ์ฐ์ ์์ ๋๋ฆด ๊ฑฐ์ผ? ๋
ธ๋์์ ๋๋ฆด ๊ฑฐ์ผ? (์ฌ์ฉ ๊ฐ๋ฅํ ๋ด์ฅ ๊ฐ์ฒด๋ค)
"lib": ["DOM", "DOM.Iterable", "ESNext"],
// ๋ฒ๋ค๋ฌ(Webpack, Webpack, Vite, Next.js ๋ฑ)๋ฅผ ์ธ ๋ ํ์ ์ต์
"moduleResolution": "bundler",
}
}ํ๋ก ํธ์๋(React, Next.js)์์๋ ์ฌ์ค์ TS ์ปดํ์ผ๋ฌ(tsc)๊ฐ ์ค์ ๋ก JS๋ฅผ ๋ณํํ์ฌ ๋จ๊ตฌ๋(emit) ์ญํ ์ ํ์ง ์์ต๋๋ค. ๋ณํ์ Babel์ด๋ SWC, ์์ค๋น๋(esbuild)๊ฐ ํจ์ฌ ๋นจ๋ฆฌ ํด์น์๋๋ค.
๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ tsconfig.json์ "VScode์ ๋นจ๊ฐ ์ค ๊ฒ์ฌ๊ธฐ ๊ธฐ์คํ" ์ ๋๋ก ์๊ฐํ๋ฉด ๋ง์ด ํธํฉ๋๋ค.
๐ 2. .d.ts ์ ์ธ ํ์ผ: ํ์
์ ์ฉ ์ฌ๊ถ ๋ฐ๊ธ์
์์ฒ ์ด์ ๋๋ ๋ง๋ก ๋์๊ฐ ๋ด
์๋ค. ๊ตฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ์
์ด ์์ต๋๋ค.
ํ์
์คํฌ๋ฆฝํธ๋ ์ํฌํธ๋๋ ๋ชจ๋์ ๋ณผ ๋ ํญ์ ๊ทธ ์์ ์ง๊ฟ์ธ .d.ts (Declaration) ํ์ผ์ด ์๋์ง๋ฅผ ์ฐพ์ต๋๋ค.
.d.ts ํ์ผ์๋ ์ค์ ๋์ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋(๋ก์ง)๊ฐ ๋จ ํ ์ค๋ ๋ค์ด๊ฐ ์ ์์ต๋๋ค. ์ค๋ก์ง "์ฌ๊ธฐ ์ด๋ฐ ํจ์๋ ํด๋์ค๊ฐ ์์ด~" ํ๊ณ ๊ป๋ฐ๊ธฐ๋ง ์ ์ธ(Declare)ํด ์ฃผ๋ ํ์ผ์
๋๋ค.
์์ฒ ์ด์ ๋ง์ ๊ฐ์ ํ์ผ: youngsoo-magic.d.ts
ํ๋ก์ ํธ ์ต์๋จ types ํด๋(๋ณดํต tsconfig.json์ include์ ๋ฑ๋ก๋จ)์ ๋น ํ์ผ์ ๋ง๋ค๊ณ ์๋์ฒ๋ผ ์จ์ฃผ๋ฉด ์ด๋ฆฌ๋ฅ์ ํ๋ TS๊ฐ ๊ฐ์๊ธฐ ์์ ํด์ง๋๋ค.
// types/youngsoo-magic.d.ts
// ๐ฆ ์ํธ: "์ผ๋จ ๊ธํ๋๊น ์ ๋ชจ๋์ด ์กด์ฌํ๋ค๋ ๊ฒ๋ง TSํํ
์ ๊ณ ํฉ์๋ค."
declare module 'youngsoo-magic' {
// ๋ชจ๋ ๋ด๋ถ์ ํจ์๋ ๊ฐ์ฒด ๋ผ๋๋ฅผ ์ฌ๊ธฐ์ ๋์ถฉ์ด๋ผ๋ ๋ฌ์ฌํด์ค๋ค.
export function doMagic(target: string): void;
export const version: string;
}์ด์ import { doMagic } from 'youngsoo-magic' ์ ์จ๋ ์๋ฌด ์๋ฌ๊ฐ ๋์ง ์์ต๋๋ค. ํ์
์คํฌ๋ฆฝํธ๋ ์ด์ ํด๋น ํ์ผ์ ์ ๋ฐ ํจ์๊ฐ ์๋ค๋ ๊ฑธ "์ ์ธ"๋ฐ์๊ธฐ ๋๋ฌธ์
๋๋ค.
๐ 3. ๊ธ๋ก๋ฒ ์ฐจ์ ์นจํฌ: declare global
๊ฐ์ฅ ์ฐ์ํ๊ณ ๋น๋ฒํ๊ฒ ์ฌ์ฉ๋๋ ์คํฌ์
๋๋ค.
๋ธ๋ผ์ฐ์ ์ ๋ด์ฅ๋ window ๊ฐ์ฒด์ ์์๋ค ํ์ฌ๊ฐ ๋ง๋ ์ ์ญ ํจ์ window.KakaoLogin()์ ๋ถ์ด๊ณ ์ถ์ต๋๋ค.
// ์ผ๋ฐ TS ํ์ผ
window.KakaoLogin = () => { /* ... */ };
// โ ์๋ฌ: Property 'KakaoLogin' does not exist on type 'Window & typeof globalThis'.์ ์ธ ๋ณํฉ(Declaration Merging)์ ๋ถํ
์ฐ๋ฆฌ๋ 2์ฅ(Interface vs Type)์์ interface๋ ๋๊ฐ์ ์ด๋ฆ์ผ๋ก ๋ ๋ฒ ์ ์ธํ๋ฉด ํฉ์ณ์ง๋ค๋ ๊ฒ์ ๋ฐฐ์ ์ต๋๋ค. ์ด๋ฅผ window ๊ฐ์ฒด์ ์ ์ฉํฉ๋๋ค.
// types/global.d.ts
export {}; // ์ด ํ์ผ์ ์ ์ญ ์คํฌ๋ฆฝํธ๊ฐ ์๋ ๋ชจ๋๋ก ์ธ์์์ผ declare global์ ์์ ํ๊ฒ ๋๋ค.
declare global {
// Window ์ธํฐํ์ด์ค๋ฅผ ์ด๊ณ ๋ด ๋ง๋๋ก ํ์ฅ!
interface Window {
KakaoLogin: () => void;
// ์ฌ๋ด ํ๊ฒฝ ๋ณ์ ๊ฐ์ ๊ฒ๋ ์ ์ญ์ผ๋ก ๋ฃ์ด๋ ์ ์๋ค.
YOUNGSOO_ENV: string;
}
}์ด๋ ๊ฒ ํ๋ฉด ํ๋ก์ ํธ ์ด๋์์๋ window.KakaoLogin()์ ํธ์ถํ ๋ ์๋ ์์ฑ์ด ๋จ๊ณ , ์์ ํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๐ ๋ง๋ฌด๋ฆฌ ํด์ฆ
Q1. tsconfig.json์ strict: true ์ต์
์ ๋ฌด์์ ์๋ฏธํ๋์?
โ
์ ๋ต: ํ์
์คํฌ๋ฆฝํธ์ ๊ฐ์ฅ ์๊ฒฉํ ํ์
๊ฒ์ฌ๊ธฐ ์ต์
๋ค(noImplicitAny, strictNullChecks ๋ฑ)์ ํ๊บผ๋ฒ์ ์ผ์ฃผ๋ ๋ง์คํฐ ์ค์์น์
๋๋ค.
๐ก ์์ธ ํด์ค:
- ์ด ์ต์ ์ ์ผ์ง ์์ผ๋ฉด ํ์ ์คํฌ๋ฆฝํธ๋ ์ฌ์ค์ "ํ์ดํ๋ ํ ์ ์๋ ์๋ฐ์คํฌ๋ฆฝํธ" ์์ค์ ๋์จํ ์ธ์ด๋ก ์ ๋ฝํฉ๋๋ค.
- ์๊ธฐ์น ๋ชปํ ๋ฐํ์ Null ์๋ฌ๋ฅผ ๋ง๋
strictNullChecks์ ๋ฐฉํจ๋ฅผ ์๊ฒ ๋๋ฏ๋ก, ์ ๊ท ํ๋ก์ ํธ๋ผ๋ฉด ๋ฌด์กฐ๊ฑดtrue๋ก ์ค์ ํ๊ณ ์์ํ๋ ๊ฒ์ด 5๋ ์ฐจ์ ์ฒ ์น์ ๋๋ค.
Q2. ์์ํ .d.ts ์ ์ธ ํ์ผ ์์๋ ์ด๋ค ์ฝ๋๋ฅผ ์์ฑํ ์ "์๋"๊ฐ์?
โ
์ ๋ต: ์ค์ ๋ก ๋ฐ์ดํฐ๋ฅผ ์กฐ์ํ๊ฑฐ๋ ํจ์๊ฐ ๋์ํ๋ '๊ตฌํ๋ถ(Implementation)' ์ฝ๋๋ ์์ฑํ ์ ์์ต๋๋ค. (์: function add(a:number) { return a + 1 } ๊ฐ์ด ์ค๊ดํธ๋ก ์คํ๋๋ ์ฝ๋ ๋ถ๊ฐ)
๐ก ์์ธ ํด์ค:
.d.ts๋ ํ์ ์ ์ธ ์ ์ฉ ํ์ผ์ ๋๋ค. ์ค์ ๋์ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๋ณํ(Emit)๋์ง ์๋ ํฌ๋ช ํ ํ์ผ์ ๋๋ค.- ์ค์ง
interface,type,declare module,declare var๋ฑ ๋ผ๋(Signature)๋ง์ ์ ํฌํ๋ ์ญํ ๋ง ์ํํฉ๋๋ค.
Q3. [์์ฒ ์ด์ ํ
์คํธ ํ์: ์ ์ญ ์ค์ผ ๋๋ ๋ง] ์์ฒ ์ด๊ฐ ์ธํ๋ผํ์ ์์ฒญ์ผ๋ก, ๋ชจ๋ฐ์ผ ์ฑ์์ ์น๋ทฐ(WebView)์ ์ฃผ์
ํด์ฃผ๋ ๋ธ๋ฆฟ์ง(Bridge) ๊ฐ์ฒด window.AppBridge.close()๋ฅผ ํธ์ถํด์ผ ํฉ๋๋ค. VScode๋ ๊ณ์ window์ AppBridge๊ฐ ์๋ค๊ณ ํ๋ฅผ ๋ด๊ณ , ์์ฒ ์ด๋ ๋ ์ฒด๋
ํ๋ฉฐ (window as any).AppBridge.close()๋ฅผ ์๋๋ค. ํด๊ทผ ์ ์ด ์ฝ๋๋ฅผ ๋ฆฌ๋ทฐํ ์ํธ ๋ฆฌ๋๋ ์ด๋ค ํด๋ฒ์ ์ ์ํ ๊น์?
โ
์ ๋ต: global.d.ts ํ์ผ์ ๋ง๋ค๊ณ declare global { interface Window { AppBridge: { close: () => void } } }๋ก Window ์ธํฐํ์ด์ค๋ฅผ ํ์ฅํ๋ค.
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ ์ค๋ช
: ๋ด์ฅ ์ ์ญ ๊ฐ์ฒด(Window, Document, Array ๋ฑ)์ ํ์
์ TS ์ฝ์ด ์ ์ธ ํ์ผ์ ์ด๋ฏธ
interface๋ก ๋ฑ๋ก๋์ด ์์ต๋๋ค. 2์ฅ์์ ๋ฐฐ์ด '์ ์ธ ๋ณํฉ' ์๋ฆฌ์ ๋ฐ๋ผ, ์ฐ๋ฆฌ๊ฐdeclare global์ค์ฝํ ์์์ ๋์ผํ ์ด๋ฆ์Window์ธํฐํ์ด์ค๋ฅผ ๋ค์ ์ ์ธํ๊ณ ์ด์ ๋ถ์ฌ์ฃผ๋ฉด, ์ปดํ์ผ๋ฌ๊ฐ ์์์ ํ๋๋ก ํฉ์ณ์ค๋๋ค. (window as any)๋ ํธ์ถ๋ถ๋ง๋ค ํ์ ๊ฒ์ฌ๋ฅผ ํฌ๊ธฐํ๊ฒ ๋ง๋ค์ง๋ง,global.d.ts์ ์ ์ธ ๋ณํฉ์ ํ๋ก์ ํธ ์ ์ฒด์ ๊ณตํต ๊ณ์ฝ์ ์ ๊ณตํฉ๋๋ค.- ํ์ผ์ด ๋ชจ๋๋ก ์ธ์๋๋๋ก
export {};๋ฅผ ๋๊ณ , ์ค์ ๊ตฌํ์ด ์๋๋ผ ํ์ ๊ป๋ฐ๊ธฐ๋ง ์ ์ธํด์ผ ํฉ๋๋ค. - ํต์ฌ์ ์ ์ญ ๊ฐ์ฒด๋ฅผ "๋ชฐ๋ ์ฐ๊ธฐ"๊ฐ ์๋๋ผ, ํ์ด ๊ณต์ ํ๋ ์ ์ธ ํ์ผ์ ๋ช ์์ ์ธ ๊ณ์ฝ์ผ๋ก ๋ฑ๋กํ๋ ๊ฒ์ ๋๋ค.
๐ฃ ์์ฒ ์ด์ ํด๊ทผ ์ผ๊ธฐ
์ค๋์ tsconfig.json๊ณผ .d.ts๊ฐ ์จ๊ฒจ์ง ์ค์ ํ์ผ์ด ์๋๋ผ ํ์ ํ์
๊ณ์ฝ์ด๋ผ๋ ๊ฑธ ๋ฐฐ์ ๋ค. ํนํ ํ์
์๋ ๋ ๊ฑฐ์ ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ฌ์ ๋ @ts-ignore๋ก ์ง๋๊ฐ๋ ๊ฑด ๋น์ฅ์ ์นจ๋ฌต์ผ ๋ฟ, ๋ค์ ์ฌ๋์ด ์ด๋๊น์ง ๋ฏฟ์ด๋ ๋๋์ง ์ ์ ์๊ฒ ๋ง๋ ๋ค.
declare module์ ๋ชจ๋์ ์ฌ๊ถ์ ๋ง๋ค์ด์ฃผ๋ ์ผ์ด๊ณ , declare global์ ์ ์ญ ๊ฐ์ฒด์ ํ์ด ํฉ์ํ ์์ฑ์ ๋ฑ๋กํ๋ ์ผ์ด๋ค. ๋ ๋ค ์ค์ ๊ตฌํ์ ๋ง๋๋ ๊ฒ ์๋๋ผ, ์ด๋ฏธ ์กด์ฌํ๋ ๋ฐํ์ ์ฝ๋์ ๋ชจ์์ TS์๊ฒ ์ค๋ช
ํ๋ ์์
์ด์๋ค.
๐ก "์ ์ธ ํ์ผ์ ๋นจ๊ฐ ์ค์ ์จ๊ธฐ๋ ์ข ์ด๊ฐ ์๋๋ผ, ํ์ ์ด ์๋ ๊ฒฝ๊ณ์ ๋ถ์ด๋ ๊ณ์ฝ์๋ค."
๋ด์ผ์ ์น๋ทฐ ๋ธ๋ฆฟ์ง ํธ์ถ๋ถ์์ (window as any)๋ฅผ ๊ฒ์ํด global.d.ts๋ก ์ฎ๊ธธ ์ ์๋์ง ํ์ธํด์ผ๊ฒ ๋ค. ์ค์ ์ ๊ณ ์น ๋๋ ์ ์ด ์ต์
์ด ํ์ํ์ง๋ PR ์ค๋ช
์ ๋จ๊ฒจ์ผ ํ์ด ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ ์งํ ์ ์๋ค.