ํ์ ์ ์ฐ๋๋ฐ์ ์ค๋ ฅ์ ํธ์ฐจ๊ฐ ํฌ๊ฒ ๋ํ๋๋ค. ์ง๋ ๋ฅ์คํฐ์ฆ ํ๋ ํ๊ธฐ์ ์ ์๋ ๋ฌธ์ฅ์ด๋ค. ์ด๋ ต๊ฒ ๋ง ํ์ ์ ์ด๋ฆฌ์ ๋ฆฌ ์ฐ๊ณ ์ด๋ฐ๋ฌธ์ ๊ฐ ์๋๋ค. ์ค๋ซ๋์ ๋๋๋๋ค ๋ฐ๊ฒฌํ ๋ฐฉ๋ฒ์ด ์๊ณ ๋ณด๋ฉด ๊ต์ฅํ ๊ธฐ๋ณธ์ ์ธ ํ์ ๋ฌธ๋ฒ์ด์๋ ๊ฒฝ์ฐ๊ฐ ๊ฝค ์์๋ค. ์ด๋ ๊ฒ ์ผ๋ ๋ฒ๋ ๊ฐ๋ฐํด์จ ํ๊ท์ง์ ์ํ ํ์ ์คํฌ๋ฆฝํธ ๋ฟ์๊ธฐ ์คํฐ๋.
ํ์ ์ดํดํ๊ธฐ
์๋ฐ์คํฌ๋ฆฝํธ์ ๋ชจ๋ ๊ฐ์ ๋ฐ์ดํฐ ํ์ ์ ๊ฐ๋๋ค. ๊ฐ์ ์ ์ฅํ ๋ ํ๋ณดํด์ผ ํ๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํฌ๊ธฐ๋ฅผ ๊ฒฐ์ ํ๊ธฐ ์ํด, ๊ฐ์ ์ฐธ์กฐํ ๋ ํ ๋ฒ์ ์ฝ์ด ๋ค์ฌ์ผ ํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํฌ๊ธฐ๋ฅผ ๊ฒฐ์ ํ๊ธฐ ์ํด, ๋ฉ๋ชจ๋ฆฌ์์ ์ฝ์ด ๋ค์ธ 2์ง์๋ฅผ ์ด๋ป๊ฒ ํด์ํ ์ง ๊ฒฐ์ ํ๊ธฐ ์ํด.
ํ์ง๋ง ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ ์ ํ์ ์ด ์๋ ๋์ ํ์ ์ธ์ด์ด๋ค. ๋ณ์๋ฅผ ์ ์ธํ ๋ ๋ฐ์ดํฐ์ ํ์ ์ ์ฌ์ ์ ์ ์ธํ๋ ๊ฒ์ด ์๋๋ค. ์ด๋ค ๋ฐ์ดํฐ ํ์ ์ ๊ฐ์ด๋ผ๋ ์์ ๋กญ๊ฒ ํ ๋นํ ์ ์๋ค.
var foo;
console.log(typeof foo); // undefined
foo = 3;
console.log(typeof foo); // number
foo = 'hello;
console.log(typeof foo); // string
์๋ฐ์คํฌ๋ฆฝํธ์ ๋ณ์๋ ์ ์ธ์ด ์๋ ํ ๋น์ ์ํด ํ์ ์ด ๊ฒฐ์ (ํ์ ์ถ๋ก )๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌํ ๋น์ ์ํด ๋ณ์์ ํ์ ์ ์ธ์ ๋ ์ง ๋์ ์ผ๋ก ๋ณํ ์ ์๋ค. ์ด๋ฌํ ํน์ง์ ๋์ ํ์ดํ์ด๋ผ ํ๋ค.
๋์ ํ์ ์ธ์ด๋ ๋ณ์์ ์ด๋ค ๋ฐ์ดํฐ ํ์ ์ ๊ฐ์ด๋๋ผ๋ ์์ ๋กญ๊ฒ ํ ๋นํ ์ ์๋ค. ๋ฐ๋ก ๊ทธ ๋ถ๋ถ์์ ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ตฌ์กฐ์ ์ธ ๋จ์ ์ด ๋ํ๋๋ค. ๋ณํํ๋ ๋ณ์ ๊ฐ์ ์ถ์ ํ๊ธฐ ์ด๋ ค์ธ ์ ์๋ค. ๊ฐ์ ๋ณ๊ฒฝ์ ์ํด ํ์ ๋ ์ธ์ ๋ ์ง ๋ณ๊ฒฝ๋ ์ ์๋ค. ๋ฐ๋ผ์ ๊ฐ์ ํ์ธํ๊ธฐ ์ ์๋ ํ์ ์ ํ์ ํ ์ ์๋ค.
๋ํ ๊ฐ๋ฐ์์ ์๋์ ์๊ด์์ด ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ํด ์๋ฌต์ ์ผ๋ก ํ์ ์ด ์๋์ผ๋ก ๋ณํ๋๊ธฐ๋ ํ๋ค. ์ซ์ ํ์ ์ด๋ผ๊ณ ์์ธกํ์ง๋ง ์ฌ์ค์ ๋ฌธ์์ด ํ์ ์ ๋ณ์์ผ ์ ๋ ์๋ค๋ ๋ง. ์ฝ๋๋ ์คํดํ์ง ์๋๋ก ์์ฑํด์ผ ํ๋ค. ๊ฐ๋ ์ฑ์ด ์ข์ ์ฝ๋๊ฐ ์ข์ ์ฝ๋๋ค.
์ฐธ๊ณ :๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฅ๋ค์ด๋ธ
ํ์ ์คํฌ๋ฆฝํธ์์์ ํ์
ํ์ ์คํฌ๋ฆฝํธ ์ปดํ์ผ๋ฌ๋ ๋๊ฐ์ง ์ญํ ์ ์ํํ๋ค.
- ์ต์ ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ๋ธ๋ผ์ฐ์ ์์ ๋์ํ๋๋ก ๊ตฌ๋ฒ์ ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ํธ๋์คํ์ผํ๋ค.
- ์ฝ๋์ ํ์ ์ค๋ฅ๋ฅผ ์ฒดํฌํ๋ค.
์ด ๋๊ฐ์ง๋ ์๋ก ์๋ฒฝํ ๋ ๋ฆฝ์ ์ด๋ค. ๋ฐ๋ผ์,
- ํ์ ์ค๋ฅ๊ฐ ์๋ ์ฝ๋๋ ์ปดํ์ผ์ด ๊ฐ๋ฅํ๋ค.
- ๋ฐํ์์๋ ํ์ ์ฒดํฌ๊ฐ ๋ถ๊ฐ๋ฅํ๋ค. ๋ฐํ์ ํ์ ์ ์ ์ธ๋ ํ์ ๊ณผ ๋ค๋ฅผ ์ ์๋ค.
์ฑ ์ ์ฝ๋ค๋ณด๋ฉด ๋ฐ๋ณต์ ์ผ๋ก ๋์ค๋ ์ค์ํ ๊ฐ๋ ์ด๋ค. ๋ฐํ์์ ๋ชจ๋ ๋ณ์๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์์ ๊ฐ์์ ๊ฐ๋ค์ ๊ฐ์ง๋ค. ๋ค์ํ ์ข ๋ฅ์ ๊ฐ๋ค์ ํ ๋น ๋ฐ์ ์ ์๋ค. ํ์ง๋ง ์ฝ๋๊ฐ ์คํ๋๊ธฐ ์ , ์ฆ ํ์ ์คํฌ๋ฆฝํธ๊ฐ ์ค๋ฅ๋ฅผ ์ฒดํฌํ๋ ์๊ฐ์๋ 'ํ์ '์ ๊ฐ์ง๊ณ ์๋ค.
'ํ ๋นํ ๊ฐ๋ฅํ ๊ฐ๋ค์ ์งํฉ'์ ํ์
์ด๋ผ๊ณ ๋ถ๋ฅผ ์ ์๋ค. ์ด๋ฐ ๋ฐฉํฅ์ผ๋ก๋ ํ๋ฒ๋ ์๊ฐํด๋ณธ ์ ์์ง๋ง, ์ ๋์จ(|
)์ด๋ ์ธํฐ์น์
(&
)์ด๋ผ๋ ์ด๋ฆ์ ํ์
์ด ์๋๊ฑธ ์๊ฐํ๋ฉด ์ฝ๊ฒ ๋ฉ๋ํ ์ ์๋ค.
- ๊ฐ์ฅ ์์ ์งํฉ์ ๊ณต์งํฉ์ด๋ค.
never
ํ์ ์ผ๋ก ์ ์ธ๋๋ค. - ์ฌ๋ฌ๊ฐ์ ํ์ ์ ๋ฌถ์ ๋๋ ์ ๋์จ ํ์ ์ ์ด์ฉํ๋ค. Union ์ ํฉ์งํฉ(A ∪ B)์ด๋ค.
- ์ธํฐ์น์
ํ์
์ ๊ต์งํฉ(A ∩ B)์ด๋ค.
A & B
ํ์ ์ ๊ฐ์A
ํ์ ์๋,B
ํ์ ์๋ ํ ๋น ๊ฐ๋ฅํด์ผ ํ๋ค. ๋ง์ฝA
์B
๋ชจ๋ ๊ฐ์ฒด ํ์ ์ด๋ผ๋ฉดA & B
ํ์ ์ ๊ฐ์ฒด๋A
์B
ํ์ ๊ฐ๊ฐ์ ์ ์๋ ์์ฑ ๋ชจ๋๋ฅผ ๊ฐ์ ธ์ผ ํ๋ค.์๋ฌด๊ฒ๋ ๊ฒน์น์ง ์๋๋ค๋ฉด ํ ๋นํ ์ ์๋ ๊ฐ์ด ์์ผ๋ฏ๋กnever
๊ฐ ๋๋ค.
type a = { foo: number; bar: string };
type b = { foo: number; baz: string };
type c = a & b;
const example: c = { foo: 1, bar: "bar", baz: "baz" }; //๋ฌธ์ ์๋ค!!
type FavoriteSport = "polo" | "ski";
type BallSport = "polo" | "baseball";
type FavoriteBallSport = FavoriteSport & BallSport; // polo
A & B
ํ์
์ ๊ฐ์ A
ํ์
์๋, B
ํ์
์๋ ํ ๋น ๊ฐ๋ฅํด์ผ ํ๋ค. ๋ง์ฝ A
์ B
๋ชจ๋ ๊ฐ์ฒด ํ์
์ด๋ผ๋ฉด A & B
ํ์
์ ๊ฐ์ฒด๋ A
์ B
ํ์
๊ฐ๊ฐ์ ์ ์๋ ์์ฑ ๋ชจ๋๋ฅผ ๊ฐ์ ธ์ผ ํ๋ค.
type FavoriteSport = "swimming" | "ski";
type BallSport = "football" | "baseball";
type FavoriteBallSport = FavoriteSport & BallSport; // never
๊ตฌ์กฐ์ ํ์ดํ๊ณผ ํ์ ํธํ์ฑ
ํ์ ์คํฌ๋ฆฝํธ ๊ณต์๋ฌธ์์์ ํ์ ํธํ์ฑ์ ๊ดํ ๊ธ์ ์ด๋ ๊ฒ ์ ํ์๋ค.
TypeScript์ ํ์ ํธํ์ฑ์ ๊ตฌ์กฐ์ ์๋ธํ์ดํ(structural subtyping)์ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค. ๊ตฌ์กฐ์ ํ์ดํ์ด๋ ์ค์ง ๋ฉค๋ฒ๋ง์ผ๋ก ํ์ ์ ๊ด๊ณ์ํค๋ ๋ฐฉ์์ ๋๋ค. ๋ช ๋ชฉ์ ํ์ดํ(nominal typing)๊ณผ๋ ๋์กฐ์ ์ ๋๋ค. TypeScript์ ๊ตฌ์กฐ์ ํ์ ์์คํ ์ ๊ธฐ๋ณธ ๊ท์น์ y๊ฐ ์ต์ํ x์ ๋์ผํ ๋ฉค๋ฒ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด x์ y๋ ํธํ๋๋ค๋ ๊ฒ์ ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ณธ์ง์ ์ผ๋ก Duck Typing ๊ธฐ๋ฐ์ด๋ค. ๋ง์ฝ ์ด๋ค ํจ์์ ๋งค๊ฐ๋ณ์ ๊ฐ์ด ๋ชจ๋ ์ ๋๋ก ์ฃผ์ด์ง๋ค๋ฉด, ๊ทธ ๊ฐ์ด ์ด๋ป๊ฒ ๋ง๋ค์ด์ก๋์ง ์ ๊ฒฝ ์ฐ์ง ์๊ณ ์ฌ์ฉํ๋ค. JS์ ์์ ์ธ์ด์ธ ํ์ ์คํฌ๋ฆฝํธ๋ ์ด๋ฅผ ๋ชจ๋ธ๋งํ๊ธฐ์ํด ๊ตฌ์กฐ์ ํ์ดํ์ ์ฌ์ฉํ๋ ๊ฒ.
2D ๋ฒกํฐ๋ฅผ ํ์
์ผ๋ก ๋ฐ๋ calculateLength
ํจ์๊ฐ ์๋ค.
interface Vector2D {
x: number;
y: number;
}
function calculateLength(v: Vector2D) {
return Math.sqrt(v.x * v.x + v.y * v.y);
}
// ์ด๋ฆ์ด ๋ค์ด๊ฐ ๋ฒกํฐ ์ถ๊ฐ
interface NamedVector {
name: string;
x: number;
y: number;
}
// NameVector์ ๊ตฌ์กฐ๊ฐ Vector2D์ ํธํ
const v: NamedVector = { x: 3, y: 4, name: "Zee" };
calculateLength(v);
์ด๋ ๊ฒ, ๊ตฌ์กฐ์ ํ์ดํ์ ์์ ๊ด๊ณ๊ฐ ๋ช ์๋์ด ์์ง ์๋๋ผ๋ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉ์ฒ์์ ์ฌ์ฉํจ์ ๋ฌธ์ ๊ฐ ์๋ค๋ฉด ํ์ ํธํ์ ํ์ฉํ๋ ๋ฐฉ์์ด๋ค.
NamedVector
ํ์
์ v
๋ calculateLength
ํจ์๊ฐ ํ์๋ก ํ๋ Vector2D
ํ์
์ ํ๋กํผํฐ๋ฅผ ํฌํจํ๊ณ ์๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ฐํ์ ์์์ ์ ์์ ์ผ๋ก ์๋ํ๋ค. ์ด๋ฐ ๊ฒฝ์ฐ์ ํ์
์ด ํธํ๋๋ค๊ณ ํ๋ ๊ฒ.
ํ์ง๋ง ์ด๋ฐ ์ฝ๋๊ฐ ์๋ค๋ฉด? ์๋๋ 3์ฐจ์ ๋ฒกํฐ๋ฅผ ์ ๊ทํํ๋ normalize
ํจ์์ด๋ค.
interface Vector3D {
x: number;
y: number;
z: number;
}
function normalize(v: Vector3D) {
const length = calculateLength(v);
return {
x: v.x / length,
y: v.y / length,
z: v.z / length,
};
}
normalize({ x: 3, y: 4, z: 5 });
// { x: 0.6, y: 0.8, z: 1 }
์ ์ฒด length๋ฅผ ๊ตฌํ๊ธฐ ์ํด ์์์ ์ฌ์ฉํ๋ calculateLength
๋ฅผ ์ฌ์ฉํ๋ค. 2D ๋ฒกํฐ๋ฅผ ํ๋กํผํฐ๋ก ๋ฐ๋๋ก ํ์ดํ์ด ๋ ํจ์์ด๊ธฐ ๋๋ฌธ์, ๊ฐ๋ฐ์์ ์๋๋๋ก๋ผ๋ฉด ์ค๋ฅ๋ฅผ ๋ด๋ฑ์ด์ผ ํ๋ค. ํ์ง๋ง ๊ตฌ์กฐ์ ์ผ๋ก ๋ฌธ์ ๊ฐ ์์ด ํ์
ํธํ์ด ํ์ฉ๋์๊ณ ๋ฌธ์ ์์ด ์คํ๋์๋ค. ์ด๋ฐ ๊ฒฝ์ฐ์๋ ์ค๋ฅ๊ฐ ์๋ค๊ณ ๋ณด๋ฉด ์๋๋ ๊ฒ์ด๋ค.
๊ตฌ์กฐ์ ํ์ดํ์ ํตํ ์ ์ฐํ ํ์ดํ์ ํ ์คํธ๋ฅผ ํ ๋ ์ด์ ์ด ์์ ์ ์๋ค. ์๋ฅผ ๋ค์ด postgresDB api๋ฅผ ๋ชจํนํ๋ค๊ณ ํ์ ๋, postgresDB๊ฐ ์ฌ์ฉํ๋ ์ธํฐํ์ด์ค๋ฅผ ๋ชจ๋ ๊ตฌํํ ํ์๊ฐ ์๋ ๊ฒ. ํ ์คํธ ํ๊ฒฝ์์๋ ์ค์ ํ๊ฒฝ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ์ ๋ณด๊ฐ ๋ถํ์ํ๊ธฐ๋๋ฌธ์, ํ์ํ ๋ถ๋ถ๋ง ์ถ์ํํด ์ฌ์ฉํ ์ ์๋ค. ์ธํฐํ์ด์ค๋ฅผ ์ด๋ป๊ฒ ๊ตฌํํ๋์ง ๋ช ํํ ์ ์ธํ ํ์๊ฐ ์์ด์ง๋ค.
์ฐธ๊ณ https://toss.tech/article/typescript-type-compatibility
์ ๋ฆฌํ์๋ฉด ์ด๋ ๋ค.
- ํ์ ์ ๊ฐ๋ค์ ์งํฉ์ด๋ค.
- ํ์ ์คํฌ๋ฆฝํธ๋ ๊ตฌ์กฐ์ ํ์ดํ์ ํตํด ํ์ ํธํ์ฑ์ ์ ๊ณตํ๋ค.