2024-06-10.md
๐กDIL: ์ดํํฐ๋ธ ํ์ ์คํฌ๋ฆฝํธ
์คํฐ๋: ์๊ฐ CS, https://github.com/monthly-cs/2024-05-effective-typescript
์์ฑ์ผ: 2024-06-10
์์ฑ์: dusunax
ํ์
์ ์ธ๊ณผ @type
- ์์กด์ฑ ๊ด๋ฆฌ๋ ์ด๋ ต๋ค.
- ํ์ ์ ์ธ๋ฌธ => ํ๋ก์ ํธ + TS ์ปค๋ฎค๋ํฐ ๊ธฐ์ฌ
์์ดํ
45: devDependencies์ typescript์ @types
์ถ๊ฐํ๊ธฐ Put TypeScript and @types in devDependencies
- npm, node package manager๋ JS ์ํ๊ณ์์ ํ์์
- package.json: ํ๋ก์ ํธ๊ฐ ์์กดํ๊ณ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฒ์ ์ ์ง์ ํ๋ ๋ฐฉ๋ฒ
์์กด์ฑ ์ข ๋ฅ
- dependencies
- ์ ์ด ์์กด์ฑ transitive dependencies
- ๋ค๋ฅธ ์ฌ์ฉ์๊ฐ ํด๋น ํ๋ก์ ํธ๋ฅผ ์ค์นํ๋ค๋ฉด ํจ๊ป ์ค์น๋๋ค
- devDependencies:
- ๋ฐํ์์๋ ํ์์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ๋ค๋ฅธ ์ฌ์ฉ์๊ฐ ํด๋น ํ๋ก์ ํธ๋ฅผ ์ค์นํ๋ฉด devDependencies๋ ์ ์ธ๋๋ค.
- ex) ํ ์คํธ ํ๋ ์์ํฌ
- peerDependencies:
- ๋ฐํ์์ ํ์ํ์ง๋ง, ์์กด์ฑ์ ์ง์ ๊ด๋ฆฌํ์ง ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ex) ํ๋ฌ๊ทธ์ธ
ํ์ ์คํฌ๋ฆฝํธ์ ์์กด์ฑ
- ํ์ ์คํฌ๋ฆฝํธ๋ ๊ฐ๋ฐ ๋๊ตฌ์ผ ๋ฟ์ด๊ณ , ํ์ ์ ๋ณด๋ ๋ฐํ์์ ์ํ์ง ์๊ธฐ ๋๋ฌธ์ ํ์ ๊ด๋ จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ผ๋ฐ์ ์ผ๋ก devDependencies์ ์ํ๋ค
ํ์ ์คํฌ๋ฆฝํธ ์์ฒด ์์กด์ฑ
- TS๋ฅผ ์์คํ
๋ ๋ฒจ๋ก ์ค์นํ ์ ์์ง๋ง ์ถ์ฒํ์ง ์๋ ์ด์
- ํ์์ด ๋์ผํ ๋ฒ์ ์ ์ฌ์ฉํ๋ค๋ ๋ณด์ฅ์ด ์์
- ํ๋ก์ ํธ ์ ์ ์ ๋ณ๋์ ๋จ๊ณ๊ฐ ์ถ๊ฐ๋จ
- global ์ค์น x => devDependencies์ ๋ฃ์
- npx๋ก devDependencies์ ํ์
์คํฌ๋ฆฝํธ ์ปดํ์ผ๋ฌ ์คํํ ์ ์์
npx tsc
ํ์
์์กด์ฑ @types
- DefinitelyTyped์์ ํ์ ์ ๋ณด๋ฅผ ์ป์ ์ ์๋ค.
- npm ๋ ์ง์คํธ๋ฆฌ์
@types
์ค์ฝํ์ ๊ณต๊ฐ๋๋ค.- ex)
@types/jquery
,@types/lodash
- ํ์ ์ ๋ณด๋ง ํฌํจํ๊ณ ์์ผ๋ฉฐ, ๊ตฌํ์ ๋ ํฌํจํ์ง ์์
- ex)
- ํ์ ์์กด์ฑ์ devDependencies์ ์์ด์ผ ํ๋ค.
Things to Remember
- Understand the difference between dependencies and devDependencies in package.json.
- dependencies & devDependencies ์ฐจ์ด์ ์๊ธฐ
- Put TypeScript in your project's devDependencies. Don't install TypeScript system-wide.
- ์์คํ ๋ ๋ฒจ๋ก ์ค์นํ์ง ๋ง๊ณ ํ๋ก์ ํธ ๋จ์๋ก ์ค์นํ๊ธฐ (devDependencies)
- Put @types dependencies in devDependencies, not dependencies.
- devDependencies์ ํ์
์์กด์ฑ
@types
์ค์นํ๊ธฐ
- devDependencies์ ํ์
์์กด์ฑ
์์ดํ 46: ํ์ ์ ์ธ๊ณผ ๊ด๋ จ๋ ์ธ ๊ฐ์ง ๋ฒ์ ์ดํดํ๊ธฐ Understand the Three Versions Involved in Type Declarations
ํ์ ์คํฌ๋ฆฝํธ์ ๋ฒ์
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฒ์
- ํ์
์ ์ธ์ ๋ฒ์
@types
- ํ์ ์คํฌ๋ฆฝํธ์ ๋ฒ์
์ค์นํ๊ธฐ
- ํน์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ dependencies๋ก ์ค์น
- ํ์ ์ ๋ณด๋ฅผ devDependencies๋ก ์ค์น
$ npm install react
+ react@16.8.6
$ npm install --save-dev @types/react
+ @types/react@16.8.19
// ํ์
์ ์ธ์ด 16.8.x์ API๋ฅผ ๋ํ๋ธ๋ค.
// ๋ฉ์ด์ ์ ๋ง์ด๋๊ฐ ์ผ์นํ์ง๋ง, ํจ์น๋ฒ์ ์ ์ผ์นํ์ง ์๋๋ค!
// ์๋ฉํฑ ๋ฒ์ ๋์ ๋ฐ๋ผ ํจ์น ๋ฒ์ ์ ๊ณต๊ฐ API์ ์ฌ์์ ๋ณ๊ฒฝํ์ง ์๊ธฐ ๋๋ฌธ
// ์ฆ, @types์ ํจ์น ๋ฒ์ ์ ํ์
์ ์ธ ์์ฐจ์ ๋ฒ๊ทธ/๋๋ฝ ์ฌํญ ์์ ์ผ๋ก ์ธํ ์
๋ฐ์ดํธ
ํ์ ์ ๋ณด๊ฐ ๋ณ๋๋ก ๊ด๋ฆฌ๋ ๋์ ๋ฌธ์ ์
A. ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๋ฐ์ดํธํ๊ณ , ํ์ ์ ์ธ์ ์ ๋ฐ์ดํธ ํ์ง ์๋ ๊ฒฝ์ฐ
- ์๋ก์ด ๊ธฐ๋ฅ ์ฌ์ฉ ์, ํ์ ์ค๋ฅ
- ํ์ ํธํ์ฑ์ด ๊นจ์ง๋ ์ ๋ฐ์ดํธ๊ฐ ์์์ ์, ๋ฐํ์ ์ค๋ฅ
- ํ์ ์ ์ธ ๋ฒ์ ์ด ์ค๋น๋์ง ์์๋ค๋ฉด? ๋ณด๊ฐ์ ์ฌ์ฉํ์ฌ ํ๋ก์ ํธ ์์ฒด์ ์ถ๊ฐํ๊ฑฐ๋, ํ์ ์ ์ธ์ ์ง์ ์์ฑํ์ฌ ๊ธฐ์ฌํ ์ ์๋ค.
B. ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ณด๋ค ํ์ ์ ์ธ์ด ์ต์ ์ธ ๊ฒฝ์ฐ
- ํ์ ์ ๋ณด ์์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค๊ฐ, ํ์ ์ ์ธ์ ์ค์นํ๋ ค ํ ๋ ๋ฐ์
- ํ์ ์ฒด์ปค๋ ์ต์ API๋ฅผ ๊ธฐ์ค์ผ๋ก ์ฝ๋๋ฅผ ๊ฒ์ฌํ์ง๋ง, ๋ฐํ์์ ์ฐ์ด๋ ๊ฒ์ด ๊ณผ๊ฑฐ ๋ฒ์
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฒ์ ๊ณผ ๋ง๋๋ก ํ์ ์ ์ธ์ ๋ฒ์ ์ ๋ด๋ฆฐ๋ค
C. ํ๋ก์ ํธ์์ ์ฌ์ฉํ๋ TS๋ณด๋ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ํ์๋กํ๋ TS ๋ฒ์ ์ด ๋์ ๋
- ์ ๋ช
JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฒฝ์ฐ, ํ์
์ ๋ณด๋ฅผ ์ ํํ ํํํ๊ธฐ ์ํด ํ์
์์คํ
์ด ๊ฐ์ ๋๊ณ ๋ฒ์ ์ด ์ฌ๋ผ๊ฐ๋ ๊ฒฝํฅ
- ์ด๋ฐ ๊ฒฝ์ฐ ์ต์ ํ์ ์ ๋ณด๋ฅผ ์ํด ํ์ ์คํฌ๋ฆฝํธ์ ๋ฒ์ ์ ์ฌ๋ฆฌ๊ฑฐ๋, ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ ์ ์ธ์ ๋ฒ์ ์ ๋ด๋ฆฌ๊ฑฐ๋, declare module๋ก ํ์ ์ ๋ณด๋ฅผ ์์ค๋ค.
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ typesVersions(ํ์ ์คํฌ๋ฆฝํธ ๋ฒ์ ๋ณ๋ก ๋ค๋ฅธ ํ์ ์ ์ธ)๋ฅผ ์ ๊ณตํ๋ ๊ฒฝ์ฐ๋ ์์ง๋ง 1% ๋ฐ์ ์๋จ
- ํน์ ๋ฒ์ ์ ํ์
์ ๋ณด ์ค์นํ๊ธฐ
npm install --save-dev @types/lodash@ts3.1
D. @type
์ค๋ณต
@type/foo
์@type/bar
- ๋ง์ฝ
@type/bar
๊ฐ ํ์ฌ ํ๋ก์ ํธ์ ํธํ๋์ง ์๋ ๋ฒ์ ์@type/foo
์ ์์กดํ๋ค๋ฉด npm์ ์ค์ฒฉ ํด๋์ ๋ณ๋์ ๋ฒ์ ์ ์ค์นํด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค ํ๋ค. - ์ ์ญ ๋ค์์คํ์ด์ค๋ฅผ ๊ฐ์ง ํ์ ์ ์ธ ๋ชจ๋์ด๋ผ๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. => ์ข ๋ณต๋ ์ ์ธ, ์ ์ธ ๋ณํฉ์ผ๋ก ์ค๋ฅ
npm ls @type/foo
๋ฅผ ์คํํ์ฌ ํ์ ์ ์ธ ์ค๋ณต์ ์ถ์ ํ ์ ์๋ค.
- ๋ง์ฝ
- ํด๊ฒฐ๋ฒ
@type/foo
๋๋@type/bar
๋ฅผ ์ ๋ฐ์ดํธํ์ฌ ์๋ก ๋ฒ์ ์ด ํธํ๋๋ก๊ณ ํจ
๋ฒ๋ค๋งํ์ฌ ํ์ ์ ์ธ์ ํฌํจํ๋ ๊ฒฝ์ฐ์ ๋ฌธ์ ์
- TS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ์์ฒด์ ์ผ๋ก ํ์
์ ์ธ์ ํฌํจ(๋ฒ๋ค๋ง)ํ๋ค.
- ์์ฒด์ ํ์
์ ์ธ์ ๋ณดํต types ํ๋์
~.d.ts
๋ฅผ ๊ฐ๋ฆฌํจ๋ค
- ์์ฒด์ ํ์
์ ์ธ์ ๋ณดํต types ํ๋์
A. ๋ฒ๋ค๋ ํ์ ์ ์ธ์ ์ค๋ฅ๊ฐ ์์ ๋
- ๋ณด๊ฐ์ผ๋ก ํด๊ฒฐํ ์ ์๋ ์ค๋ฅ๊ฐ ์์ ๋ & ๊ณต๊ฐ ์์ ์๋ ๋์ํ์ง๋ง, TS ๋ฒ์ ์ด ์ฌ๋ผ๊ฐ๋ฉด์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ
@types
๋ฅผ ๋ณ๋๋ก ์ฌ์ฉํ๋ค๋ฉด ๋ฒ์ ์ ๋ง์ถ ์ ์์ง๋ง, ๋ฒ๋ค๋ ํ์ ์ด๋ผ๋ฉด ์ ํ์ด ๋ถ๊ฐ๋ฅํ๋ค.
B. ํ๋ก์ ํธ ๋ด์ ํ์ ์ ์ธ์ด, ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ์ ์ ์ธ์ ์์กดํ ๋
- ๋ณดํต ์์กด์ฑ์ devDependencies
- ํ๋ก์ ํธ๋ฅผ ๊ณต๊ฐํ์ฌ ๋ค๋ฅธ ์ฌ์ฉ์๊ฐ ์ค์นํ๋ฉด devDependencies๊ฐ ์ค์น๋์ง ์์ ํ์ ์ค๋ฅ
- ์๋ฐ์คํฌ๋ฆฝํธ ์ฌ์ฉ์๋ ํ์ ์ ๋ณด๋ฅผ ์ค์นํ ํ์๊ฐ ์๋ค. ํ์ ์คํฌ๋ฆฝํธ ์ฌ์ฉ์๋ง์ด ํ์ ์ ๋ณด๋ฅผ ์ฌ์ฉํ๋ค.
C. ํ๋ก์ ํธ ๊ณผ๊ฑฐ ๋ฒ์ ์ ํ์ ์ ์ธ์ ๋ฌธ์ ๊ฐ ์๋ ๊ฒฝ์ฐ, ํจ์น ์ ๋ฐ์ดํธ
- ๋ฒ๋ค๋ง๋ ํ์
์ ์ธ์์๋ ์ด๋ ต์ง๋ง
@types
์ ๋์ผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฌ๋ฌ ๋ฒ์ ์์ ํ์ ์ ์ธ์ ๋์์ ์ ์ง๋ณด์ํ ์ ์๋ ๋งค์ปค๋์ฆ์ด ์๋ค.
D. ํ์ ์ ์ธ์ ํจ์น ์ ๋ฐ์ดํธ๋ฅผ ์์ฃผ ํ๊ธฐ ์ด๋ ต๋ค.
- DefinitelyTyped๋ ์ปค๋ฎค๋ํฐ์์ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ ํจ์น๋ฅผ ์ ์ฉํ ๋ด๋น์ ์์
์์กด์ฑ ๊ด๋ฆฌ
-
์ ์์ฑ๋ ํ์ ์ ์ธ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ๋ ๋ฐ ๋์์ด ๋๊ณ + ์์ฐ์ฑ์ด ํฌ๊ฒ ํฅ์๋๋ค.
-
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ณต๊ฐํ๋ ๊ฒฝ์ฐ, ํ์ ์ ์ธ์ ์์ฒด์ ์ผ๋ก ํฌํจํ๋ ๊ฒ๊ณผ DefinitelyTyped์ ๊ณต๊ฐํ๋ ๊ฒ์ ์ฅ๋จ์ ์ ๋น๊ตํ๊ธฐ
-
๊ณต์ ๊ถ์ฅ์ฌํญ
-
๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ TS๋ก ์์ฑ๋ ๊ฒฝ์ฐ์๋ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํฌํจํ๊ธฐ
- TS๋ก ์์ฑํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ: ํ์ ์คํฌ๋ฆฝํธ ์ปดํ์ผ๋ฌ๊ฐ ํ์ ์ ์ธ์ ๋์ ํด์ค๋ค
- JS๋ก ์์ฑํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ: ์ง์ ์์ฑํ ํ์ ์ ์ธ์ ์ค๋ฅ๊ฐ ์์ ๊ฐ๋ฅ์ฑ์ด ๋๊ณ , ์ ๋ฐ์ดํธ๊ฐ ํ์ํ๋ค. DefinitelyTyped์ ๊ณต๊ฐํด์ ๊ด๋ฆฌํ๋๋ก ๋งก๊ธฐ๋ ๊ฒ์ด ์ข์
-
Things to Remember
- There are three versions involved in an @types dependency: the library version, the @types version, and the TypeScript version.
- ์์กด์ฑ ์ธ ๊ฐ์ง ๋ฒ์
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ,
@types
, ํ์ ์คํฌ๋ฆฝํธ ๋ฒ์
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ,
- ์์กด์ฑ ์ธ ๊ฐ์ง ๋ฒ์
- Recognize the symptoms of different types of version mismatch.
- If you update a library, make sure you update the corresponding @types.
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์
๋ฐ์ดํธ ํ๋ ๊ฒฝ์ฐ,
@types
๋ ์ ๋ฐ์ดํธ
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์
๋ฐ์ดํธ ํ๋ ๊ฒฝ์ฐ,
- Understand the pros and cons of bundling types versus publishing them on DefinitelyTyped. Prefer bundling types if your library is written in TypeScript, and DefinitelyTyped if it is not.
- ํ์ ์ ์ธ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํฌํจ์ํค๊ธฐ vs DefinitelyTyped์ ๊ณต๊ฐํ๊ธฐ