# ๐ Item01 ~ 05
# Item01. ํ์ ์คํฌ๋ฆฝํธ์ ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ด๊ณ ์ดํดํ๊ธฐ
- ๋ฌธ๋ฒ์ ์ ํจ์ฑ๊ณผ ๋์์ ์ด์๋ ๋ ๋ฆฝ์ ์ธ ๋ฌธ์ ์ด๋ค.
- ํ์
์คํฌ๋ฆฝํธ๋ ํ์
๊ตฌ๋ฌธ์ ํตํด์ ์ค๋ฅ์ ์์ธ์ ์ถ์ธกํ๋๋ฐ ํฐ ๋์์ ์ค๋ค.
- ์ค๋ฅ๊ฐ ์ด๋์์ ๋ฐ์ํ๋์ง ์ฐพ์ ์ ์๊ณ , ํด๊ฒฐ์ฑ ๋ ์ ์ํด์ฃผ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
- ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ ํ์ ์คํฌ๋ฆฝํธ์ด์ง๋ง, ์ผ๋ถ ์๋ฐ์คํฌ๋ฆฝํธ(๊ทธ๋ฆฌ๊ณ ํ์ ์คํฌ๋ฆฝํธ)๋ ์ฒดํฌ๋ฅผ ํต๊ณผํ๋ค.
- ํ์ ์คํฌ๋ฆฝํธ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๊ทผ๋ณธ ์์ธ์ ํ์ ์คํฌ๋ฆฝํธ๊ฐ ์ดํดํ๋ ๊ฐ์ ํ์ ๊ณผ ์ค์ ๊ฐ์ ์ฐจ์ด๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.
# Item02. ํ์ ์คํฌ๋ฆฝํธ ์ค์ ์ดํดํ๊ธฐ
noImplicitAny
- ๋ณ์๋ค์ด ๋ฏธ๋ฆฌ ์ ์๋ ํ์ ์ ๊ฐ์ ธ์ผ ํ๋์ง ์ฌ๋ถ๋ฅผ ์ ์ด
- ์ด ์ต์
์ด ์ค์ ๋์๋ค๋ฉด ๋ช
์์ ์ผ๋ก
: any
๋ผ๊ณ ์ ์ธํด ์ฃผ๊ฑฐ๋ ๋ ๋ถ๋ช ํ ํ์ ์ ์ฌ์ฉํ๋ฉด ๋๋ค. - ํ์
์คํฌ๋ฆฝํธ๋ ํ์
์ ๋ณด๋ฅผ ๊ฐ์ง ๋ ๊ฐ์ฅ ํจ๊ณผ์ ์ด๊ธฐ ๋๋ฌธ์ ๋๋๋ก์ด๋ฉด ์ด ์ต์
์
true
๋ก ์ค์ ํด์ผ ํ๋ค.
strictNullChecks
null
,undefined
๊ฐ ๋ชจ๋ ํ์ ์์ ํ์ฉ๋๋์ง ํ์ธํ๋ ์ค์ - ๋ง์ฝ
null
์ ํ์ฉํ๋ ค๊ณ ํ๋ค๋ฉด, ์๋๋ฅผ ๋ช ์์ ์ผ๋ก ๋๋ฌ๋์ผ๋ก์จ ์ค๋ฅ๋ฅผ ๊ณ ์น ์ ์๋ค.
const x: number | null = null;
- ๋ง์ฝ
null
์ ํ์ฉํ์ง ์์ผ๋ ค๋ฉด, ์ด ๊ฐ์ด ์ด๋์๋ถํฐ ์๋์ง ์ฐพ์์ผ ํ๊ณ ,null
์ ์ฒดํฌํ๋ ์ฝ๋๋ ๋จ์ธ๋ฌธ(assertion)์ ์ถ๊ฐํด์ผ ํ๋ค.
const el = document.getElementById('status'); el.textContent = 'Ready'; // ~~ ๊ฐ์ฒด๊ฐ 'null'์ธ ๊ฒ ๊ฐ์ต๋๋ค. if (el) { el.textContent = 'Ready'; // null์ ์ ์ธ๋จ } el!.textContent = 'Ready'; // el์ด null์ด ์๋์ ๋จ์ธ
- ์ด ์ต์
์
null
,undefined
๊ด๋ จ๋ ์ค๋ฅ๋ฅผ ์ก์ ๋ด๋ ๋ฐ ๋ง์ ๋์์ด ๋์ง๋ง, ์ฝ๋ ์์ฑ์ ์ด๋ ต๊ฒ ํ๋ค. - ์ด ์ต์
์ ์ค์ ์์ด ๊ฐ๋ฐํ๊ธฐ๋ก ์ ํํ๋ค๋ฉด
"undefined"๋ ๊ฐ์ฒด๊ฐ ์๋๋๋ค
๋ผ๋ ๋ฐํ์ ์ค๋ฅ๋ฅผ ์ฃผ์ํด์ผ ํ๋ค. ๊ฒฐ๊ตญ์ ์ด ์ค๋ฅ ๋๋ฌธ์ ์๊ฒฉํ ์ฒดํฌ๋ฅผ ์ค์ ํ ์๋ฐ์ ์๋ค. - ๊ทธ๋์ ํ๋ก์ ํธ๊ฐ ๊ฑฐ๋ํด์ง๊ธฐ ์ ์ ์ด๋ฐ์ ์ค์ ํ๋ ๊ฒ์ด ์ข๋ค.
# Item03. ์ฝ๋ ์์ฑ๊ณผ ํ์ ์ด ๊ด๊ณ์์์ ์ดํดํ๊ธฐ
- ํ์
์คํฌ๋ฆฝํธ ์ปดํ์ผ๋ฌ์ ์ญํ
- ์ต์ TS/JS๋ฅผ ๋ธ๋ผ์ฐ์ ์์ ๋์ํ ์ ์๋๋ก ๊ตฌ๋ฒ์ ์ JS๋ก ํธ๋์คํ์ผํจ
- ์ฝ๋์ ํ์ ์ค๋ฅ๋ฅผ ์ฒดํฌํจ
# โญ๏ธ ํ์ ์ค๋ฅ๊ฐ ์๋ ์ฝ๋๋ ์ปดํ์ผ์ด ๊ฐ๋ฅํ๋ค
- ์ปดํ์ผ์ ํ์
์ฒดํฌ์ ๋
๋ฆฝ์ ์ผ๋ก ๋์ํ๊ธฐ ๋๋ฌธ์, ํ์
์ค๋ฅ๊ฐ ์๋ ์ฝ๋๋ ์ปดํ์ผ์ด ๊ฐ๋ฅํ๋ค.
- ๋ฌธ์ ๊ฐ ๋ ๋งํ ๋ถ๋ถ์ ์๋ ค ์ฃผ์ง๋ง, ๊ทธ๋ ๋ค๊ณ ๋น๋๋ฅผ ๋ฉ์ถ์ง๋ ์๋๋ค.
- ๋ง์ฝ ์ค๋ฅ๊ฐ ์์ ๋ ์ปดํ์ผํ์ง ์์ผ๋ ค๋ฉด,
tsconfig.json
์noEmitOnError
์ต์ ์ ์ค์ ํ๊ฑฐ๋ ๋น๋ ๋๊ตฌ์ ๋์ผํ๊ฒ ์ ์ฉํ๋ฉด ๋๋ค.
# โญ๏ธ ๋ฐํ์์๋ ํ์ ์ฒดํฌ๊ฐ ๋ถ๊ฐ๋ฅํ๋ค
- ์ค์ ๋ก ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์ปดํ์ผ๋๋ ๊ณผ์ ์์ ๋ชจ๋ ์ธํฐํ์ด์ค, ํ์ , ํ์ ๊ตฌ๋ฌธ์ ๊ทธ๋ฅ ์ ๊ฑฐ๋์ด ๋ฒ๋ฆฐ๋ค.
- ๋ฐํ์ ์์ ์ ํ์
์ ๋ณด๋ฅผ ์ ์งํ๋ ๋ฐฉ๋ฒ
instanceof
๋์ ์ ํน์ ์์ฑ์ด ์กด์ฌํ๋์งin
์ ํตํด ํ์ธ- ๋ฐํ์์ ์ ๊ทผ ๊ฐ๋ฅํ ํ์ ์ ๋ณด๋ฅผ ๋ช ์์ ์ผ๋ก ์ ์ฅํ๋ 'ํ๊ทธ' ๊ธฐ๋ฒ
- ํ์
(๋ฐํ์ ์ ๊ทผ ๋ถ๊ฐ)๊ณผ ๊ฐ(๋ฐํ์ ์ ๊ทผ ๊ฐ๋ฅ)์ ๋ ๋ค ์ฌ์ฉํ๋ ๊ธฐ๋ฒ
- ์ธํฐํ์ด์ค๋ ํ์ ์ผ๋ก๋ง ์ฌ์ฉ ๊ฐ๋ฅํ์ง๋ง, ํด๋์ค๋ ํ์ ๊ณผ ๊ฐ์ผ๋ก ๋ชจ๋ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
# โญ๏ธ ํ์ ์ฐ์ฐ์ ๋ฐํ์์ ์ํฅ์ ์ฃผ์ง ์๋๋ค
function asNumber(val: number | string): number {
return val as number;
}
function asNumber(val) {
return val;
}
- ์ ์์๋
string
๋๋number
ํ์ ์ธ ๊ฐ์ ํญ์nubmer
๋ก ์ ์ ํ๋ ์ฝ๋์ด๋ค.- ๋ณํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ๋ณด๋ฉด ์ฝ๋์ ์๋ฌด๋ฐ ์ ์ ๊ณผ์ ์ด ์๋ค.
as number
๋ ํ์ ์ฐ์ฐ์ด๊ณ ๋ฐํ์ ๋์์๋ ์๋ฌด๋ฐ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ค.- ๊ทธ๋์ ๊ฐ์ ์ ์ ํ๊ธฐ ์ํด์๋ ๋ฐํ์์ ํ์ ์ ์ฒดํฌํด์ผ ํ๊ณ ์๋ฐ์คํฌ๋ฆฝํธ ์ฐ์ฐ์ ํตํด ๋ณํ์ ์ํํด์ผ ํ๋ค.
function asNumber(val: number | string): number {
return typeof(val) === 'string' ? Number(val) : val;
}
# โญ๏ธ ๋ฐํ์ ํ์ ์ ์ ์ธ๋ ํ์ ๊ณผ ๋ค๋ฅผ ์ ์๋ค
- ์๋ ์ฝ๋์์ ๋ง์ง๋ง์
console.log
๊น์ง ์คํ๋ ์ ์๋์ง ์๊ฐํด๋ณด์.
function setLightSwitch(value: boolean) {
switch (value) {
case true:
turnLightOn();
break;
case false:
turnLightOff();
break;
default:
console.log('์คํ๋์ง ์์๊น ๋ด ๊ฑฑ์ ๋ฉ๋๋ค.');
}
}
interface LightApiResponse {
lightSwitchValue: boolean;
}
async function setLight() {
const response = await fetch('/light');
const result: LightApiResponse = await response.json();
setLightSwitch(result.lightSwitchValue);
}
setLightSwitch
ํจ์์ ์ธ์์: boolean
์ด๋ผ๋ ํ์ ์ ์ธ๋ฌธ์ด ์๋๋ฐ ์ด๋ ๋ฐํ์์ ์ ๊ฑฐ๋๋ค.- ์๋ฐ์คํฌ๋ฆฝํธ์๋ค๋ฉด ์ค์๋ก
string
๊ฐ์ผ๋ก ํธ์ถํ ์๋ ์์์ ๊ฒ์ด๋ค. - ๋ฌผ๋ก ํ์
์คํฌ๋ฆฝํธ์์๋ API๋ฅผ ์๋ชป ํ์
ํด์
lightSwitchValue
๊ฐ ์ค์ ๋ก ๋ฌธ์์ด์ด์๋ค๋ฉด, ๋ฐํ์์๋setLightSwitch
ํจ์๊น์ง ์ ๋ฌ๋ ๊ฒ์ด๋ค. - ๋๋ ๋ฐฐํฌ๋ ํ์ API๊ฐ ๋ณ๊ฒฝ๋์ด
lightSwitchValue
๊ฐ ๋ฌธ์์ด์ด ๋๋ ๊ฒฝ์ฐ๋ ์๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ์๋ค๋ฉด ์ค์๋ก
- ์ด์ ๊ฐ์ด ํ์
์คํฌ๋ฆฝํธ์์๋ ๋ฐํ์ ํ์
๊ณผ ์ ์ธ๋ ํ์
์ด ๋ง์ง ์์ ์ ์๋ค.
- ํ์ ์ด ๋ฌ๋ผ์ง๋ ํผ๋์ค๋ฌ์ด ์ํฉ์ ๊ฐ๋ฅํ ํ ํผํด์ผ ํ๋ค.
- ์ ์ธ๋ ํ์ ์ด ์ธ์ ๋ ์ง ๋ฌ๋ผ์ง ์ ์๋ค๋ ๊ฒ์ ๋ช ์ฌํด์ผ ํ๋ค.
# โญ๏ธ ํ์ ์คํฌ๋ฆฝํธ ํ์ ์ผ๋ก๋ ํจ์๋ฅผ ์ค๋ฒ๋ก๋ํ ์ ์๋ค
ํจ์ ์ค๋ฒ๋ก๋ฉ
// ์๋ ๋ ํจ์๋ ์ค๋ณต๋ ํจ์ ๊ตฌํ์ด๋ค. function add(a: number, b: number) { return a + b; } function add(a: string, b: string) { return a + b; }
- ๋์ผํ ์ด๋ฅด๋ฉ ๋งค๊ฐ๋ณ์๋ง ๋ค๋ฅธ ์ฌ๋ฌ ๋ฒ์ ์ ํจ์๋ฅผ ํ์ฉ
- ๊ทธ๋ฌ๋ ํ์ ์คํฌ๋ฆฝํธ์์๋ ํ์ ๊ณผ ๋ฐํ์์ ๋์์ด ๋ฌด๊ดํ๋ฏ๋ก ํจ์ ์ค๋ฒ๋ก๋ฉ์ ๋ถ๊ฐ๋ฅํ๋ค.
ํ์ ์คํฌ๋ฆฝํธ๊ฐ ํจ์ ์ค๋ฒ๋ก๋ฉ ๊ธฐ๋ฅ์ ์ง์ํ๊ธฐ๋ ํ์ง๋ง, ์จ์ ํ ํ์ ์์ค์์๋ง ๋์ํ๋ค.
- ํ๋์ ํจ์์ ๋ํด ์ฌ๋ฌ ๊ฐ์ ์ ์ธ๋ฌธ์ ์์ฑํ ์ ์์ง๋ง, ๊ตฌํ์ฒด๋ ์ค์ง ํ๋๋ฟ์ด๋ค.
- ํ์ ์คํฌ๋ฆฝํธ์์ ํจ์ ์ค๋ฒ๋ก๋ฉ ๊ธฐ๋ฅ์ ๋์ํ๊ฒ ํ๋ ค๋ฉด ์ค๋ฒ๋กํ ํ์ ๋ณด๋ค๋ ์กฐ๊ฑด๋ถ ํ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
# โญ๏ธ ํ์ ์คํฌ๋ฆฝํธ ํ์ ์ ๋ฐํ์ ์ฑ๋ฅ์ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
- ํ์
๊ณผ ํ์
์ฐ์ฐ์๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ณํ ์์ ์ ์ ๊ฑฐ๋๊ธฐ ๋๋ฌธ์, ๋ฐํ์์ ์ฑ๋ฅ์ ์๋ฌด๋ฐ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
- ํ์ ์คํฌ๋ฆฝํธ์ ์ ์ ํ์ ์ ์ค์ ๋ก ๋น์ฉ์ด ์ ํ ๋ค์ง ์๋๋ค.
# Item04. ๊ตฌ์กฐ์ ํ์ดํ์ ์ต์ํด์ง๊ธฐ
๋ ํ์ดํ(Duck Typing)
- ๊ฐ์ฒด๊ฐ ์ด๋ค ํ์ ์ ๋ถํฉํ๋ ๋ณ์์ ๋ฉ์๋๋ฅผ ๊ฐ์ง ๊ฒฝ์ฐ ๊ฐ์ฒด๋ฅผ ํด๋น ํ์ ์ ์ํ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๋ ๋ฐฉ์
- ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ณธ์ง์ ์ผ๋ก ๋ ํ์ดํ ๊ธฐ๋ฐ์ด๋ค.
ํ์ ์คํฌ๋ฆฝํธ๋ ๊ตฌ์กฐ์ ํ์ดํ(๋ ํ์ดํ) ๊ธฐ๋ฐ์ธ๋ฐ ์ด ๋๋ฌธ์ ๊ฐ์ ์ธ๋ฐํ๊ฒ ๊ตฌ๋ถํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
- ๊ทธ๋์ ๊ฐ์ ๊ตฌ๋ถํ๊ธฐ ์ํด ๊ณต์ ๋ช ์นญ์ด ํ์ํ๋ค๋ฉด ์ํ๋ฅผ ๋ถ์ด๋ ๊ฒ์ ๊ณ ๋ คํด์ผ ํ๋ค.
ํ์ ์ด ์ด๋ ค์๋ค
- ํ์ ์ ํ์ฅ์ ์ด๋ ค ์๋ค๋ ์๋ฏธ
- ์ฆ, ํ์ ์ ์ ์ธ๋ ์์ฑ ์ธ์ ์์์ ์์ฑ์ ์ถ๊ฐํ๋๋ผ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๋๋ค๋ ๊ฒ
ํ์ ์คํฌ๋ฆฝํธ ํ์ ์์คํ ์์ ํ์ ์ ์ด๋ ค์๋๋ฐ ์ด๋ฌํ ํน์ฑ ๋๋ฌธ์ ๊ฐ๋ ๋นํฉ์ค๋ฌ์ด ๊ฒฐ๊ณผ๊ฐ ๋ฐ์ํ๋ค.
interface Vector3D {
x: number;
y: number;
z: number;
}
function calculateLengthL1(v: Vector3D) {
let length = 0;
for (const axis of Object.keys(v)) {
const coord = v[axis]; // 'string'์ 'Vector3D'์ ์ธ๋ฑ์ค๋ก ์ฌ์ฉํ ์ ์๊ธฐ์ ์๋ฆฌ๋จผํธ๋ ์์์ ์ผ๋ก 'any' ํ์
์
๋๋ค.
length += Math.abs(coord);
}
return length;
}
- ์์ ๊ฐ์ ๊ฒฝ์ฐ
axis
๋Vector3D
ํ์ ์ธv
์ ํค ์ค ํ๋์ด๊ธฐ ๋๋ฌธ์x
,y
,z
์ค ํ๋์ฌ์ผ ํ๋ค.- ๊ทธ๋ฆฌ๊ณ
Vector3D
์ ์ ์ธ์ ๋ฐ๋ฅด๋ฉด ์ด๋ค์ ๋ชจ๋number
์ด๋ฏ๋กcoord
์ ํ์ ์ดnumber
๊ฐ ๋์ด์ผ ํ ๊ฒ์ผ๋ก ์์๋์ง๋ง ์์ ๊ฐ์ด ์ค๋ฅ๊ฐ ๋จ๋ ๊ฒ์ด ๋ง๋ค. v
๋ ์ด๋ค ์์ฑ์ด๋ ๊ฐ์ง ์ ์๊ธฐ ๋๋ฌธ์axis
์ ํ์ ์string
์ด ๋ ์๋ ์๋ค.- ์ ํํ ํ์ ์ผ๋ก ๊ฐ์ฒด๋ฅผ ์ํํ๋ ๊ฒ์ ๊น๋ค๋ก์ด ๋ฌธ์ ์ด๋ค.
- ๊ทธ๋์ ๋ฃจํ๋ณด๋ค๋ ๋ชจ๋ ์์ฑ์ ๊ฐ๊ฐ ๋ํ๋ ๊ตฌํ์ด ๋ ๋ซ๋ค.
- ๊ทธ๋ฆฌ๊ณ
function calculateLengthL1(v: Vector3D) {
return Math.abs(v.x) + Math.abs(v.y) + Math.abs(v.z);
}
# Item05. any
ํ์
์ง์ํ๊ธฐ
any
ํ์ ์๋ ํ์ ์์ ์ฑ์ด ์๋ค.any
๋ ํจ์ ์๊ทธ๋์ฒ๋ฅผ ๋ฌด์ํด ๋ฒ๋ฆฐ๋ค.- ํธ์ถํ๋ ์ชฝ์ ์ฝ์๋ ํ์ ์ ์ ๋ ฅ์ ์ ๊ณตํ๊ณ , ํจ์๋ ์ฝ์๋ ํ์ ์ ์ถ๋ ฅ์ ๋ฐํํ๋ค.
- ๊ทธ๋ฌ๋
any
ํ์ ์ ์ฌ์ฉํ๋ฉด ์ด๋ฌํ ์ฝ์์ ์ด๊ธธ ์ ์๋ค.
any
ํ์ ์๋ ์ธ์ด ์๋น์ค๊ฐ ์ ์ฉ๋์ง ์๋๋ค.- ์ด๋ค ์ฌ๋ฒ์ ํ์ ์ด ์๋ค๋ฉด ํ์ ์คํฌ๋ฆฝํธ ์ธ์ด ์๋น์ค๋ ์๋์์ฑ ๊ธฐ๋ฅ๊ณผ ์ ์ ํ ๋์๋ง์ ์ ๊ณตํ๋ค.
- ๊ทธ๋ฌ๋
any
ํ์ ์ธ ์ฌ๋ฒ์ ์ฌ์ฉํ๋ฉด ์๋ฌด๋ฐ ๋์์ ๋ฐ์ง ๋ชปํ๋ค.
any
ํ์ ์ ์ฝ๋ ๋ฆฌํฉํ ๋ง ๋ ๋ฒ๊ทธ๋ฅผ ๊ฐ์ถ๋ค.any
๋ ํ์ ์ค๊ณ๋ฅผ ๊ฐ์ถฐ๋ฒ๋ฆฐ๋ค.any
ํ์ ์ ์ฌ์ฉํ๋ฉด ํ์ ์ค๊ณ๊ฐ ๋ถ๋ถ๋ช ํด์ง๋ค.- ์ค๊ณ๊ฐ ์ ๋์๋์ง, ์ค๊ณ๊ฐ ์ด๋ป๊ฒ ๋์ด ์๋์ง ์ ํ ์ ์ ์๋ค.
- ์ค๊ณ๊ฐ ๋ช ํํ ๋ณด์ด๋๋ก ํ์ ์ ์ผ์ผ์ด ์์ฑํ๋ ๊ฒ์ด ์ข๋ค.
any
๋ ํ์ ์์คํ ์ ์ ๋ขฐ๋๋ฅผ ๋จ์ด๋จ๋ฆฐ๋ค.