TypescriptHandBook - YDP-SPLOUNGE-CLUB/typescript-study GitHub Wiki
JavaScript ๋ ํ๋ก๊ทธ๋๋ฐ ์ปค๋ฎค๋ํฐ์ ๋์ ๋ ์ง 20๋ ์ด ์ง๋ ์ง๊ธ ๊ฐ์ฅ ๋๋ฆฌ ํผ์ง cross-platform ์ธ์ด ์ค ํ๋์ด๋ค.
์น ํ์ด์ง์ ์ฌ์ํ ์ํธ์์ฉ์ ์ถ๊ฐํ๊ธฐ ์ํ ์์ ์คํฌ๋ฆฝํ ์ธ์ด๋ก ์์ํ์ฌ ๊ท๋ชจ์ ์๊ด์์ด ํ๋ก ํธ์๋์ ๋ฐฑ์๋ ์ํ๋ฆฌ์ผ์ด์ ์ ์ ํ ๊ฐ๋ฅํ ์ธ์ด๋ก ์ฑ์ฅํ์๋ค.
JavaScript(JS) ๋ก ์์ฑ๋ ํ๋ก๊ทธ๋จ์ ํฌ๊ธฐ ๋ฒ์ ๋ณต์ก์ฑ์ ๊ธฐํ๊ธ์์ ์ผ๋ก ์ปค์ก์ง๋ง ๋ค๋ฅธ ์ฝ๋ ๋จ์ ๊ฐ์ ๊ด๊ณ๋ฅผ ํํํ๋ JS ์ธ์ด์ ๋ฅ๋ ฅ์ ๊ทธ๋ ์ง ๋ชปํ๋ค.
TypeScript(TS) ์ ๋ชฉํ๋ JS ํ๋ก๊ทธ๋จ์ ์ ์ ํ์ ๊ฐ์์ ์ด๋ค. ์ฝ๋๊ฐ ์คํ๋๊ธฐ ์ ์ ์คํํ๊ณ ํ๋ก๊ทธ๋จ ํ์ ์ด ์ ํํ์ง ํ์ธํ๋ ๋๊ตฌ (ํ์ ๊ฒ์ฌ) ์ด๋ค.
๋ ์์ญ์ผ๋ก ๋๋๋ค.
-
ํธ๋๋ถ
TS ํธ๋๋ถ์ ํ๋ก๊ทธ๋๋จธ๋ค์๊ฒ TS ๋ฅผ ์ค๋ช ํ๋ ์ข ํฉ์ ์ธ ๋ฌธ์์ด๋ค. ๊ฐ ์ฅ ๋๋ ํ์ด์ง๊ฐ ์ฃผ์ด์ง ๊ฐ๋ ์ ๋ํ ์์ธํ ์ค๋ช ์ ์ ๊ณตํ ๊ฒ์ด๋ค.
์ค์ต์ ์๋ฃํ ๋ ์๋ ๋ค์์ ์ํํ ์ ์์ด์ผ ํ๋ค.
- ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉํ๋ TS ๊ตฌ๋ฌธ ๋ฐ ํจํด์ ์ฝ๊ณ ์ดํดํ๊ธฐ
- ์ค์ํ ์ปดํ์ผ๋ฌ ์ต์ ์ ํจ๊ณผ ์ค๋ช ํ๊ธฐ
- ๋๋ถ๋ถ์ ๊ฒฝ์ฐ์์ ํ์ ์์คํ ๋์์ ์ฌ๋ฐ๋ฅด๊ฒ ์์ธกํ๊ธฐ
- ๊ฐ๋จํ ํจ์, ๊ฐ์ฒด ๋๋ ํด๋์ค์ ๋ํ .d.ts ์ ์ธ ์์ฑํ๊ธฐ
ํธ๋๋ถ์ ์ฃผ์ ๋ด์ฉ์ ๋ช ํ์ฑ๊ณผ ๊ฐ๊ฒฐ์ฑ์ ์ํด ๋ชจ๋ ์ฃ์ง ์ผ์ด์ค ๋๋ ์ธ๋ถ ์ฌํญ์ ํ๊ตฌํ์ง ์๋๋ค.
- ํธ๋๋ถ ๋ํผ๋ฐ์ค
ํธ๋๋ถ ๋ํผ๋ฐ์ค๋ TS ํน์ ๋ถ๋ถ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ํ๋ถํ ์ดํด๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ์์ฑ๋์๋ค. ์์์ ์๋๋ก ์ฝ์ ์ ์์ง๋ง ์ฐ์์ ์ผ๋ก ์ค๋ช ํ๋ ๊ฒ์ด ์๋๋ผ ๊ฐ ์น์ ์ ๋จ์ ๊ฐ๋ ์ ๋ํ ๊น์ ์ค๋ช ์ ๊ณต์ ๋ชฉํ๋ก ํ๋ค.
ํธ๋๋ถ์ ๋ช ์๊ฐ ์์ ํธํ๊ฒ ์ฝ์ ์ ์๋ ๊ฐ๊ฒฐํ ๋ฌธ์๋ก ์ ์๋์๋ค. ๊ฐ๊ฒฐํจ์ ์ ์งํ๊ธฐ ์ํด ํน์ ์ฃผ์ ๋ฅผ ๋ค๋ฃจ์ง ์๋๋ค.
JS ์ ํจ์ ํด๋์ค ํด๋ก์ ์ ๊ฐ์ ํต์ฌ ๊ฐ๋ ์ ์๊ฐํ์ง ์๋๋ค.
ํธ๋๋ถ์ ์ธ์ด ๋ช ์ธ๋ฅผ ๋์ฒดํ๊ธฐ ์ํจ์ด ์๋๋ค. ๋๋ต์ ์ด๊ณ ์ดํดํ๊ธฐ ์ฌ์ด ์ค๋ช ์ ์ํด ์์ง ์ผ์ด์ค๋ ๋์์ ํ์์ ์ธ ์ค๋ช ์ ์๋ตํ ์ ์๋ค.
TS๊ฐ ๋ค๋ฅธ ๋๊ตฌ์ ์ด๋ป๊ฒ ์ํธ์์ฉํ๋์ง ๋ค๋ฃจ์ง ์๋๋ค.
JS๋ ์ฒ์์ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ํ ์คํฌ๋ฆฝํธ ์ธ์ด๋ก ๋ง๋ค์ด์ก๋ค. JS ๊ฐ ์ฒ์ ๋์์ ๋ ์์ญ ์ค ์ด์์ ์ฝ๋ค๋ฅด ์์ฑํ๋ ๊ฒ์ ๋ค์ ์ด๋ก์ ์ธ ์ผ์ด์๊ธฐ ๋๋ฌธ์ ์น ํ์ด์ง ์ ์งง์ ์ฝ๋๋ค์ ์ํด ์ฌ์ฉํ ๊ฒ์ด๋ผ ์ฌ๊ฒจ์ก๋ค.
์น ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์๋ค์ ์์ ๊ฐ์ ๋์ด๋๋ JS ์ฌ์ฉ๋์ ๋ํ์ฌ ์คํ ์์ง์ ์ต์ ํ ์ํค๊ณ ์ต์ ํ ๋ ๊ฒ์ ์ด์ฉํด ํ ์ ์๋ ์ผ์ ํ์ฅํ์ฌ ์น ๊ฐ๋ฐ์๊ฐ ๋ ๋ง์ด JS๋ฅผ ์ฌ์ฉ ๊ฐ๋ฅํ๋๋ก ํ์๋ค.
ํ๋ ์น์ฌ์ดํธ์์๋ ์์ญ๋ง ์ค์ ์ฝ๋๋ก ๊ตฌ์ฑ๋ ์ดํ๋ฆฌ์ผ์ด์ ์ ์์ฃผ ์คํํ๋ค. ์ด๋ ์ ์ ํ์ด์ง์ ๊ฐ๋จํ ๋คํธ์ํฌ๋ก ์์ํด์ ๋ชจ๋ ์ข ๋ฅ์ ๋ง์กฑ์ค๋ฌ์ธ๋งํ ์ดํ๋ฆฌ์ผ์ด์ ์ ์ดํ ํ๋ซํผ์ผ๋ก ์ฑ์ฅํ ์น์ ๊ธธ๊ณ ์ ์ง์ ์ธ ์ฑ์ฅ์ด๋ค.
JS ๋ง์ ์ด์ฉํ์ฌ ์ ์ฒด ์คํ์ ํ๋ก๊ทธ๋๋ฐ ํ๊ณ ์๋ค.
JS ์ ์ฝ๋๊ฐ ๋ง์์ง๋ฉด์ ๋ง์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์๋ค.
- JS ๋์ผ ์ฐ์ฐ์๋ (==) ์ธ์๋ฅผ ๊ฐ์ ๋ก ๋ณํํ์ฌ ์๊ธฐ์น ์์ ๋์์ ์ ๋ฐํ๋ค.
if ("" == 0) {
// true
}
if (1 < x < 3) {
// x ๊ฐ์ ์๊ด์์ด true
}- JS๋ ์กด์ฌํ์ง ์๋ ํ๋กํผํฐ ์ ๊ทผ์ ํ์ฉํ๋ค.
const obj = { width: 10, height: 15 };
// ์คํ
const area = obj.width * obj.heigth;๋๋ถ๋ถ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ ์ด๋ฐ ์ข ๋ฅ์ ์ค๋ฅ๋ค์ด ๋ฐ์ํ๋ฉด ์ค๋ฅ๋ฅผ ํ์ถํ๊ณ ์ฝ๋๊ฐ ์คํ๋๊ธฐ ์ ์ธ ์ปดํ์ผ ์ค์ ์ค๋ฅ๋ฅผ ํ์ถํด์ค๋ค. ์์ ํ๋ก๊ทธ๋จ์ ์์ฑํ ๋์๋ ์ด๋ฐ ์ด์ํ ์ ๋ค์ด ํ๋ฅผ ๋๊ตฌ์ง๋ง ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
๊ทธ๋ฌ๋ ์๋ง์ ์ค์ ์ฝ๋๋ฅผ ์์ฑํ ๋๋ ์ง์์ ์ผ๋ก ๋ฌธ์ ๊ฐ ๋๋ค.
์์ ๋ช ์ธ์ด๋ ๋ฒ๊ทธ๊ฐ ๋ง์ ํ๋ก๊ทธ๋จ์ ์์ ์คํ์ํค์ง ์๋๋ค๊ณ ๋งํ๋ค. ํ๋ก๊ทธ๋จ์ ์คํ์ํค์ง ์์ผ๋ฉด์ ์ค๋ฅ๋ฅผ ๊ฒ์ถํ๋ ๊ฒ์ ์ ์ ๊ฒ์ฌ ๋ผ๊ณ ํ๋ค.
์ด๋ค ๊ฒ์ด ์ค๋ฅ์ธ์ง์ ์ด๋ค ๊ฒ์ด ์ฐ์ฐ ๋๋ ๊ฐ์ ๊ธฐ์ธํ์ง ์์์ ์ ํ๋ ๊ฒ์ด ์ ์ ํ์ ๊ฒ์ฌ ์ด๋ค.
์ ์ ํ์ ๊ฒ์ฌ์์ธ TS๋ ํ๋ก๊ทธ๋จ์ ์คํ์ํค๊ธฐ ์ ์ ๊ฐ์ ์ข ๋ฅ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ก๊ทธ๋จ์ ์ค๋ฅ๋ฅผ ์ฐพ๋๋ค.
// @error: 2551
const obj = { width: 10, hegith: 15};
const area = obj.width * obj.hegiht;ํ์ ์ด ์๋ JS์ ์์ ์งํฉ (A Typed Superset of JS)
TS ๋ JS ์ ์ด๋ค ๊ด๊ณ์ธ๊ฐ.
TS๋ JS์ ๊ตฌ๋ฌธ์ด ํ์ฉ๋๋ JS ์ ์์ ์งํฉ ์ธ์ด์ด๋ค. ๊ตฌ๋ฌธ์ ํ๋ก๊ทธ๋จ์ ๋ง๋ค๊ธฐ ์ํด ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์๋ฏธํ๋ค.
TS๋ ๋ค๋ฅธ ์ข ๋ฅ์ ๊ฐ๋ค์ ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์ถ๊ฐ๋ ํ์ ์ด ์๋ ์์ ์งํฉ์ด๋ค. ์์ obj.height ์ค๋ฅ๋ ๊ตฌ๋ฌธ ์ค๋ฅ๊ฐ ์๋ ๋ค๋ฅธ ๊ฐ์ ์ข ๋ฅ๋ฅผ ์ฌ์ฉํด์ ์๊ธด ์ค๋ฅ์ด๋ค.
console.log(4 / []);๊ตฌ๋ฌธ์ ์ผ๋ก ์ณ์ ์ ์ฝ๋๋ JS ์์๋ NaN ์ ์ถ๋ ฅํ๋ค. ํ์ง๋ง TS ๋ ๋ฐฐ์ด๋ก ์ซ์๋ฅผ ๋๋๋ ์ฐ์ฐ์ด ์ณ์ง ์๋ค๊ณ ํ๋จํ์ฌ ์ค๋ฅ๋ฅผ ๋ฐ์์ํจ๋ค.
// @error: 2363
console.log(4 / []);TS ์ ํ์ ๊ฒ์ฌ์๋ ์ผ๋ฐ์ ์ธ ์ค๋ฅ๋ฅผ ์ต๋ํ ๋ง์ด ๊ฒ์ถํ๋ฉด์ ํ๋ก๊ทธ๋จ์ ๋ง๋ค ์ ์๋๋ก ์ค๊ณ ๋์๋ค.
TS ๋ JS ์ ๋ฐํ์ ํน์ฑ์ ๊ฐ์ง ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ด๋ค. JS ์์ 0์ผ๋ก ๋๋๋ ํ๋์ ๋ฐํ์ ์์ธ๋ก ์ฒ๋ฆฌํ์ง ์๊ณ Infinity ๊ฐ์ ๋ฐํํ๋ค. TS๋ JS ์ฝ๋์ ๋ฐํ์ ํน์ฑ์ ์ ๋ ๋ณํ์ํค์ง ์๋๋ค.
์ฆ TS ๊ฐ ์ฝ๋์ ํ์ ์ค๋ฅ๊ฐ ์์์ ๊ฒ์ถํด๋ JS ์ฝ๋๋ฅผ TS ๋ก ์ด๋์ํค๋ ๊ฒ์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์คํ์ํฌ ๊ฒ์ ๋ณด์ฅํ๋ค.
JS ์ ๋์ผํ ๋ฐํ์ ๋์์ ์ ์งํ๋ ๊ฒ์ ํ๋ก๊ทธ๋จ ์๋์ ์ค๋จ์ํฌ ์ ์๋ ๋ฏธ๋ฌํ ์ฐจ์ด๋ฅผ ๊ฑฑ์ ํ์ง ์๊ณ ๋ ์ธ์ด ๊ฐ์ ์ฝ๊ฒ ์ ํ ๊ฐ๋ฅํ๋๋ก ํ TS์ ๊ธฐ๋ณธ์ ์ธ ์ฝ์์ด๋ค.
๊ฐ๋ต์ ์ผ๋ก TS์ ์ปดํ์ผ๋ฌ๊ฐ ์ฝ๋ ๊ฒ์ฌ๋ฅผ ๋ง์น๋ฉด ํ์ ์ ์ญ์ ํด์ ๊ฒฐ๊ณผ์ ์ผ๋ก ์ปดํ์ผ๋ ์ฝ๋๋ฅผ ๋ง๋ ๋ค. ์ฝ๋๊ฐ ํ ๋ฒ ์ปดํ์ผ ๋๋ฉด ๊ฒฐ๊ณผ๋ก ๋์จ ์ผ๋ฐ JS ์ฝ๋์๋ ํ์ ์ ๋ณด๊ฐ ์๋ค.
ํ์ ์ ๋ณด๊ฐ ์๋ ๊ฒ์ TS ๊ฐ ์ถ๋ก ํ ํ์ ์ ๋ฐ๋ผ ํ๋ก๊ทธ๋จ์ ํน์ฑ์ ๋ณํ์ํค์ง ์๋๋ค๋ ์๋ฏธ๋ค. ์ปดํ์ผ ๋์ค์๋ ํ์ ์ค๋ฅ๊ฐ ํ์ถ๋ ์ ์์ง๋ง ํ์ ์์คํ ์์ฒด๋ ํ๋ก๊ทธ๋จ์ด ์คํ๋ ๋ ์๋ํ๋ ๋ฐฉ์๊ณผ ๊ด๋ จ์ด ์๋ค.
TS ๋ ์ถ๊ฐ ๋ฐํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ณตํ์ง ์๋๋ค. TS ํ๋ก๊ทธ๋จ์ JS ํ๋ก๊ทธ๋จ๊ณผ ๊ฐ์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค.
TS์ JS์ ๊ด๊ณ๋ ๋ค์ ๋ ํนํ๋ค TS๋ JS ์์ ๋ ์ด์ด๋ก์ ์๋ฆฌ์ก๊ณ ์๋๋ฐ JS์ ๊ธฐ๋ฅ๋ค์ ์ ๊ณตํ๋ฉด์ ์์ ์์ฒด ๋ ์ด์ด๋ฅผ ์ถ๊ฐํ๋ค. ์ด ๋ ์ด์ด๊ฐ TS ํ์ ์์คํ ์ด๋ค.
JS๋ ์ด๋ฏธ string, number, object, undefined ์ ๊ฐ์ ์์ ํ์ ์ ๊ฐ์ง๊ณ ์์ง๋ง ์ ์ฒด ์ฝ๋๋ฒ ์ด์ค์ ์ผ๊ด๋๊ฒ ํ ๋น๋์๋์ง ๋ฏธ๋ฆฌ ํ์ธํด ์ฃผ์ง ์๋๋ค.
JS ์ฝ๋๋ ๋์์ TS ์ฝ๋๋ผ๋ ์๋ฏธ์ง๋ง TS์ ํ์ ๊ฒ์ฌ๊ธฐ๋ ์ฌ์ฉ์๊ฐ ์๊ฐํ ์ผ๊ณผ JS๊ฐ ์ค์ ๋ก ํ๋ ์ผ ์ฌ์ด์ ๋ถ์ผ์น๋ฅผ ๊ฐ์กฐํ ์ ์๋ค.
TS๋ JS ์ธ์ด๋ฅผ ์๊ณ ์์ผ๋ฉฐ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ํ์ ์ ์์ฑํด์ค ๊ฒ์ด๋ค. ๋ณ์๋ฅผ ์์ฑํ๋ฉด์ ๋์์ ํน์ ๊ฐ์ ํ ๋นํ๋ ๊ฒฝ์ฐ TS๋ ๊ทธ ๊ฐ์ ํด๋น ๋ณ์์ ํ์ ์ผ๋ก ์ฌ์ฉํ ๊ฒ์ด๋ค.
let HelloWorld = "Hello world";JS๊ฐ ๋์ํ๋ ๋ฐฉ์์ ์ดํดํจ์ผ๋ก์จ TS๋ JS ์ฝ๋๋ฅผ ๋ฐ์๋ค์ด๋ฉด์ ํ์ ์ ๊ฐ์ง๋ ํ์ ์์คํ ์ ๊ตฌ์ถํ ์ ์๋ค. ์ด๋ ์ฝ๋์์ ํ์ ์ ๋ช ์ํ๊ธฐ ์ํด ์ถ๊ฐ๋ก ๋ฌธ์๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์๋ ํ์ ์์คํ ์ ์ ๊ณตํ๋ค. ์ด๊ฒ์ด ์์ ์์ ์์ TS๊ฐ HelloWorld ๊ฐ string ์์ ์๊ฒ ๋๋ ๋ฐฉ์์ด๋ค.
JS๋ ๋ค์ผ์ ๋์์ธ ํจํด์ ๊ฐ๋ฅํ๊ฒ ํ๋ ๋์ ์ธ์ด์ด๋ค. ๋ช๋ช ๋์์ธ ํจํด์ ์๋์ผ๋ก ํ์ ์ ์ ๊ณตํ๊ธฐ ํ๋ค ์ ์๋๋ฐ ์ด๋ฌํ ๊ฒฝ์ฐ TS๋ TS ์๊ฒ ํ์ ์ด ๋ฌด์์ด ๋์ด์ผ ํ๋์ง ๋ช ์ ๊ฐ๋ฅํ JS ์ธ์ด์ ํ์ฅ์ ์ง์ํ๋ค.
- name: string ๊ณผ id: number ์ ํฌํจํ๋ ์ถ๋ก ํ์ ์ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ
- interface ๋ก ๊ฐ์ฒด์ ํํ๋ฅผ ๋ช ์์ ์ผ๋ก ๋ํ๋ธ๋ค.
- ๋ณ์ ๋ค์ : TypeName ๊ตฌ๋ฏ์ ์ฌ์ฉํด JS ๊ฐ์ฒด๊ฐ ์๋ก์ด interface ์ ํํ๋ฅผ ๋ฐ๋ฅด๊ณ ์์์ ์ ์ธ ๊ฐ๋ฅํ๋ค.
interface User {
name: string;
id: number;
}
const user: User = {
name: "Hayes",
id: 0,
}ํด๋น ์ธํฐํ์ด์ค์ ๋ง์ง ์์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ฉด TS๋ ๊ฒฝ๊ณ ๋ฅผ ์ค๋ค.
JS๋ ํด๋์ค์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์ง์ํ๊ธฐ ๋๋ฌธ์ TS ๋ํ ๋์ผํ๋ค. - ์ธํฐํ์ด์ค๋ ํด๋์ค๋ก๋ ์ ์ธ ๊ฐ๋ฅํ๋ค.
interface User {
name: string;
id: number;
}
class UserAccount {
name: string;
id: number;
constructor(name: string, id: number) {
this.name = name;
this.id = id;
}
}
const user: User = new UserAccount("Arthur", 1);์ธํฐํ์ด์ค๋ ํจ์์์ ๋งค๊ฐ๋ณ์์ ๋ฆฌํด ๊ฐ์ ๋ช ์ํ๋๋ฐ ์ฌ์ฉํ๊ธฐ๋ ํ๋ค.
interface User {
name: string;
id: number;
}
// ~~~~~~
function getAdminUser(): User {
// ...
}
function deleteAdminUser(user: User) {
}JS ์์ ์ฌ์ฉํ ์ ์๋ ์์ ํ์ ์ ์ด๋ฏธ ์๋ค. boolean, bigint, null, number, string, symbol, object, undefined
๋ ์ธํฐํ์ด์ค์์ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค. TS ๋ ๋ช ๊ฐ์ง๋ฅผ ์ถ๊ฐํด ๋ชฉ๋ก์ ํ์ฅํ๋ค. ์๋ฅผ ๋ค์ด any, unknown, never, void ๋ฑ์ด ์๋ค.
๊ฐ์ฒด๋ค์ ์กฐํฉํ์ฌ ๋ ํฌ๊ณ ๋ณต์กํ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ๊ณผ ์ ์ฌํ๊ฒ TS์ ํ์ ์ผ๋ก ์ด๋ฅผ ์ํํ๋ ๋๊ตฌ๊ฐ ์๋ค.
์ฌ๋ฌ๊ฐ์ง ํ์ ์ ์ด์ฉํ์ฌ ์ ํ์ ์ ์์ฑํ๊ธฐ ์ํด ์ผ์์ ์ธ ์ฝ๋์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ ๋ ๊ฐ์ง ์ฝ๋๋
Union ๊ณผ Generic ์ด ์๋ค.
- ์ ๋์ธ (Unions) ์ ๋์ธ์ ํ์ ์ด ์ฌ๋ฌ ํ์ ์ค ํ๋์ผ ์ ์์์ ์ ์ธํ๋ ๋ฐฉ๋ฒ์ด๋ค.
type MyBool = true | false;TS๋ ์ฝ๋๊ฐ ์๊ฐ์ ๋ฐ๋ผ ๋ณ์๊ฐ ๋ณ๊ฒฝ๋๋ ๋ฐฉ์์ ์ดํดํ๋ฉฐ ์ด๋ฌํ ๊ฒ์ฌ๋ฅผ ์ฌ์ฉํด ํ์ ์ ๊ณจ๋ผ๋ผ ์ ์๋ค.
typeof s === "string";
Array.isArray(a);TS ์ ๋ค๋ฆญ ์์คํ ์ ๋ํด ์์ธํ ์์๋ณผ ์ ์์ง๋ง, ๊ฐ๋จํ ์ค๋ช ํ๋ฉด ์ ๋ค๋ฆญ์ ํ์ ์ ๋ณ์๋ฅผ ์ ๊ณตํ๋ ๋ฐฉ๋ฒ์ด๋ค.
๋ฐฐ์ด์ด ์ผ๋ฐ์ ์ธ ์์์ด๋ค.
type StringArray = Array<string>;
type NumberArray = Array<number>;
type ObjectWithNameArray = Array<{name: string}>;์ ๋ค๋ฆญ์ ์ฌ์ฉํ๋ ๊ณ ์ ํ์ ์ ์ ์ธํ ์ ์๋ค.
// @errors: 2345
interface Backpack<Type> {
add: (obj: Type) => void;
get: () => Type;
}
// ์ด ์ค์ TS์ 'backpack' ์ด๋ผ๋ ์์๊ฐ ์์์ ์๋ฆฌ๋ ์ง๋ฆ๊ธธ์ด๋ฉฐ
// const backpack: Backpack<string>์ด ์ด๋์ ์๋์ง ๊ฑฑ์ ํ ํ์๊ฐ ์๋ค.
declare const backpack: Backpack<string>;
// ์์์ Backpack์ ๋ณ์ ๋ถ๋ถ์ผ๋ก ์ ์ธํด์, object๋ string ์ด๋ค.
const object = backpack.get();
// backpack ๋ณ์๊ฐ string ์ด๋ฏ๋ก add ํจ์์ number ๋ฅผ ์ ๋ฌํ ์ ์๋ค.
backpack.add(23);TS ์ ํต์ฌ ์์น ์ค ํ๋๋ ํ์ ๊ฒ์ฌ๊ฐ ๊ฐ์ด ์๋ ํํ์ ์ง์คํ๋ค๋ ๊ฒ์ด๋ค. ์ด๋ ๋๋๋ก ๋ ํ์ดํ ๋๋ ๊ตฌ์กฐ์ ํ์ดํ ์ด๋ผ ํ๋ค.
๊ตฌ์กฐ์ ํ์ ์์คํ ์์ ๋ ๊ฐ์ฒด๊ฐ ๊ฐ์ ํํ๋ฅผ ๊ฐ์ง๋ฉด ๊ฐ์ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๋ค.
interface Point {
x: number;
y: number;
}
function printPoint(p: Point) {
console.log(`${p.x}, ${p.y}`);
}
const point = { x: 12, y: 26 };
printPoint(point);point ๋ณ์๋ Point ํ์ ์ผ๋ก ์ ์ธ๋ ์ ์ด ์์ง๋ง TS ํ์ ๊ฒ์ฌ์์ point ์ ํํ์ Point ํํ๋ฅผ ๋น๊ตํ๋ค. ๋ ๋ค ๊ฐ์ ํํ์ด๊ธฐ ๋๋ฌธ์ ํต๊ณผํ๋ค.
ํํ ์ผ์น์๋ ์ผ์น์ํฌ ๊ฐ์ฒด์ ํ๋ ํ์ ์งํฉ๋ง ํ์ํ๋ค.
// @errors: 2345
interface Point {
x: number;
y: number;
}
function printPoint(p: Point) {
console.log(`${p.x}, ${p.y}`);
}
// -- cut --
const point3 = { x:12, y: 24, z:36 };
printPoint(point3); // prints "12 36"
const rect = {x:33, y:3, width:30, height: 30};
printPoint(rect); // prints "33 3"
const color = { hex: "#123123" };
printPoint(color); // Error๊ตฌ์กฐ์ ์ผ๋ก ํด๋์ค์ ๊ฐ์ฒด๊ฐ ํํ๋ฅผ ๋ฐ๋ฅด๋ ๋ฐฉ๋ฒ์๋ ์ฐจ์ด๊ฐ ์๋ค.
TS๋ C#, Java ์ ๊ฐ์ด ์ ์ ํ์ดํ์ ์ฌ์ฉํ๋ ์ธ์ด์ ์ต์ํ ํ๋ก๊ทธ๋๋จธ์๊ฒ ์ธ๊ธฐ ์๋ ์ ํ์ด๋ค.
TS ์ ํ์ ์์คํ ์ ๋ ๋์ ์ฝ๋ ์์ฑ, ์ค๋ฅ์ ์กฐ๊ธฐ ๋ฐ๊ฒฌ, ํ๋ก๊ทธ๋จ ๋ถ๋ถ ๊ฐ์ ๋ ๋ช ํํ ํต์ ๊ณผ ๊ฐ์ด ์ ์ ํ์ดํ์ด ๊ฐ์ง๋ ๋ง์ ์ด์ ์ ์ ๊ณตํ๋ค. TS๋ ์ด๋ฌํ ๊ฐ๋ฐ์์๊ฒ ์น์ํ ๊ธฐ๋ฅ์ ๋ง์ด ์ ๊ณตํ์ง๋ง JS๊ฐ ๊ธฐ์กด์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ์ด๋ค ์ฐจ์ด๊ฐ ์๋์ง ๋ค์ ์ดํด๋ณผ ํ์๊ฐ ์๋ค. ์ด๋ฌํ ์ฐจ์ด์ ์ ์ดํดํ๋ ๊ฒ์ ๋ ๋์ JS ์ฝ๋๋ฅผ ์์ฑํ๋๋ฐ ๋์์ ์ค ๊ฒ์ด๊ณ , C#/JAVA ์์ TS ๋ก ๋ฐ๋ก ์ ๋ฌธํ ํ๋ก๊ทธ๋๋จธ๊ฐ ๊ฒช๋ ํํ ํจ์ ์ ํผํ ์ ์๋ค.
๋ง์ฝ JS์ ์ต์ํ์ง๋ง ์ฃผ๋ก Java C# ์ ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋๋จธ๋ผ๋ฉด ํํ ์ ํ ์ ์๋ ์คํด์ ํจ์ ์ ๋ํ ์ค๋ช ์ด ๋ ๊ฒ์ด๋ค. TS ๋ชจ๋ธ์ด ์ ํํ ํ๋ ๋ฐฉ๋ฒ ์ค ์ผ๋ถ๋ Java ๋ C# ๊ณผ ์๋นํ ๋ค๋ฅด๋ค. TS ํ์ตํ๋ ๋ฐ์ ์์ด ์ด ๋ถ๋ถ์ ์ผ๋ํด ๋๋ ๊ฒ์ด ์ค์ํ๋ค.
JS๋ฅผ ๊ฒฝํํ์ง ์์ ํ๋ก๊ทธ๋๋จธ๋ผ๋ฉด JS ๋ฐํ์ ๋์์ ์ดํดํ๊ธฐ ์ํด ์ฐ์ ์ ์ผ๋ก ํ์ ์ ์ ์ธํ JS ์ผ๋ถ๋ถ์ ๋ฐฐ์ฐ๋ ๊ฒ์ด ์ข๋ค.
TS๋ ์ฝ๋๋ฅผ ์คํํ๋ ๋ฐฉ์์ ๋ฐ๊พธ์ง ์๊ธฐ ๋๋ฌธ์ ์ค์ ๋ก ๋ฌด์ธ๊ฐ ๋์ํ๋ ์ฝ๋๋ฅผ ์์ํ๊ธฐ ์ํด์๋ ์ฌ์ ํ JS๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ๋ฐฐ์์ผ ํ๋ค.
TS๊ฐ JS์ ๋์ผํ ๋ฐํ์์ ์ฌ์ฉํ๋ฏ๋ก ํน์ ํ ๋ฐํ์ ๋์์ ๊ตฌํํ๋ ค๋ ๋ฆฌ์์ค๋ ํญ์ TS ํ๋ก๊ทธ๋จ์ ๋๊ฐ์ด ์ ์ ์ฉ๋๋ค๋ ์ ์ ๊ธฐ์ตํ๋ ๊ฒ์ ๋งค์ฐ ์ค์ํ๋ค. TS์ ํน์ ๋ ๋ฆฌ์์ค์๋ง ์ ํ์ ๋๋ฉด ์๋๋ค.
C# ๊ณผ Java ๋ ์๋ฌด์ OOP ์ธ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. ์ด๋ฌํ ์ธ์ด์์ ํด๋์ค๋ ์ฝ๋ ๊ตฌ์ฑ์ ๊ธฐ๋ณธ ๋จ์์ผ ๋ฟ๋ง ์๋๋ผ ๋ฐํ์ ์ ๋ชจ๋ ๋ฐ์ดํฐ ๊ทธ๋ฆฌ๊ณ ๋์์ ๊ธฐ๋ณธ์ ์ธ ์ปจํ ์ด๋์ด๋ค. ๊ธฐ๋ฅ๊ณผ ๋ฐ์ดํฐ๋ฅผ ์ ๋ถ ํด๋์ค์ ๋ด๋๋ก ๊ฐ์ ํ๋ ๊ฒ์ ์ผ๋ถ ๋ฌธ์ ์ ๋ํด์ ์ข์ ๋๋ฉ์ธ ๋ชจ๋ธ์ด ๋ ์ ์์ง๋ง ๋ชจ๋ ๋๋ฉ์ธ์ด ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ํํ๋ ํ์๋ ์๋ค.
JS์์ ํจ์๋ ์ด๋์๋ ์์ ์ ์๊ณ , ๋ฐ์ดํฐ๋ฅผ ๋ฏธ๋ฆฌ ์ ์ํ class ๋ struct ์ ์ํ์ง ์๊ณ ์์ ๋กญ๊ฒ ์ ๋ฌํ ์ ์๋ค.
์ด๋ฌํ ์ ์ฐ์ฑ์ ๋งค์ฐ ๊ฐ๋ ฅํ๋ค. OOP ๊ณ์ธต๊ณผ ์๊ด ์์ด ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ "์์ ๋ก์ด" ํจ์๋ ํ๋ก๊ทธ๋จ์ JS ๋ก ์์ฑํ๋ ๋ชจ๋ธ๋ก ์ ํธ๋๋ค.
์ถ๊ฐ์ ์ผ๋ก C#๊ณผ Java ์ ์ฑ๊ธํด๊ณผ ์ ์ ํด๋์ค ๊ฐ์ ํน์ ๊ตฌ์กฐ๋ TS์์ ํ์์๋ค.
์ํ๋ค๋ฉด ํด๋์ค๋ฅผ ์ฌ์ฉํด๋ ๋๋ค. ์ผ๋ถ ๋ฌธ์ ๋ ๊ธฐ์กด์ OOP ๊ณ์ธต์ผ๋ก ํด๊ฒฐํ๊ธฐ ์ ํฉํ๋ฉฐ TS๊ฐ JS์ ํด๋์ค๋ฅผ ์ง์ํ๋ฏ๋ก ์ด๋ฌํ ๋ชจ๋ธ์ ๋์ฑ ๋ ํจ๊ณผ์ ์ผ๋ก ๋ง๋ ๋ค. TS๋ ์ธํฐํ์ด์ค, ์์, ์ ์ ๋ฉ์๋ ๊ตฌํ๊ณผ ๊ฐ์ ๋ง์ ์ผ๋ฐ์ ์ธ ํจํด์ ์ง์ํ๋ค.
TS์ ํ์ ์ ๋ํ ์ดํด๋ C#, Java ์ ์๋นํ ๋ค๋ฅด๋ค ๋ช ๊ฐ์ง ์ฐจ์ด์ ์ ์ดํด๋ณด์.
C#, Java ์์ ๋ฐํ์ ํ์ ๊ณผ ํด๋น ์ปดํ์ผ ํ์ ์ ์ธ ์ฌ์ด์ ์ผ๋์ผ ๋์๊ด๊ณ๋ ์ค์ํ๋ค. TS ์์ ํ์ ์ ๊ณตํต์ ๋ฌด์ธ๊ฐ๋ฅผ ๊ณต์ ํ๋ ๊ฐ์ ์งํฉ์ผ๋ก ์๊ฐํ๋ ๊ฒ์ด ์ข๋ค. ํ์ ์ ์งํฉ์ ๋ถ๊ณผํ๊ธฐ ๋๋ฌธ์ ํน์ ํ ๊ฐ์ ๋์์ ์๋ง์ ์งํฉ์ ์ํ ์ ์๋ค.
ํ์ ์ ์งํฉ์ผ๋ก ์๊ฐํ๊ธฐ ์์ํ๋ฉด ํน์ ์ฐ์ฐ์ด ๋งค์ฐ ์์ฐ์ค๋ฌ์์ง๋ค. C# ์์๋ string ๊ณผ int ๋ ๋ค ๊ฐ๋ฅํ ํ์ ์ด ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ ์ด ๊ฐ์ ์ธ์๋ก ์ ๋ฌํ๋ ๊ฒ์ ์ด์ํ๋ค.
TS์์ ๋ชจ๋ ํ์ ์ด ๋จ์ํ ์งํฉ์ด๋ผ๋ ๊ฒ์ ๊นจ๋ซ๋ ์๊ฐ ์ด๋ ๋งค์ฐ ์์ฐ์ค๋ฌ์์ง๋ค. string ์งํฉ ๋๋ number ์งํฉ์ ์ํ ์ ์๋ ๊ฐ์ ์ด๋ป๊ฒ ์ค๋ช ํ ๊ฒ์ธ๊ฐ.
๋จ์ํ ์ ๋์ธ์ผ๋ก ํํ ๊ฐ๋ฅํ๋ค. 'string' | 'union'
TS๋ ์งํฉ๋ก ์ ์๊ฑฐํด ํ์ ์ ์ด์ฉํ๋ ์ฌ๋ฌ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ฉฐ ํ์ ์ ์งํฉ์ผ๋ก ์๊ฐํ๋ ๊ฒ์ด ๋ ์ง๊ด์ ์ด๋ค.
TS ์์ ๊ฐ์ฒด๋ ์ ํํ ๋จ์ผ ํ์ ์ด ์๋๋ค. ์ธํฐํ์ด์ค๋ฅผ ๋ง์กฑํ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋. ๋ ์ฌ์ด์ ์ ์ธ์ ์ธ ๊ด๊ณ๊ฐ ์๋๋ผ๋ ์ธํฐํ์ด์ค๊ฐ ์์๋๋ ๊ณณ์ ํด๋น ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
interface PointLike {
x: number;
y: number;
}
interface Named {
name: string;
}
function printPoint(point: PointLike) {
console.log(`x ${point.x}, y ${point.y}`);
}
function printName(x: Named) {
console.log(`Hello ${x.name}`);
}
const obj = {
x: 0,
y: 1,
name: "Origin"
};
printName(obj);
printPoint(obj);TS ํ์ ์์คํ ์ ๋ช ๋ชฉ์ด ์๋ ๊ตฌ์กฐ์ ์ด๋ค. obj ๋ ์ซ์์ธ x,y ํ๋กํผํฐ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก PointLike ๋ก์จ ์ฌ์ฉ๋ ์ ์๋ค. ํ์ ๊ฐ์ ๊ด๊ณ๋ ํน์ ๊ด๊ณ๋ก ์ ์ธ๋์๋์ง๊ฐ ์๋, ํฌํจ๋ ํ๋กํผํฐ์ ์ํด ๊ฒฐ์ ๋๋ค.
TS์ ํ์ ์์คํ ์ ๋ํ ๊ตฌ์ฒดํ๋์ง ์์๋ค. ๋ฐํ์์ obj ๊ฐ PointLike ์์ ์๋ ค์ฃผ์ง ์์๋ค. ์ฌ์ค PointLike ํ์ ์ ๋ฐํ๋ฏธ์ ์ด๋ค ํํ๋ก๋ ์กด์ฌํ์ง ์๋๋ค.
์งํฉ์ผ๋ก์ ํ์ ๊ฐ๋ ์ผ๋ก ๋ณด๋ฉด obj๋ฅผ PointLike ๊ฐ ์งํฉ์ด๋ Named ๊ฐ ์งํฉ์ ๋ฉค๋ฒ๋ก ๊ฐ์ฃผํ ์ ์๋ค.
๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋จธ๋ ์ข ์ข ๊ตฌ์กฐ์ ํ์ ํ์ ๋ ๊ฐ์ง ์ธก๋ฉด์ ๋๋ผ๊ณค ํ๋ค.
์ฒซ ๋ฒ์งธ๋ก ๋น ํ์ ์ ์์์ ๋ฌด์ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค.
class Empty {};
function fn(arg: Empty) {
// some
}
// isEmpty???
fn({k: 10});TS๋ ์ฃผ์ด์ง ์ธ์๊ฐ ์ ํจํ Empty ์ธ์ง ํ์ธํ์ฌ fn ์ ํธ์ถ์ด ์ ํจํ์ง๋ฅผ ๊ฒ์ฌํ๋ค. Empty ์ ํ๋กํผํฐ๊ฐ ์์ผ๋ฏ๋ก Empty ๊ฐ ์ํํ๋ ๋ชจ๋ ํ๋กํผํฐ๊ฐ ์ํด์๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ ํจํ ํธ์ถ์ด๋ค.
๋๋์ง๋ง ์ต์ข ์ ์ผ๋ก ๋ช ๋ชฉ์ ์ธ ๊ฐ์ฒด์งํฅํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋งค์ฐ ๋น์ทํ๊ฒ ์ฌ์ฉ๋๋ค. ํ์ ํด๋์ค์ ํ์ ํด๋์ค์ ๊ธฐ๋ณธ ์ฌ์ด์ ์์ฐ์ค๋ฌ์ด ํ์ ํ์ ๊ด๊ณ๊ฐ ํ๊ดด๋๊ธฐ ๋๋ฌธ์ ํ์ ํด๋์จ๋ ์ญ์ ํ ์ ์๋ค.
๊ตฌ์กฐ์ ํ์ ์์คํ ์ ํธํ ๊ฐ๋ฅํ ์ ํ์ ์์ฑ์ ๊ฐ๋ ์ธก๋ฉด์์ ํ์ ํ์ ์ ์ค๋ช ํ๋ฏ๋ก ๊ด๊ณ๋ฅผ ์์์ ์ผ๋ก ๊ตฌ๋ณํ๋ค.
class Car {
drive() {
// ~~
}
};
class Golfer {
drive() {
// ~~
}
}
// No error?
let w: Car = new Golfer();์ค๋ฅ๊ฐ ์๋ ์ด์ ๋ ํด๋์ค์ ๊ตฌ์กฐ๊ฐ ๋์ผํ๊ธฐ ๋๋ฌธ์ด๋ค.
๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋จธ๋ ์ ๋ค๋ฆญ์ ํฌํจํ์ฌ ์ด๋ค ๊ฐ์ ์ ํ์ด๋ผ๊ณ ๋ค๋ฅผ์ ์์์ด ์ต์ํ๋ค.