TypeScript declaration ํ์ผ(.d.ts)์ ๋ง์คํฐํ์ฌ ๋ชจ๋ JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ํ์ ์์ ์ฑ ๋ฐ ์๋ ์์ฑ ๊ธฐ๋ฅ์ ํ์ฉํ์ธ์. @types ์ฌ์ฉ๋ฒ, ์์ฒด ์ ์ ์์ฑ, ํ์ฌ ์ฝ๋๋ฅผ ํ๋ก์ฒ๋ผ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์.
JavaScript ์ํ๊ณ ์ ๊ธ ํด์ : TypeScript Declaration ํ์ผ ์ฌ์ธต ๋ถ์
TypeScript๋ JavaScript์ ์ญ๋์ ์ธ ์ธ๊ณ์ ์ ์ ํ์ดํ์ ๋์ ํ์ฌ ํ๋ ์น ๊ฐ๋ฐ์ ํ๋ช ์ ์ผ์ผ์ผฐ์ต๋๋ค. ์ด๋ฌํ ํ์ ์์ ์ฑ์ ์ปดํ์ผ ์๊ฐ์ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ๊ณ , ๊ฐ๋ ฅํ ํธ์ง๊ธฐ ์๋ ์์ฑ์ ๊ฐ๋ฅํ๊ฒ ํ๋ฉฐ, ๋๊ท๋ชจ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ํจ์ฌ ๋ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ฝ๊ฒ ๋ง๋๋ ๋๋ผ์ด ์ด์ ์ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ธฐ์กด JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ด๋ํ ์ํ๊ณ๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ ๋ ์ฃผ์ ๊ณผ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ๋๋ถ๋ถ TypeScript๋ก ์์ฑ๋์ง ์์์ต๋๋ค. ์๊ฒฉํ๊ฒ ํ์ ์ด ์ง์ ๋ TypeScript ์ฝ๋๋ ํ์ ์ด ์ง์ ๋์ง ์์ JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ชจ์, ํจ์ ๋ฐ ๋ณ์๋ฅผ ์ด๋ป๊ฒ ์ดํดํ ๊น์?
์ ๋ต์ TypeScript Declaration ํ์ผ์ ์์ต๋๋ค. .d.ts ํ์ฅ์๋ก ์๋ณํ ์ ์๋ ์ด๋ฌํ ํ์ผ์ TypeScript์ JavaScript ์ธ๊ณ๋ฅผ ์๋ ํ์์ ์ธ ๋ค๋ฆฌ์
๋๋ค. ์ค์ ๊ตฌํ์ ํฌํจํ์ง ์๊ณ ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ์
์ ์ค๋ช
ํ๋ ์ฒญ์ฌ์ง ๋๋ API ๊ณ์ฝ ์ญํ ์ ํฉ๋๋ค. ์ด ์ข
ํฉ ๊ฐ์ด๋์์๋ TypeScript ํ๋ก์ ํธ์์ JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ํ์
์ ์๋ฅผ ์์ ์๊ฒ ๊ด๋ฆฌํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ๊ฒ์ ์ดํด๋ด
๋๋ค.
TypeScript Declaration ํ์ผ์ด๋ ์ ํํ ๋ฌด์์ผ๊น์?
๋ค๋ฅธ ์ธ์ด๋ง ์ฌ์ฉํ๋ ๊ณ์ฝ์๋ฅผ ๊ณ ์ฉํ๋ค๊ณ ์์ํด ๋ณด์ธ์. ๊ทธ๋ค๊ณผ ํจ๊ณผ์ ์ผ๋ก ํ๋ ฅํ๋ ค๋ฉด ๋ฒ์ญ๊ฐ ๋๋ ๋น์ ๊ณผ ๊ทธ๋ค ๋ชจ๋๊ฐ ์ดํดํ๋ ์ธ์ด๋ก ๋ ์์ธํ ์ง์นจ ์ธํธ๊ฐ ํ์ํฉ๋๋ค. declaration ํ์ผ์ TypeScript ์ปดํ์ผ๋ฌ(๊ณ์ฝ์)์ ๋ํด ์ ํํ ์ด ๋ชฉ์ ์ ์ํํฉ๋๋ค.
.d.ts ํ์ผ์๋ ํ์
์ ๋ณด๋ง ํฌํจ๋ฉ๋๋ค. ์ฌ๊ธฐ์๋ ๋ค์์ด ํฌํจ๋ฉ๋๋ค.
- ํจ์ ๋ฐ ๋ฉ์๋์ ๋ํ ์๋ช (๋งค๊ฐ๋ณ์ ํ์ , ๋ฐํ ํ์ ).
- ๋ณ์ ๋ฐ ํด๋น ํ์ ์ ๋ํ ์ ์.
- ๋ณต์กํ ๊ฐ์ฒด์ ๋ํ ์ธํฐํ์ด์ค ๋ฐ ํ์ ๋ณ์นญ.
- ์์ฑ ๋ฐ ๋ฉ์๋๋ฅผ ํฌํจํ ํด๋์ค ์ ์.
- ๋ค์์คํ์ด์ค ๋ฐ ๋ชจ๋ ๊ตฌ์กฐ.
๊ฒฐ์ ์ ์ผ๋ก ์ด๋ฌํ ํ์ผ์๋ ์คํ ๊ฐ๋ฅํ ์ฝ๋๊ฐ ์์ต๋๋ค. ์ ์ ๋ถ์ ์ ์ฉ์
๋๋ค. Lodash์ ๊ฐ์ JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ TypeScript ํ๋ก์ ํธ๋ก ๊ฐ์ ธ์ฌ ๋ ์ปดํ์ผ๋ฌ๋ ํด๋น declaration ํ์ผ์ ์ฐพ์ต๋๋ค. ์ฐพ์ผ๋ฉด ์ฝ๋๋ฅผ ๊ฒ์ฆํ๊ณ , ์ง๋ฅ์ ์ธ ์๋ ์์ฑ์ ์ ๊ณตํ๊ณ , ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ๊ณ ์๋์ง ํ์ธํ ์ ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. Could not find a declaration file for module 'lodash'.
Declaration ํ์ผ์ด ์ ๋ฌธ ๊ฐ๋ฐ์ ํ์์ ์ธ ์ด์
TypeScript ํ๋ก์ ํธ์์ ์ ์ ํ ํ์ ์ ์ ์์ด JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ TypeScript๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ฅผ ํผ์ํฉ๋๋ค. ์ธ๊ธฐ ์๋ ์ ํธ๋ฆฌํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ Lodash๋ฅผ ์ฌ์ฉํ๋ ๊ฐ๋จํ ์๋๋ฆฌ์ค๋ฅผ ๊ณ ๋ คํด ๋ณด๊ฒ ์ต๋๋ค.
ํ์ ์ ์๊ฐ ์๋ ์ธ๊ณ
declaration ํ์ผ์ด ์์ผ๋ฉด TypeScript๋ lodash๊ฐ ๋ฌด์์ธ์ง ๋๋ ๋ฌด์์ ํฌํจํ๊ณ ์๋์ง ์ ์ ์์ต๋๋ค. ์ฝ๋๋ฅผ ์ปดํ์ผํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ๋น ๋ฅธ ์์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๊ณ ์ถ์ ์๋ ์์ต๋๋ค.
const _: any = require('lodash');
const users = [{ 'user': 'barney' }, { 'user': 'fred' }];
// Autocomplete? No help here.
// Type checking? No. Is 'username' the correct property?
// The compiler allows this, but it might fail at runtime.
_.find(users, { username: 'fred' });
์ด ๊ฒฝ์ฐ _ ๋ณ์๋ any ํ์
์
๋๋ค. ์ด๋ TypeScript์ "์ด ๋ณ์์ ๊ด๋ จ๋ ๋ชจ๋ ๊ฒ์ ํ์ธํ์ง ๋ง์ธ์."๋ผ๊ณ ํจ๊ณผ์ ์ผ๋ก ์๋ฆฌ๋ ๊ฒ์
๋๋ค. ์๋ ์์ฑ, ์ธ์์ ๋ํ ํ์
๊ฒ์ฌ, ๋ฐํ ํ์
์ ๋ํ ํ์ ์ด ์์ด ๋ชจ๋ ์ด์ ์ ์๊ฒ ๋ฉ๋๋ค. ์ด๊ฒ์ ๋ฐํ์ ์ค๋ฅ์ ์จ์์
๋๋ค.
ํ์ ์ ์๊ฐ ์๋ ์ธ๊ณ
์ด์ ํ์ํ declaration ํ์ผ์ ์ ๊ณตํ ๋ ์ด๋ค ์ผ์ด ๋ฐ์ํ๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค. ํ์ ์ ์ค์นํ ํ(๋ค์์์ ๋ค๋ฃฐ ์์ ) ๊ฒฝํ์ด ๋ฐ๋๋๋ค.
import _ from 'lodash';
interface User {
user: string;
active?: boolean;
}
const users: User[] = [{ 'user': 'barney' }, { 'user': 'fred' }];
// 1. Editor provides autocompletion for 'find' and other lodash functions.
// 2. Hovering over 'find' shows its full signature and documentation.
// 3. TypeScript sees that `users` is an array of `User` objects.
// 4. TypeScript knows the predicate for `find` on `User[]` should involve `user` or `active`.
// CORRECT: TypeScript is happy.
const fred = _.find(users, { user: 'fred' });
// ERROR: TypeScript catches the mistake!
// Property 'username' does not exist on type 'User'.
const betty = _.find(users, { username: 'betty' });
์ฐจ์ด๋ ๋ฐค๊ณผ ๋ฎ์ ๋๋ค. ์๋ฒฝํ ํ์ ์์ ์ฑ, ํด๋ง์ ํตํ ์ฐ์ํ ๊ฐ๋ฐ์ ๊ฒฝํ, ์ ์ฌ์ ์ธ ๋ฒ๊ทธ์ ๊ทน์ ์ธ ๊ฐ์๋ฅผ ์ป์ต๋๋ค. ์ด๊ฒ์ด TypeScript๋ก ์์ ํ๋ ์ ๋ฌธ์ ์ธ ํ์ค์ ๋๋ค.
ํ์ ์ ์๋ฅผ ์ฐพ๋ ๊ณ์ธต ๊ตฌ์กฐ
๊ทธ๋ ๋ค๋ฉด ์ข์ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ์ด๋ฌํ ๋ง๋ฒ ๊ฐ์ .d.ts ํ์ผ์ ์ด๋ป๊ฒ ์ป์ ์ ์์๊น์? ๊ด๋ฒ์ํ ์๋๋ฆฌ์ค๋ฅผ ๋ค๋ฃจ๋ ์ ํ๋ฆฝ๋ ํ๋ก์ธ์ค๊ฐ ์์ต๋๋ค.
1๋จ๊ณ: ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ฒด ํ์ ์ ๋ฒ๋ค๋ก ์ ๊ณตํ๋์ง ํ์ธ
๊ฐ์ฅ ์ข์ ์๋๋ฆฌ์ค๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ TypeScript๋ก ์์ฑ๋์๊ฑฐ๋ ์ ์ง ๊ด๋ฆฌ์๊ฐ ๋์ผํ ํจํค์ง ๋ด์์ ๊ณต์ declaration ํ์ผ์ ์ ๊ณตํ๋ ๊ฒฝ์ฐ์ ๋๋ค. ์ด๋ ์ต์ , ์ ์ ์ง ๊ด๋ฆฌ๋๋ ํ๋ก์ ํธ์์ ์ ์ ๋ ์ผ๋ฐํ๋๊ณ ์์ต๋๋ค.
ํ์ธ ๋ฐฉ๋ฒ:
- ํ์์ ๊ฐ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํฉ๋๋ค.
npm install axios node_modules/axios์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํด๋ ์์ ์ดํด๋ณด์ธ์..d.tsํ์ผ์ด ๋ณด์ด๋์?- ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
package.jsonํ์ผ์์"types"๋๋"typings"ํ๋๋ฅผ ํ์ธํ์ธ์. ์ด ํ๋๋ ๊ธฐ๋ณธ declaration ํ์ผ์ ์ง์ ๊ฐ๋ฆฌํต๋๋ค. ์๋ฅผ ๋ค์ด Axios์package.json์๋"types": "index.d.ts"๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
์ด๋ฌํ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋๋ฉด ์๋ฃ๋ ๊ฒ์ ๋๋ค! TypeScript๋ ์ด๋ฌํ ๋ฒ๋ค ํ์ ์ ์๋์ผ๋ก ์ฐพ์ ์ฌ์ฉํฉ๋๋ค. ์ถ๊ฐ ์กฐ์น๊ฐ ํ์ํ์ง ์์ต๋๋ค.
2๋จ๊ณ: DefinitelyTyped ํ๋ก์ ํธ(@types)
์์ฒด ํ์ ์ ๋ฒ๋ค๋ก ์ ๊ณตํ์ง ์๋ ์์ฒ ๊ฐ์ JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํด ๊ธ๋ก๋ฒ TypeScript ์ปค๋ฎค๋ํฐ๋ ๋๋ผ์ด ๋ฆฌ์์ค์ธ DefinitelyTyped๋ฅผ ๋ง๋ค์์ต๋๋ค.
DefinitelyTyped๋ ์์ฒญ๋ ์์ JavaScript ํจํค์ง์ ๋ํ ๊ณ ํ์ง declaration ํ์ผ์ ํธ์คํ
ํ๋ GitHub์ ์ค์ ์ง์ค์, ์ปค๋ฎค๋ํฐ ๊ด๋ฆฌ ๋ฆฌํฌ์งํ ๋ฆฌ์
๋๋ค. ์ด๋ฌํ ์ ์๋ @types ๋ฒ์์์ npm ๋ ์ง์คํธ๋ฆฌ์ ๊ฒ์๋ฉ๋๋ค.
์ฌ์ฉ ๋ฐฉ๋ฒ:
lodash์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ฒด ํ์
์ ๋ฒ๋ค๋ก ์ ๊ณตํ์ง ์์ผ๋ฉด ํด๋น @types ํจํค์ง๋ฅผ ๊ฐ๋ฐ ์ข
์์ฑ์ผ๋ก ์ค์นํ๋ฉด ๋ฉ๋๋ค.
npm install --save-dev @types/lodash
๋ช
๋ช
๊ท์น์ ๊ฐ๋จํ๊ณ ์์ธก ๊ฐ๋ฅํฉ๋๋ค. package-name์ด๋ผ๋ ํจํค์ง์ ๊ฒฝ์ฐ ํด๋น ํ์
์ ๊ฑฐ์ ํญ์ @types/package-name์ ์์ต๋๋ค. npm ์น์ฌ์ดํธ ๋๋ DefinitelyTyped ๋ฆฌํฌ์งํ ๋ฆฌ์์ ์ฌ์ฉ ๊ฐ๋ฅํ ํ์
์ ๊ฒ์ํ ์ ์์ต๋๋ค.
์ --save-dev์ผ๊น์? declaration ํ์ผ์ ๊ฐ๋ฐ ๋ฐ ์ปดํ์ผ ์ค์๋ง ํ์ํฉ๋๋ค. ๋ฐํ์ ์ฝ๋๋ฅผ ํฌํจํ์ง ์์ผ๋ฏ๋ก ์ต์ข
ํ๋ก๋์
๋ฒ๋ค์ ํฌํจ๋์ด์๋ ์ ๋ฉ๋๋ค. devDependency๋ก ์ค์นํ๋ฉด ์ด๋ฌํ ๋ถ๋ฆฌ๊ฐ ๋ณด์ฅ๋ฉ๋๋ค.
3๋จ๊ณ: ํ์ ์ด ์กด์ฌํ์ง ์์ ๋ - ์ง์ ์์ฑ
ํ์ ์ ๋ฒ๋ค๋ก ์ ๊ณตํ์ง ์๊ณ DefinitelyTyped์๋ ์๋ ์ค๋๋ ํ์ ๋๋ ๋ด๋ถ ๊ฐ์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ์ด๋ป๊ฒ ๋ ๊น์? ์ด ๊ฒฝ์ฐ ์๋งค๋ฅผ ๊ฑท์ด๋ถ์ด๊ณ ์ง์ declaration ํ์ผ์ ๋ง๋ค์ด์ผ ํฉ๋๋ค. ์ด๊ฒ์ด ์ํ์ ์ผ๋ก ๋ค๋ฆด ์ ์์ง๋ง ๊ฐ๋จํ๊ฒ ์์ํ์ฌ ํ์์ ๋ฐ๋ผ ๋ ๋ง์ ์ธ๋ถ ์ ๋ณด๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.
๋น ๋ฅธ ์์ : ์ฝ์ ์ฃผ๋ณ ๋ชจ๋ Declaration
์ ์ ํ ํ์ดํ ์ ๋ต์ ํ์
ํ๋ ๋์ ์ค๋ฅ ์์ด ํ๋ก์ ํธ๋ฅผ ์ปดํ์ผํ๊ธฐ๋ง ํ๋ฉด ๋๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ํ๋ก์ ํธ์์ ํ์ผ(์: declarations.d.ts ๋๋ types/global.d.ts)์ ๋ง๋ค๊ณ ์ฝ์ declaration์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
// in a .d.ts file
declare module 'some-untyped-library';
์ด๊ฒ์ TypeScript์ "์ ๋ฅผ ๋ฏฟ์ผ์ธ์. 'some-untyped-library'๋ผ๋ ๋ชจ๋์ด ์กด์ฌํฉ๋๋ค. ๊ทธ๊ฒ์์ ๊ฐ์ ธ์จ ๋ชจ๋ ๊ฒ์ any ํ์
์ผ๋ก ์ทจ๊ธํ์ธ์."๋ผ๊ณ ์๋ ค์ค๋๋ค. ์ด๊ฒ์ ์ปดํ์ผ๋ฌ ์ค๋ฅ๋ฅผ ์นจ๋ฌต์ํค์ง๋ง ๋
ผ์ํ ๋ฐ์ ๊ฐ์ด ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ๋ชจ๋ ํ์
์์ ์ฑ์ ํฌ์ํฉ๋๋ค. ์ด๊ฒ์ ์์ ํจ์น์ด์ง ์ฅ๊ธฐ์ ์ธ ํด๊ฒฐ์ฑ
์ด ์๋๋๋ค.
๊ธฐ๋ณธ ์ฌ์ฉ์ ์ง์ Declaration ํ์ผ ๋ง๋ค๊ธฐ
๋ ๋์ ์ ๊ทผ ๋ฐฉ์์ ์ค์ ๋ก ์ฌ์ฉํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ถ๋ถ์ ๋ํ ํ์ ์ ์ ์ํ๊ธฐ ์์ํ๋ ๊ฒ์ ๋๋ค. `string-utils`๋ผ๋ ๋จ์ผ ํจ์๋ฅผ ๋ด๋ณด๋ด๋ ๊ฐ๋จํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
// In node_modules/string-utils/index.js
module.exports.capitalize = (str) => str.charAt(0).toUpperCase() + str.slice(1);
ํ๋ก์ ํธ ๋ฃจํธ์ ์ ์ฉ `types` ๋๋ ํฐ๋ฆฌ์ string-utils.d.ts ํ์ผ์ ๋ง๋ค ์ ์์ต๋๋ค.
// In my-project/types/string-utils.d.ts
declare module 'string-utils' {
export function capitalize(str: string): string;
// You could add other function definitions here as you use them
// export function slugify(str: string): string;
}
์ด์ TypeScript์ ์ฌ์ฉ์ ์ง์ ํ์
์ ์๋ฅผ ์ฐพ์ ์์น๋ฅผ ์๋ ค์ผ ํฉ๋๋ค. tsconfig.json์์ ์ด๋ฅผ ์ํํฉ๋๋ค.
{
"compilerOptions": {
// ... other options
"baseUrl": ".",
"paths": {
"*": ["types/*"]
}
}
}
์ด ์ค์ ์ผ๋ก import { capitalize } from 'string-utils'๋ฅผ ์ํํ๋ฉด TypeScript๊ฐ ์ฌ์ฉ์ ์ง์ declaration ํ์ผ์ ์ฐพ์ ์ ์ํ ํ์
์์ ์ฑ์ ์ ๊ณตํฉ๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ ๋ง์ ๊ธฐ๋ฅ์ ์ฌ์ฉํจ์ ๋ฐ๋ผ ์ด ํ์ผ์ ์ ์ฐจ์ ์ผ๋ก ๋น๋ํ ์ ์์ต๋๋ค.
๋ ์์ธํ ์์๋ณด๊ธฐ: Declaration ํ์ผ ์์ฑ
declaration ํ์ผ์ ์์ฑํ๊ฑฐ๋ ์ฝ์ ๋ ์ ํ๊ฒ ๋ ๋ช ๊ฐ์ง ๊ณ ๊ธ ๊ฐ๋ ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๋ค์ํ ์ข ๋ฅ์ ๋ด๋ณด๋ด๊ธฐ Declaration
JavaScript ๋ชจ๋์ ๋ค์ํ ๋ฐฉ์์ผ๋ก ํญ๋ชฉ์ ๋ด๋ณด๋ผ ์ ์์ต๋๋ค. declaration ํ์ผ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ด๋ณด๋ด๊ธฐ ๊ตฌ์กฐ์ ์ผ์นํด์ผ ํฉ๋๋ค.
- ๋ช ๋ช ๋ ๋ด๋ณด๋ด๊ธฐ: ์ด๊ฒ์ด ๊ฐ์ฅ ์ผ๋ฐ์ ์ ๋๋ค. ์์์ `export function capitalize(...)`์ ํจ๊ป ๋ณด์์ต๋๋ค. ์์, ์ธํฐํ์ด์ค ๋ฐ ํด๋์ค๋ ๋ด๋ณด๋ผ ์ ์์ต๋๋ค.
- ๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ: `export default`๋ฅผ ์ฌ์ฉํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฒฝ์ฐ.
- UMD ์ ์ญ ๋ณ์:
<script>ํ๊ทธ๋ฅผ ํตํด ๋ธ๋ผ์ฐ์ ์์ ์๋ํ๋๋ก ์ค๊ณ๋ ์ด์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฒฝ์ฐ ์ข ์ข ์ ์ญ `window` ๊ฐ์ฒด์ ์ฐ๊ฒฐ๋ฉ๋๋ค. ์ด๋ฌํ ์ ์ญ ๋ณ์๋ฅผ declarationํ ์ ์์ต๋๋ค. - `export =` ๋ฐ `import = require()`: ์ด ๊ตฌ๋ฌธ์ `module.exports = ...`๋ฅผ ์ฌ์ฉํ๋ ์ด์ CommonJS ๋ชจ๋์ฉ์ ๋๋ค. ์๋ฅผ ๋ค์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ `module.exports = myClass;`๋ฅผ ์ํํ๋ ๊ฒฝ์ฐ.
declare module 'my-lib' {
export const version: string;
export interface Options { retries: number; }
export function doSomething(options: Options): Promise
declare module 'my-default-lib' {
// For a function default export
export default function myCoolFunction(): void;
// For an object default export
// const myLib = { name: 'lib', version: '1.0' };
// export default myLib;
}
// Declares a global variable '$' of a certain type
declare var $: JQueryStatic;
// in my-class.d.ts
declare class MyClass { constructor(name: string); }
export = MyClass;
// in your app.ts
import MyClass = require('my-class');
const instance = new MyClass('test');
์ต์ ES ๋ชจ๋์์๋ ๋ ์ผ๋ฐ์ ์ด์ง๋ง ์ฌ์ ํ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋ง์ ์ด์ Node.js ํจํค์ง์์ ํธํ์ฑ์ ๋งค์ฐ ์ค์ํฉ๋๋ค.
๋ชจ๋ ํ์ฅ: ๊ธฐ์กด ํ์ ํ์ฅ
๊ฐ์ฅ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ ์ค ํ๋๋ ๋ชจ๋ ํ์ฅ(declaration ๋ณํฉ์ด๋ผ๊ณ ๋ ํจ)์ ๋๋ค. ์ด๋ฅผ ํตํด ๋ค๋ฅธ ํจํค์ง์ declaration ํ์ผ์ ์ ์๋ ๊ธฐ์กด ์ธํฐํ์ด์ค์ ์์ฑ์ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์ด๋ Express ๋๋ Fastify์ ๊ฐ์ ํ๋ฌ๊ทธ์ธ ์ํคํ ์ฒ๊ฐ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
Express์์ `Request` ๊ฐ์ฒด์ `user` ์์ฑ์ ์ถ๊ฐํ๋ ๋ฏธ๋ค์จ์ด๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๊ณ ์์ํด ๋ณด์ธ์. ํ์ฅ์ด ์์ผ๋ฉด TypeScript๋ `user`๊ฐ `Request`์ ์กด์ฌํ์ง ์๋๋ค๊ณ ๋ถํํฉ๋๋ค.
๋ค์์ ์ด ์ ์์ฑ์ ๋ํด TypeScript์ ์๋ฆฌ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
// in your types/express.d.ts file
// We must import the original type to augment it
import { UserProfile } from './auth'; // Assuming you have a UserProfile type
// Tell TypeScript we're augmenting the 'express-serve-static-core' module
declare module 'express-serve-static-core' {
// Target the 'Request' interface inside that module
interface Request {
// Add our custom property
user?: UserProfile;
}
}
์ด์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด์์ Express `Request` ๊ฐ์ฒด๋ ์ ํ์ `user` ์์ฑ์ผ๋ก ์ฌ๋ฐ๋ฅด๊ฒ ํ์ ์ด ์ง์ ๋๊ณ ์๋ฒฝํ ํ์ ์์ ์ฑ ๋ฐ ์๋ ์์ฑ์ ์ป์ ์ ์์ต๋๋ค.
Triple-Slash ์ง์๋ฌธ
๋๋ก๋ ์ธ ๊ฐ์ ์ฌ๋์(///)๋ก ์์ํ๋ .d.ts ํ์ผ์ ๋งจ ์์ ์ฃผ์์ด ํ์๋ ์ ์์ต๋๋ค. ์ด๊ฒ๋ค์ ์ปดํ์ผ๋ฌ ์ง์นจ ์ญํ ์ ํ๋ ํธ๋ฆฌํ ์ฌ๋์ ์ง์๋ฌธ์
๋๋ค.
/// <reference types="..." />: ์ด๊ฒ์ด ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๊ฒ์ ๋๋ค. ๋ค๋ฅธ ํจํค์ง์ ํ์ ์ ์๋ฅผ ์ข ์์ฑ์ผ๋ก ๋ช ์์ ์ผ๋ก ํฌํจํฉ๋๋ค. ์๋ฅผ ๋ค์ด WebdriverIO ํ๋ฌ๊ทธ์ธ์ ๋ํ ํ์ ์๋ ์์ฒด ํ์ ์ด ํต์ฌ WebdriverIO ํ์ ์ ๋ฐ๋ผ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์/// <reference types="webdriverio" />๊ฐ ํฌํจ๋ ์ ์์ต๋๋ค./// <reference path="..." />: ์ด๋ ๋์ผํ ํ๋ก์ ํธ ๋ด์ ๋ค๋ฅธ ํ์ผ์ ๋ํ ์ข ์์ฑ์ declarationํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๋ ์ค๋๋ ๊ตฌ๋ฌธ์ด๋ฉฐ ES ๋ชจ๋ ๊ฐ์ ธ์ค๊ธฐ๋ก ๋์ฒด๋์์ต๋๋ค.
Declaration ํ์ผ ๊ด๋ฆฌ ๋ชจ๋ฒ ์ฌ๋ก
- ๋ฒ๋ค ํ์ ์ ํธ: ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์์ ์ ํํ ๋ TypeScript๋ก ์์ฑ๋์๊ฑฐ๋ ์์ฒด ๊ณต์ ํ์ ์ ์๋ฅผ ๋ฒ๋ค๋ก ์ ๊ณตํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ํธํฉ๋๋ค. ์ด๋ TypeScript ์ํ๊ณ์ ๋ํ ์ฝ์์ ๋ํ๋ ๋๋ค.
@types๋ฅผdevDependencies์ ์ ์ง: ํญ์--save-dev๋๋-D๋ก@typesํจํค์ง๋ฅผ ์ค์นํฉ๋๋ค. ํ๋ก๋์ ์ฝ๋์๋ ํ์ํ์ง ์์ต๋๋ค.- ๋ฒ์ ์ ๋ ฌ: ์ผ๋ฐ์ ์ธ ์ค๋ฅ์ ์์ธ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฒ์ ๊ณผ
@types๋ฒ์ ๊ฐ์ ๋ถ์ผ์น์ ๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฃผ์ ๋ฒ์ ์ ๊ทธ๋ ์ด๋(์: v2์์ v3๋ก)๋ API์ ํธํ์ฑ์ด ์์๋๋ ๋ณ๊ฒฝ ์ฌํญ์ด ์์ ๊ฐ๋ฅ์ฑ์ด ๋์ผ๋ฉฐ ์ด๋@typesํจํค์ง์ ๋ฐ์๋์ด์ผ ํฉ๋๋ค. ๋๊ธฐํ ์ํ๋ฅผ ์ ์งํ์ญ์์ค. tsconfig.json์ ์ฌ์ฉํ์ฌ ์ ์ด:tsconfig.json์typeRoots๋ฐtypes์ปดํ์ผ๋ฌ ์ต์ ์ ์ฌ์ฉํ๋ฉด TypeScript๊ฐ declaration ํ์ผ์ ์ฐพ๋ ์์น๋ฅผ ์ธ๋ฐํ๊ฒ ์ ์ดํ ์ ์์ต๋๋ค.typeRoots๋ ์ปดํ์ผ๋ฌ์ ํ์ธํ ํด๋๋ฅผ ์๋ ค์ฃผ๊ณ (๊ธฐ๋ณธ์ ์ผ๋ก./node_modules/@types์)types๋ฅผ ์ฌ์ฉํ๋ฉด ํฌํจํ ํ์ ํจํค์ง๋ฅผ ๋ช ์์ ์ผ๋ก ๋์ดํ ์ ์์ต๋๋ค.- ๋ค์ ๊ธฐ์ฌ: ํ์ ์ด ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ํฌ๊ด์ ์ธ declaration ํ์ผ์ ์์ฑํ ๊ฒฝ์ฐ DefinitelyTyped ํ๋ก์ ํธ์ ๊ธฐ์ฌํ๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณด์ธ์. ์ด๊ฒ์ ๊ธ๋ก๋ฒ ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ์ ํ์ํ๊ณ ์์ฒ ๋ช ์ ๋ค๋ฅธ ์ฌ๋๋ค์ ๋๋ ํ์์ ์ธ ๋ฐฉ๋ฒ์ ๋๋ค.
๊ฒฐ๋ก : ํ์ ์์ ์ฑ์ ์จ๊ฒจ์ง ์์
TypeScript Declaration ํ์ผ์ JavaScript์ ์ญ๋์ ์ด๊ณ ๊ด๋ฒ์ํ ์ธ๊ณ๋ฅผ ๊ฐ๋ ฅํ๊ณ ํ์ ์์ ํ ๊ฐ๋ฐ ํ๊ฒฝ์ ์ํํ๊ฒ ํตํฉํ ์ ์๋๋ก ํ๋ ์จ๊ฒจ์ง ์์ ์ ๋๋ค. ์ด๋ ๋๊ตฌ์ ๊ถํ์ ๋ถ์ฌํ๊ณ ์๋ง์ ๋ฒ๊ทธ๋ฅผ ๋ฐฉ์งํ๋ฉฐ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๋์ฑ ํ๋ ฅ์ ์ด๊ณ ์์ฒด ๋ฌธ์ํํ๋๋ก ๋ง๋๋ ์ค์ํ ์ฐ๊ฒฐ ๊ณ ๋ฆฌ์ ๋๋ค.
.d.ts ํ์ผ์ ์ฐพ๊ณ , ์ฌ์ฉํ๊ณ , ์ฌ์ง์ด ์ง์ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์ดํดํจ์ผ๋ก์จ ์ปดํ์ผ๋ฌ ์ค๋ฅ๋ฅผ ์์ ํ๋ ๊ฒ๋ฟ๋ง ์๋๋ผ ์ ์ฒด ๊ฐ๋ฐ ์ํฌํ๋ก๋ฅผ ํฅ์์ํค๊ณ ์์ต๋๋ค. TypeScript์ ํ๋ถํ JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ํ๊ณ์ ์ ์ฌ๋ ฅ์ ์ต๋ํ ํ์ฉํ์ฌ ๋ ๋์ ์์ ์ ์ธ ์ํํธ์จ์ด๋ฅผ ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ์ ๊ณตํ๋ ๊ฐ๋ ฅํ ์๋์ง ํจ๊ณผ๋ฅผ ์ฐฝ์ถํ๊ณ ์์ต๋๋ค.