[TS] ํ์ ์คํฌ๋ฆฝํธ - ํ์ ํธํ
ํ์ ํธํ Type Compatibility
๐ก ์๋ฐ์คํฌ๋ฆฝํธ๋ ๊ฐ์ฒด ๋ฆฌํฐ๋ด์ด๋ ์ต๋ช ํจ์ ๋ฑ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ช ์์ ์ผ๋ก ํ์ ์ ์ง์ ํ๋ ๊ฒ๋ณด๋ค ์ฝ๋์ ๊ตฌ์กฐ ๊ด์ ์์ ํ์ ์ ์ง์ ํ๋๊ฒ ๋ ์ ์ด์ธ๋ฆด ์๋ ์๋ค.
ํ์
์คํฌ๋ฆฝํธ์์ ๋ค๋ฅธ ํ์
๊ฐ์ ํธํ ์ฌ๋ถ๋ฅผ ์ ๊ฒํ๋ ๊ฒ์ ํ์
ํธํ์ด๋ผ๊ณ ํ๋ค. ์๋ Avengers
ํด๋์ค๋ Ironman
์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์ ๊ตฌํํ ๊ฒ ์๋๋ฐ๋ ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์๋๋ค. ํ์
์คํฌ๋ฆฝํธ์์ ํ์
์ ์ ์๋์ด ์๋ ์์ฑ์ ํ์
์ ๊ฐ์ง๊ณ ์ฝ๋๊ฐ ํธํ๋๋์ง ํ์ธํ๊ธฐ ๋๋ฌธ์ด๋ค.
interface Ironman {
name: string;
}
class Avengers {
name: string;
}
let ironMan: Ironman;
ironMan = new Avengers(); // ok ํ์
ํธํ
๊ตฌ์กฐ์ ํ์ดํ Structural typing
๐ก ๊ฐ์ฒด ์์ฑ, ํจ์ ํ๋ผ๋ฏธํฐ ๋ฑ์ด ๋น๊ตํ๋ ๋์๋ณด๋ค ๋ ๋ง๋ค๋ฉด ๊ตฌ์กฐ์ ์ผ๋ก ๋ ํฌ๋ค๊ณ ๋ณผ ์ ์๋ค.
์ฝ๋ ๊ตฌ์กฐ ๊ด์ ์์ ํ์
์ด ์๋ก ํธํ๋๋์ง ํ๋จํ๋ ๊ฒ์ ๊ตฌ์กฐ์ ํ์ดํ์ด๋ผ๊ณ ํ๋ค. ์๋ ์์ ์์ capt
๊ฐ์ฒด์ Avengers
์ธํฐํ์ด์ค ๋ชจ๋ name
์์ฑ์ด ์๊ธฐ ๋๋ฌธ์ capt
์ hero
ํ์
์ ์๋ก ํธํ๋๋ค. ๋ ์๋ฐํ๊ฒ ๋งํ๋ฉด capt
๊ฐ์ฒด ํ์
์ด ๊ตฌ์กฐ์ ์ผ๋ก Avengers
๋ณด๋ค ํฌ๊ธฐ ๋๋ฌธ์ hero
์ ํ ๋น(ํธํ)๋ ์ ์๋ ๊ฒ.
interface Avengers {
name: string;
}
let hero: Avengers;
const capt = { name: "Captain", location: "Seoul" };
hero = capt; // ok ํ์
ํธํ
ํจ์ ํธ์ถ ์ญ์ ๋ง์ฐฌ๊ฐ์ง๋ค. capt
๊ฐ์ฒด์ name
์์ฑ์ด ์์ผ๋ฏ๋ก assemble
ํจ์์ ์ธ์๋ก ๋๊ธธ ์ ์๋ค.
function assemble(param: Avengers) {
console.log(param.name);
}
assemble(capt); // 'Captain' (ํ์
ํธํ)
ํ์ ํธํ ์์
Interface / Class (๊ฐ์ฒด ์์ฑ)
๐ก interface / class / ๊ฐ์ฒด ๋ฑ์์ ํ ๋น ์ฐ์ฐ์์ ์ฐํญ(ๅณ้กน)์ด ๊ตฌ์กฐ์ ์ผ๋ก ๋ ํฌ๋ค๋ฉด ํ์ ์ ํธํ๋ ์ ์๋ค.
์๋ developer = person
์ฝ๋์์ ์ค๋ฅธ์ชฝ์ ์๋ person
ํ์
์ developer
์ ํ ๋นํ๋ ค๊ณ ํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ค(ํ์
ํธํ ๋ถ๊ฐ). developer
์์ ํ์ํ skill
์์ฑ์ person
์ด ๊ฐ์ง๊ณ ์์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ฆ, ๊ตฌ์กฐ์ ์ผ๋ก ๋ ์์ person
์ developer
์ ํ ๋นํ๋ ค๊ณ ํด์ ๋ฐ์ํ๋ ์๋ฌ๋ค.
interface Developer {
name: string;
skill: string;
}
interface Person {
name: string;
}
let developer: Developer;
let person: Person;
developer = person; // Error! ํ์
ํธํ ๋ถ๊ฐ
// TS2741: Property 'skill' is missing in type 'Person' but required in type 'Developer'.
person = developer; // ok ํ์
ํธํ
Person
์ธํฐํ์ด์ค๋ฅผ ํด๋์ค๋ก ๋ฐ๊ฟ๋ ๊ฒฐ๊ณผ๋ ๋์ผํ๋ค. ํ์
์คํฌ๋ฆฝํธ์์ ํ์
ํธํ์ ๊ฒ์ฆํ ๋ ๋ด๋ถ์ ์กด์ฌํ๋ ์์ฑ๊ณผ ํ์
์ ๋ํด์๋ง ๋น๊ตํ๋ค. interface
, type
, class
๋ฑ์ ์๊ด์๋ค.
interface Developer {
name: string;
skill: string;
}
class Person {
name: string;
}
let developer: Developer;
let person: Person;
developer = new Person(); // Error! ํ์
ํธํ ๋ถ๊ฐ
// TS2741: Property 'skill' is missing in type 'Person' but required in type 'Developer'.
Function / Generic (ํจ์ ํ๋ผ๋ฏธํฐ)
๐ก function / generic ์์ ํ ๋น ์ฐ์ฐ์์ ์ขํญ(ๅทฆ้กน)์ด ๊ตฌ์กฐ์ ์ผ๋ก ๋ ํฌ๋ค๋ฉด ํ์ ์ ํธํ๋ ์ ์๋ค.
์๋ ์์์์ sum
์ add
์ ํ ๋นํ๋ ค๊ณ ํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ค(ํ์
ํธํ ๋ถ๊ฐ). add
๋ 1๊ฐ ์ธ์๋ง ๋ฐ์ ์ ์๋๋ฐ sum
์ 2๊ฐ ์ธ์๋ฅผ ๋ฐ๊ธฐ ๋๋ฌธ์ด๋ค(sum
์ด add
๋ณด๋ค ๊ตฌ์กฐ์ ์ผ๋ก ๋ ํฌ๋ค). interface / class ๋ฑ๊ณผ๋ ๋ฐ๋๋ก ํ ๋น๋๋ ๊ฐ(ํ ๋น ์ฐ์ฐ์์์ ์ฐํญ)์ด ๊ตฌ์กฐ์ ์ผ๋ก ๋ ์์์ผ ํ์
์ด ํธํ๋๋ค.
let add = function (a: number) {};
let sum = function (a: number, b: number) {};
add = sum; // Error! ํ์
ํธํ ๋ถ๊ฐ
// TS2322: Type '(a: number, b: number) => void' is not assignable to type '(a: number) => void'.
sum = add; // ok ํ์
ํธํ
์ ๋ค๋ฆญ์์ ํ์
์ธ์ <T>
๊ฐ ์์ฑ์ ํ ๋น๋๋์ง๋ฅผ ๊ธฐ์ค์ผ๋ก ํ์
ํธํ ์ฌ๋ถ๋ฅผ ํ๋จํ๋ค. ์ธํฐํ์ด์ค์ ์๋ฌด๋ฐ ์์ฑ๋ ์๋ค๋ฉด ํ์
์คํฌ๋ฆฝํธ๋ ๊ฐ์ ํ์
์ผ๋ก ๊ฐ์ฃผํ๋ค.
interface Empty<T> {}
let x: Empty<number>;
let y: Empty<string>;
x = y; // OK, because y matches structure of x
์ธํฐํ์ด์ค์ ์์ฑ(๋ฉค๋ฒ ๋ณ์)์ด ์๊ณ , ์ ๋ค๋ฆญ์ ํ์ ์ธ์๊ฐ ํ ๋น๋์๋ค๋ฉด ์๋ก ๋ค๋ฅธ ํ์ ์ผ๋ก ๊ฐ์ฃผํ๋ค.
interface NotEmpty<T> {
data: T;
}
let x: NotEmpty<number>;
let y: NotEmpty<string>;
x = y; // Error! because x and y are not compatible
๊ธฐํ ์ฐธ๊ณ ๋ด์ฉ
์ด๋ ํ์
์ number
ํ์
๊ณผ ํธํ๋์ง๋ง, ๊ฐ์ ์ด๋ ํ์
๋ผ๋ฆฌ๋ ํธํ๋์ง ์๋๋ค
enum Status {
Ready,
Waiting,
}
enum Color {
Red,
Blue,
Green,
}
let status = Status.Ready;
status = Color.Green; // Error! TS2322: Type 'Color.Green' is not assignable to type 'Status'.
ํด๋์ค ํ์
์ ์ธ์คํด์ค ๋ฉค๋ฒ(ํ๋กํผํฐ)๋ค์ ๋น๊ตํ๋ค. static
๋ฉค๋ฒ์ ์์ฑ์๋ ๋น๊ต ๋์์์ ์ ์ธ๋๋ค.
class Hulk {
handSize: number; // ์์ฑ
constructor(name: string, numHand: number) {}
}
class Captain {
handSize: number; // ์์ฑ
constructor(numHand: number) {}
}
let a: Hulk;
let b: Captain;
a = b; // ok
b = a; // ok
ํ์ ์คํฌ๋ฆฝํธ๋ ์ปดํ์ผ ์์ ์ ์ถ๋ก ํ ์ ์๋ ํ์ ๋ค์ ์ผ๋จ ์์ ํ๋ค๊ณ ๊ฐ์ ํ๋ค. ์ด๋ฌํ ํน์ฑ ๋๋ฌธ์ ํ์ ์คํฌ๋ฆฝํธ์ ํ์ ์์คํ ์ ์์ ํ "sound"(์์ ํ) ํ์ง ์๋ค๊ณ ์ฌ๊ฒจ์ง๋ค. "sound" ์ฉ์ด๋ ํ์ ์์คํ ์ด ๋ชจ๋ ๊ฐ๋ฅํ ํ์ ์ค๋ฅ๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ๊ฒ์ถํ ์ ์์ ๋ ์ฌ์ฉ๋๋ฉฐ, ํ์ ์คํฌ๋ฆฝํธ๋ ์ด๋ฐ ๋ฉด์์ ์ด๋ ์ ๋ ํ๊ณ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ ์ ์ ์ธ์งํด์ผ ํ๋ค.
๋ ํผ๋ฐ์ค
ํ์ ์คํฌ๋ฆฝํธ ์ ๋ฌธ - ๊ธฐ์ด๋ถํฐ ์ค์ ๊น์ง - ์ธํ๋ฐ | ๊ฐ์
๊ธ ์์ ์ฌํญ์ ๋ ธ์ ํ์ด์ง์ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ๋ฐ์๋ฉ๋๋ค. ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์
'๐ช Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[HTML/CSS] width ์์ฑ ์๋ ๋งค์ปค๋์ฆ
[HTML/CSS] width ์์ฑ ์๋ ๋งค์ปค๋์ฆ
2024.05.05 -
[TS] ํ์ ์คํฌ๋ฆฝํธ ๋งต๋ ํ์ / ์ ํธ๋ฆฌํฐ ํ์ / Enum
[TS] ํ์ ์คํฌ๋ฆฝํธ ๋งต๋ ํ์ / ์ ํธ๋ฆฌํฐ ํ์ / Enum
2024.05.05 -
[DevTools] ์ธ๋ถ์์ ๋ก์ปฌ ์๋ฒ ์ ์ํ๊ธฐ — ngrok
[DevTools] ์ธ๋ถ์์ ๋ก์ปฌ ์๋ฒ ์ ์ํ๊ธฐ — ngrok
2024.05.04 -
[React] Blur ํจ๊ณผ๋ฅผ ํ์ฉํ ์ด๋ฏธ์ง ์ง์ฐ ๋ก๋ฉ Image Lazy Loading
[React] Blur ํจ๊ณผ๋ฅผ ํ์ฉํ ์ด๋ฏธ์ง ์ง์ฐ ๋ก๋ฉ Image Lazy Loading
2024.05.04