์์ฆ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์์๋ TypeScript๋ฅผ ๋๋ฆฌ ์ฌ์ฉํ๊ณ ์์ด,
JavaScript๋ฅผ ๊ณต๋ถํ๋ ๋์์ TypeScript๋ฅผ ์ต๋ํ๋ ๊ฒ๋ ์ค์ํ๋ค.
TypeScript๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ, ์ฑ์ฉ ๊ณผ์ ์์๋ ํ๋ฝํ๋ ๊ฒฝ์ฐ๊ฐ ์์ ์ ๋๋ก ์ค์ํ ๊ธฐ์ ์ด ๋์๋ค.
์ด๋ฒ ์ ๋์ TypeScript์ ๊ธฐ์ด์ ์ธ ๋ฌธ๋ฒ์ ํ์ตํ๊ณ , ํ๋ก์ ํธ์ TypeScript๋ฅผ
์ธํ
ํ๋ ๋ฐฉ๋ฒ์ ์ค์ตํ์ฌ ์ฒ์ ์ ํด๋ ์ฝ๊ฒ ํ์ตํ ์ ์๋๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
TypeScript๋ ๋ง์ดํฌ๋ก์ํํธ์์ ๊ฐ๋ฐํ JavaScript์ ์์ ์งํฉ(Superset) ์ธ์ด์ด๋ค.
JavaScript์ ์ ์ ํ์
๊ฒ์ฌ์ ํด๋์ค ๊ธฐ๋ฐ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ ๋ฑ์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ฌ ๊ฐ๋ฐ๋ ์ธ์ด๋ก,
JavaScript๊ฐ ๋ฐ์ ํ๋ฉด์ ์๊ธด ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํด ๋ฑ์ฅํ๊ฒ ๋์๋ค.
TypeScript์ ๋ฑ์ฅ ๋ฐฐ๊ฒฝ
TypeScript๋ฅผ ์ด์ผ๊ธฐํ๊ธฐ์ ์์, JavaScript์ ๋ํด ๋จผ์ ์ด์ผ๊ธฐํด ๋ณด๊ฒ ๋ค.
JavaScript๋ ์ฒ์์๋ ๋ธ๋ผ์ฐ์ ์์๋ง ๋์ํ๋ ์คํฌ๋ฆฝํ ์ธ์ด๋ก ๋ง๋ค์ด์ก์๋ค.
์๊ฐ์ด ์ ์ ํ๋ฅด๊ณ , JavaScript๋ก ์น ์ ํ๋ฆฌ์ผ์ด์
์ ์ํธ์์ฉ์ด ์ฆ๊ฐํ๋ฉด์,
์น ์ ํ๋ฆฌ์ผ์ด์
์ด ํ์๋ก ํ๋ JavaScript ์ฝ๋์ ์์ด ํญ๋ฐ์ ์ผ๋ก ๋์ด๋๊ฒ ๋์๋ค.
์ด๋ก ์ธํด JavaScript์ ํ๊ณ๊ฐ ๋ถ๊ฐ๋๊ธฐ ์์ํ๋ค. JavaScript๋ ๋์ ํ์
์ด ๊ฒฐ์ ๋์ด ์ ์ฐํ๊ณ ,
๋ค์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ ์ ์๋ ์ฅ์ ์ด ์์ง๋ง, ํ์
์ ๋ช
์์ฑ์ด ๋ถ์กฑํ๋ค๋ ๋จ์ ์ด ์๋ค.
ํ์
์ ๋ช
์์ฑ์ด ๋ถ์กฑํ๊ฒ ๋๋ฉด ์์์น ๋ชปํ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํ ์ ์๋ค. ์๋๋ ๊ทธ ์์์ด๋ค.
let add = (x, y) => {
return x + y;
}
add(5, "7");
์์ ์ฝ๋๋ add
ํจ์์ ์ซ์ 5
์ ๋ฌธ์์ด "7"
์ ์ ๋ฌ์ธ์๋ก ์ ๋ฌํ์ฌ ๋ง์
์ ์ํํ๊ณ ์๋ค.
์ด๋ ๊ฒ ๋๋ฉด ๊ฒฐ๊ณผ๋ "57"
์ด ๋์จ๋ค. ์ด๋ฐ ์์ผ๋ก JavaScript๋ ๋ฌธ์์ด๊ณผ ์ซ์๋ฅผ ๋ํ ๊ฒฝ์ฐ, ์ซ์ ํ์
์ ์ธ์ ์ชฝ์ ๊ฐ์ ์ ์ผ๋ก ํ์
๋ณํํด ๋ฌธ์์ด์ ๋ง๋ ๋ค. ์ด๋ ๊ฒ JavaScript๋ ํจ์๋ ๋ณ์์ ํ์
์ ๋ช
์์ ์ผ๋ก ์ง์ ํ์ง ์์๋ ๋์ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ ์์์น ๋ชปํ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํ๊ฒ ๋๋ค. ์ด๋ฐ ๋ฌธ์ ์ ์ ๋ณด์ํ๊ธฐ ์ํด TypeScript๋ผ๋ ์ธ์ด๊ฐ ๋ฑ์ฅํ๊ฒ ๋์๋ค.
TypeScript๋ฅผ ์ฌ์ฉํ์ ์ ์ฅ์
TypeScript๋ ์ ์ ํ์ ๊ฒ์ฌ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ฉฐ, ์ฝ๋์ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง ๋ณด์์ฑ์ ๋์ฌ์ค๋ค.
์ด๋ฅผ ํตํด ๊ฐ๋ฐ์๋ ๋ฐํ์ ์๋ฌ๋ฅผ ์ต์ํํ๊ณ , ์ฝ๋ ์์ฑ ์๊ฐ์ ๋จ์ถํ๋ฉฐ, ํ์ ์ ์ฝ๋์ ๊ฐ๋ ์ฑ์ ๋์ผ ์ ์๋ค.
๋ํ TypeScript๋ ES6์ ๋ฌธ๋ฒ์ ํฌํจํ ์ต์ JavaScript ๋ฌธ๋ฒ์ ์ง์ํ๋ฉฐ, ์ธํฐํ์ด์ค(Interface), ์ ๋ค๋ฆญ(Generic), ๋ฐ์ฝ๋ ์ดํฐ(Decorators) ๋ฑ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ฌ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ๋ณด๋ค ์ฝ๊ฒ ํ ์ ์๋๋ก ๋์์ค๋ค.
์๋๋ ์ธํฐํ์ด์ค(Interface)๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋์ ๊ฐ๋
์ฑ์ ๋์ธ ์์์ด๋ค.
interface User {
id: number;
name: string;
}
function greetingUser(user: User) {
console.log(`Hello, ${user.name}!`)
}
const parkUser = {
id: 1,
name: "๋ฐํด์ปค"
};
greetingUser(parkUser);
์์ ์ฝ๋๋ User
์ธํฐํ์ด์ค๋ฅผ ์ ์ํด User
์ ์ ๋ณด๋ฅผ ์ข ๋ ์ฝ๊ฒ ํ์
ํ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ greetingUser
ํจ์์๋ ๋งค๊ฐ๋ณ์๋ก User
ํ์
์ ์ฌ์ฉํด
์ด ํจ์๊ฐ ์ด๋ค ํ์
์ ์ธ์๋ฅผ ๋ฐ๊ณ ์๋์ง ๋ช
ํํ ํํํ๊ณ ์๋ค.
์ด๋ ๊ฒ TypeScript๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๋์ ๊ฐ๋ ์ฑ์ ๋์ผ ์ ์๋ค.
๋ํ ํ์
์ ๋ช
์ํจ์ผ๋ก์จ ์ฝ๋์ ์๋ ๋ํ ๋ช
ํํด์ง๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ์ฝ๋๋ฅผ
์ดํดํ๊ณ ์์ ํ๊ธฐ ์ฌ์์ง๋ฉฐ, ๋ฐํ์ ์๋ฌ๋ฅผ ๋ฏธ๋ฆฌ ๋ฐฉ์งํ ์ ์๊ธฐ ๋๋ฌธ์ ์ ์ง๋ณด์์ฑ ๋ํ ๋์์ง๋ค.
TypeScript๋ JavaScript์ ๊ฑฐ์ ๋์ผํ ๋ฐ์ดํฐ ํ์
์ ์ง์ํ๋ค.
Boolean(๋ถ๋ฆฌ์ธ) ํ์
๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐ์ดํฐ ํ์
์ผ๋ก, JavaScript์์๋ ๋ง์ฐฌ๊ฐ์ง๋ก
boolean ๊ฐ์ด๋ผ๊ณ ๋ถ๋ฆฌ๋ ์ฐธ(true), ๊ฑฐ์ง(false) ๊ฐ์ด๋ค.
let isShow: boolean = true;
let isDone: boolean = false;
Number(์ซ์) ํ์
TypeScript์์ Number ํ์
์ ์ ์ธํ๋ ๋ฐฉ์์ ์๋์ ๊ฐ๋ค. JavaScript์ ๋ง์ฐฌ๊ฐ์ง๋ก TypeScript ๋ํ ์ ์์ ์ค์์ ๊ตฌ๋ถ ์์ด Number ํ์
ํ๋๋ก ํ๊ธฐํ๋ค. TypeScript๋ ์ด ์ธ์๋ ์ถ๊ฐ๋ก bigint
๋ฅผ ์ง์ํ๋ค.
let number1: number = 5;
let number2: number = 0.7;
String(๋ฌธ์์ด) ํ์
TypeScript๋ JavaScript์ฒ๋ผ ํฐ๋ฐ์ดํ("
)๋ ์์๋ฐ์ดํ('
)๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์์ด ๋ฐ์ดํฐ๋ฅผ ํํํ๋ค.
๋ํ ๋ฐฑํฑ(`)์ ์ฌ์ฉํ ๋ฌธ์์ด์ธ ํ
ํ๋ฆฟ ๋ฆฌํฐ๋ด์ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ์ค์ ๊ฑธ์ณ ๋ฌธ์์ด์ ์์ฑํ ์ ์๋ค.
let firstName: string = "coding";
let lastName: string = 'kim';
let longString: string = `Kimcoding is a developer.
He is 20 years old.`
Array(๋ฐฐ์ด) ํ์
TypeScript๋ JavaScript์ฒ๋ผ ๊ฐ๋ค์ ๋ฐฐ์ด๋ก ๋ค๋ฃฐ ์ ์๊ฒ ํ ์ ์์ผ๋ฉฐ,
๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ๋ฐฐ์ด ํ์
์ ์ ์ธํด ์ฌ์ฉํ ์ ์๋ค.
// ์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ
let items: string[] = ["apple", "banana", "grape"];
// ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ
let numberList: Array<number> = [4, 7, 100];
์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ๋ฐฐ์ด์ ์์๋ค์ ๋ํ๋ด๋ ํ์
๋ค์ ๋ฐฐ์ด์ ๋ํ๋ด๋ []
์ ์ฐ๋ ๊ฒ์ด๋ค.
์ด์ด ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ์ ๋ค๋ฆญ ๋ฐฐ์ด ํ์
์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
Array
๋ฅผ ๋จผ์ ์์ฑํ ๋ค, <>
์์ ๋ฐฐ์ด์ ์์๋ค์ ๋ํ๋ด๋ ํ์
์ ์์ฑํ๋ค.
๋ฐฐ์ด ํ์ ์ ๊ธฐ๋ณธ์ ์ผ๋ก ํ๋์ ํ์ ๋ง ์์ฑํ๊ฒ ๋์ด ์์ผ๋ฉฐ, ํ์ ์ ํผ์ฉํด์ ์์ฑํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ค.
Tuple(ํํ) ํ์
TypeScript์์ ํํ ํ์ ์ ์ฌ์ฉํ๋ฉด ์์์ ํ์ ๊ณผ ๊ฐ์๊ฐ ๊ณ ์ ๋ ๋ฐฐ์ด์ ํํํ ์ ์๋ค.
let user: [string, number, boolean] = ["kimcoding", 20, true];
๋ชจ๋ ์์๊ฐ ์ ๋ถ ๊ฐ์ ํ์๋ ์์ง๋ง, ๋ฐฐ์ด์ index๋ง๋ค
ํ์
์ด ์ ํด์ ธ ์๊ธฐ ๋๋ฌธ์ ์ ํํ index์ ์ ๊ทผํ ํ์๊ฐ ์๋ค.
console.log(user[2].toString());
์ด๋ ๊ฒ user[2]
์ ์ ๊ทผํ๊ฒ ๋๋ฉด, user[2]
์ ์๋ ์์๋ boolean
ํ์
์ด๊ธฐ ๋๋ฌธ์ ํ์
์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
JavaScript์์๋ ํํ ํ์
์ ์ง์ํ๋ฉฐ, JavaScript์์์ ํํ ๋ํ
์ฌ๋ฌ ๊ฐ์ ๊ฐ์ ๊ฐ์ง ๋ฐฐ์ด์ ๋ํ๋ด๋ ๋ฐ์ ์ฌ์ฉํ๋ค.
๊ทธ๋ฌ๋ JavaScript์์๋ ํํ ํ์
์ ๋ช
์์ ์ผ๋ก ์ ์ธํ ์ ์๊ธฐ ๋๋ฌธ์
๊ฐ๋ฐ์๊ฐ ์ง์ ํํ์ ๊ฐ ์์์ ํ์
์ ํ์ธํ๊ณ ์ ์ถํด์ผ ํ๋ฏ๋ก ํ์
์๋ฌ๊ฐ ๋ ์ฝ๊ฒ ๋ฐ์ํ๋ค.
TypeScript์ ๋ฑ์ฅ ๋ฐฐ๊ฒฝ ์ค ํ๋์ธ ํ์ ์๋ฌ๋ฅผ ๋ฐฉ์งํ๊ณ ์ ํ ์ด์ ์ค ํ๋์ด๊ธฐ๋ ํ๋ค.
Object(๊ฐ์ฒด) ํ์
TypeScript์์ ๊ฐ์ฒด๋ JavaScript์ ๋ง์ฐฌ๊ฐ์ง๋ก ์์ ํ์ ์ด ์๋ ํ์ ์ ๋ํ๋ธ๋ค.
JavaScript์์ Object(๊ฐ์ฒด) ํ์
์ ํ๋กํผํฐ๋ฅผ ๊ฐ์ง๋ JavaScript์ ๊ฐ์ ๋งํ๋ฉฐ
typeof
์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ ๋ โobjectโ์ ๋ฐํํ๋ ๋ชจ๋ ํ์
์ ์๋ฏธํฉ๋๋ค.
๐ฌ JavaScript์ ์์ ํ์
์๋ number
, string
, boolean
, undefined
, null
, symbol
์ด ์๋ค.
let obj: object = {};
TypeScript์์ object
ํ์
์ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ์์ฉํ๋ ํ์
์ผ๋ก,
๊ฐ์ฒด์ ํ๋กํผํฐ ํ์
๋ค์ด any
๋ก ์ง์ ๋๊ธฐ ๋๋ฌธ์ ์ด๋ ํ ํ๋กํผํฐ๋ผ๋ ์ถ๊ฐํ ์ ์๋ค.
๊ทธ๋ฌ๋ ์ด๋ ํ์
์์ ์ฑ์ ๋ณด์ฅํ์ง ์๊ธฐ ๋๋ฌธ์ ์ถ์ฒํ๋ ๋ฐฉ๋ฒ์ ์๋๋ค.
๋ฐ๋ผ์ ๊ฐ์ฒด์ ํ๋กํผํฐ ํ์
๋ค์ ๊ฐ๊ธฐ ๋ช
์ํด ์ฃผ๋ ๊ฒ์ด ํจ์ฌ ์ข๋ค.
๊ฐ์ฒด๋ ์ด๋ฐ ๋ฐฉ์์ผ๋ก key-value
์ ๊ตฌ์ฒด์ ์ธ ํ์
๊น์ง๋ ์ง์ ํ ์ ์๋ค.
let user: {name: string, age: number} = {
name: "kimcoding",
age: 20
}
Any ํ์
๊ฐํน ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ๋, ์์ง ๋ชปํ๋ ํ์ ์ ํํํด์ผ ํ ๋๋ ์๋ค.
ํด๋ผ์ด์ธํธ์์ ์ ์ ๋ก๋ถํฐ ๋ฐ์ ๋ฐ์ดํฐ ๋ฐ ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๋ค์ด์ค๋ ๊ฐ์ธ ๊ฒฝ์ฐ
๊ฐ๋ฐ์๊ฐ ์์ง ๋ชปํ๋ ํ์
์ผ ์ ์๋๋ฐ, ํ์
๊ฒ์ฌ๋ฅผ ํ์ง ์๊ณ ์ ํ ๋ any
ํ์
์ ์ฌ์ฉํ ์ ์๋ค.
let maybe: any = 4;
any ํ์
์ ์ฌ์ฉํ๊ฒ ๋๋ฉด, ๋ณ์์ ๊ฐ์ ์ฌํ ๋นํ๋ ๊ฒฝ์ฐ ํ์
์ ๋ช
์ํ
๋ณ์์ ๋ฌ๋ฆฌ ํ์
์ ๊ตฌ์ ๋ฐ์ง ์๊ณ ๊ฐ์ ์ฌํ ๋นํ ์ ์๊ฒ ๋๋ค.
let obj: object = {};
// ์๋ฌ๊ฐ ๋๋ค.
obj = "hello";
let maybe: any = 4;
// ์ ์์ ์ผ๋ก ๋์ํ๋ค.
maybe = true;
๋ํ ์๊ฒฉํ ํ์
๊ฒ์ฌ๋ฅผ ์งํํ์ง ์๊ธฐ ๋๋ฌธ์, ์ค์ ํ ๋น๋
๊ฐ์ด ๊ฐ์ง์ง ์๋ ๋ฉ์๋ ๋ฐ ํ๋กํผํฐ๋ก ์ ๊ทผํด๋ ์๋ฌ๊ฐ ๋์ง ์๋๋ค.
๋์ , ์ค์ ํ ๋น๋ ๊ฐ์ด ๊ฐ์ง์ง ์๋ ๋ฉ์๋ ๋ฐ ํ๋กํผํฐ์ด๊ธฐ ๋๋ฌธ์ ๋ฐํ๋๋ ๊ฐ์ undefined
์ด๋ค.
let maybe: any = 4;
// undefined๋ก ์ถ๋ ฅ๋๋ค.
console.log(maybe.length);
๋ํ any
ํ์
์ ํ์
์ ์ผ๋ถ๋ง ์๊ณ , ์ ์ฒด๋ ์์ง ๋ชปํ ๋ ์ ์ฉํ๋ค.
์๋ฅผ ๋ค์ด์ ์ฌ๋ฌ ํ์
์ด ์์ธ ๋ฐฐ์ด์ ๋ฐ๊ณ ์ ํ ๋ ์ ์ฉํ๋ค.
let list: any[] = [1, true, "free"];
// any๋ก ๋ค๋ฃจ๊ณ ์๊ธฐ ๋๋ฌธ์ index 1๋ฒ์งธ ์์๊ฐ boolean ํ์
์ด์ง๋ง number ํ์
์ผ๋ก ์ฌํ ๋นํ ์ ์๋ค.
list[1] = 100;
JavaScript์์ ํจ์๋ ๋ชจ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์ฑ ์์์ด๋ค.
JavaScript์์์ ํจ์์ ๋ง์ฐฌ๊ฐ์ง๋ก TypeScript์๋ ํจ์๋ JavaScript์ ๋ง์ฐฌ๊ฐ์ง๋ก
๊ธฐ๋ช
ํจ์(named function)์ ํ์ดํ ํจ์(arrow function) ๋ฑ์ผ๋ก ๋ง๋ค ์ ์๋ค.
JavaScript์์ ํจ์๋ฅผ ์ด๋ ๊ฒ ์์ฑํ๋ค.
// named function
function add(x, y){
return x + y;
}
// arrow function
let add = (x, y) => {
return x + y;
}
์ด๋ฅผ TypeScript๋ก ๋ค์ ํํํด ๋ณด๊ฒ ๋ค.
// named function
function add(x: number, y: number):number {
return x + y;
}
// arrow function
let add = (x: number, y: number): number => {
return x + y;
}
TypeScript์์ ํจ์๋ฅผ ํํํ ๋๋ ๋งค๊ฐ๋ณ์์ ํ์
๊ณผ ๋ฆฌํด๊ฐ์ ํ์
์ ๋ช
์ํด์ผ ํ๋ค.
๊ฐ ๋งค๊ฐ๋ณ์์ ํด๋นํ๋ ํ์
์ ์์ฑํ๊ณ , ๋ฆฌํด๊ฐ์ ํ์
์ ๊ดํธ ๋ค์ ์์ฑ์ ํ๋ฉด ๋๋ค.
๋ฐํ๋๋ ํ์
์ ํ์
์ถ๋ก ์ ์ด์ฉํ์ฌ ์๋ตํ ์๋ ์๋ค.
// named function
function add(x: number, y: number) {
return x + y;
}
// arrow function
let add = (x: number, y: number) => {
return x + y;
}
์ด๋ ๊ฒ ๋ฆฌํด๊ฐ์ ์์ฑํ์ง ์์๋ TypeScript ์ปดํ์ผ์ด ์ค์ค๋ก ํ๋จํด์ ํ์ ์ ๋ฃ์ด์ฃผ๋ฉฐ, ์ด๊ฒ์ด ํ์ ์ถ๋ก ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ๋ง์ฝ ํจ์์ ๋ฆฌํด๊ฐ์ด ์๋ค๋ฉด, void
๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑํ ์ ์๋ค.
let printAnswer = (): void => {
console.log("YES");
}
๋ํ TypeScript๋ JavaScript์ ๋ฌ๋ฆฌ ๋งค๊ฐ๋ณ์์ ๊ฐ์์ ๋ง์ถฐ ์ ๋ฌ์ธ์๋ฅผ ์ ๋ฌํด์ผ ํ๋ค.
let greeting = (firstName: string, lastName: string): string => {
return `hello, ${firstName} ${lastName}`;
}
// ์๋ฌ๊ฐ ๋๋ค.
greeting('coding');
// ์ ์์ ์ผ๋ก ์๋ํ๋ค.
greeting('coding', 'kim');
// ๋๋ฌด ๋ง์ ๋งค๊ฐ๋ณ์๋ฅผ ๋ณด๋ด ์๋ฌ๊ฐ ๋๋ค.
greeting('coding', 'kim', 'hacker');
๋ง์ฝ ๊ฐ๋ฐ์๊ฐ ์ ๋ฌ์ธ์๋ฅผ ์ ๋ฌํ์ง ์๊ฑฐ๋, undefined
๋ฅผ ์ ๋ฌํ์ ๋ ํ ๋น๋ ๋งค๊ฐ๋ณ์์
๊ฐ์ ์ ํด๋์ ์๋ ์๋ค. ์ด๋ JavaScript์์์ default parameter
์ ๊ฐ์ ๋์์ ํ๋ค.
let greeting = (firstName: string, lastName: string ="kim"): string => {
return `hello, ${firstName} ${lastName}`;
}
// ์ ์์ ์ผ๋ก ์๋ํ๋ค.
greeting('coding');
// ์ ์์ ์ผ๋ก ์๋ํ๋ค.
greeting('coding', undefined);
// ๋๋ฌด ๋ง์ ๋งค๊ฐ๋ณ์๋ฅผ ๋ณด๋ด ์๋ฌ๊ฐ ๋๋ค.
greeting('coding', 'kim', 'hacker');
์ด๋๋ ๋ค์ ์ธ์๋ก undefined
๋ฅผ ๋ณด๋ด๋ ๊ฐ์ โhello, coding kimโ
์ผ๋ก ๋ฐํ๋๋ค.
ํน์ ์ ํ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ํ๋ค๋ฉด ๋งค๊ฐ๋ณ์์ ์ด๋ฆ ๋์ ๋ฌผ์ํ(?)
๋ฅผ ๋ถ์์ผ๋ก์จ ํด๊ฒฐํ ์๋ ์๋ค.
let greeting = (firstName: string, lastName?: string): string => {
return `hello, ${firstName} ${lastName}`;
}
// ์ ์์ ์ผ๋ก ์๋ํ๋ค.
greeting('coding');
// ์ ์์ ์ผ๋ก ์๋ํ๋ค.
greeting('coding', 'kim');
// ๋๋ฌด ๋ง์ ๋งค๊ฐ๋ณ์๋ฅผ ๋ณด๋ด ์๋ฌ๊ฐ ๋๋ค.
greeting('coding', 'kim', 'hacker');
๊ทธ๋ฌ๋ ์ด๋๋ greating('coding')
๊ณผ ๊ฐ์ด ์ ๋ฌ์ธ์๋ฅผ
ํ๋๋ง ์ ๋ฌํ๊ธฐ ๋๋ฌธ์, ๋ค์ ๋งค๊ฐ๋ณ์๋ undefined
๋ก ๋ฐํ์ด ๋๋ค.
TypeScript๋ ์ฐ์ฐ์๋ฅผ ์ด์ฉํด ํ์ ์ ์ ํ ์ ์๋ค.
JavaScript์์๋ ๋ณด์๋ ||
(OR) ์ฐ์ฐ์๋ &&
(AND)์ ๊ฐ์ ์ฐ์ฐ์๋ฅผ ์ด์ฉํ์ฌ ๋ง๋ค ์ ์๋ค.
|
์ฐ์ฐ์๋ฅผ ์ด์ฉํ ํ์
์ ์ ๋์จ(Union) ํ์
์ด๋ผ๊ณ ํ๋ฉฐ,
&
์ฐ์ฐ์๋ฅผ ์ด์ฉํ ํ์
์ ์ธํฐ์น์
(Intersection) ํ์
์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์ ๋์จ ํ์ ์ ๋ ์ด์์ ํ์ ์ ํฉ์ณ์ ๋ง๋ค์ด์ง ์๋ก์ด ํ์ ์ด๋ค.
|
์ฐ์ฐ์๋ฅผ ์ด์ฉํ๋ฉฐ, ์๋ฐ์คํฌ๋ฆฝํธ์ ||
(OR) ์ฐ์ฐ์์ ๊ฐ์ด โA์ด๊ฑฐ๋ B์ด๋คโ๋ผ๋ ์๋ฏธ์ ํ์
์ด๋ค.
์๋ฅผ ๋ค์ด, number | string
์ ์ซ์ ๋๋ ๋ฌธ์์ด ํ์
์ ์๋ฏธํ๋ค. ์๋์ ์ฝ๋๋ฅผ ํ๋ ๋ณด๊ฒ ๋ค.
function printValue(value: any): void {
if (typeof value === "number") {
console.log(`The value is a number: ${value}`);
} else {
console.log(`The value is a string: ${value}`);
}
}
printValue(10); // The value is a number: 10
printValue("hello"); // The value is a string: hello
์์ ์ฝ๋๋ value
๋งค๊ฐ๋ณ์์ ํ์
์ any
๋ก ์ ์ํ๊ณ ,
ํ์
์ด number
์ธ์ง string
์ธ์ง์ ๋ฐ๋ผ if-else
๋ฌธ์ผ๋ก ๋๋์ด ์ถ๋ ฅํ๊ณ ์๋ค.
๊ทธ๋ฌ๋ any
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ JavaScript๋ก ์์ฑํ๋ ๊ฒ๊ณผ ํฐ ์ฐจ์ด๊ฐ ์๊ธฐ ๋๋ฌธ์,
์ ๋์จ ํ์
์ ์ฌ์ฉํด TypeScript์ ์ด์ ์ ์ด๋ฆฌ๋ฉด์ ์ฝ๋ฉํ๋ ๊ฒ์ด ์ข๋ค.
function printValue(value: number|string): void {
if (typeof value === "number") {
console.log(`The value is a number: ${value}`);
} else {
console.log(`The value is a string: ${value}`);
}
}
printValue(10); // The value is a number: 10
printValue("hello"); // The value is a string: hello
์์ printValue
ํจ์๋ ์ซ์ ๋๋ ๋ฌธ์์ด ๊ฐ์ ์
๋ ฅ๋ฐ๊ณ ์๋ค.
์ด๋, ์ ๋์จ ํ์
์ ์ฌ์ฉํด number | string
ํ์
์ผ๋ก ์ง์ ํ๊ณ ์๋ค.
์ดํ ์
๋ ฅ๋ ๊ฐ์ ํ์
์ typeof
์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒ์ฌํ ํ,
ํด๋น ๊ฐ์ด ์ซ์์ธ ๊ฒฝ์ฐ์ ๋ฌธ์์ด์ธ ๊ฒฝ์ฐ ๊ฐ๊ฐ ๋ค๋ฅธ ๋ก๊ทธ๋ฅผ ์ถ๋ ฅํ๋ค.
์ด์ฒ๋ผ ์ ๋์จ ํ์ ์ ๋ค์ํ ํ์ ์ ๊ฐ์ ์ฒ๋ฆฌํด์ผ ํ๋ ๊ฒฝ์ฐ ์ ์ฉํ๋ค.
์ ๋์จ(Union) ํ์ ์ ์ฅ์
์ ๋์จ ํ์ ์ ์ฌ์ฉํ๋ฉด ํ์ ์ ์ถ๋ก ํ ์ ์๊ธฐ ๋๋ฌธ์, ํ์ ์ ๊ด๋ จ๋ API๋ฅผ ์ฝ๊ฒ ์๋์์ฑ์ผ๋ก ์ป์ด๋ผ ์ ์๋ค.
๊ทธ๋ฌ๋ any
ํ์
์ ์ฌ์ฉํ๋ฉด ํ์
์ ์ถ๋ก ํ ์ ์์ด, ์๋์์ฑ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ธฐ๊ฐ ์ด๋ ต๋ค.
๋ํ ์ฝ๋์ ๊ฐ๋ ์ฑ์ ๋์ผ ์ ์๋ค.
let value: string | number | boolean;
์ด๋ ๊ฒ string | number | boolean
ํ์
์ผ๋ก ์ ์ธ๋ ๋ณ์๋ ๋ฌธ์์ด, ์ซ์, ๋ถ๋ฆฌ์ธ ํ์
์ค
ํ๋์ ๊ฐ์ ๊ฐ์ง ์ ์๋ค๋ ๊ฒ์ด ๋ช
์์ ์ผ๋ก ํ์๋์ด ์ฝ๋๋ฅผ ์ดํดํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค์ด ์ค๋ค.
์ ๋์จ(Union) ํ์ ์ฌ์ฉ ์ ์ ์ํ ์
์ ๋์จ ํ์ ์ธ ๊ฐ์ด ์์ผ๋ฉด, ์ ๋์จ์ ์๋ ๋ชจ๋ ํ์ ์ ๊ณตํต์ธ ๋ฉค๋ฒ๋ค์๋ง ์ ๊ทผํ ์ ์๊ธฐ ๋๋ฌธ์ ์ ์ํด์ผ ํ๋ค.
interface Developer {
name: string;
skill: string;
}
interface Person {
name: string;
age: number;
}
์ด๋ ๊ฒ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ Developer
์ Person
์ ์ ์ํ๋ค.
function askSomeone(someone: Developer | Person) {
console.log(someone.name);
}
๊ทธ๋ฌ๋ ์ค์ง์ ์ผ๋ก askSomenone
ํจ์ ๋ด๋ถ์์๋ Developer
์ Person
์ด
๊ฐ๊ณ ์๋ ๊ณตํต ํ๋กํผํฐ์ธ name
์๋ง ์ ๊ทผํ ์ ์๋ค.
์๋ํ๋ฉด ๊ณตํต๋๊ณ ๋ณด์ฅ๋ ํ๋กํผํฐ๋ง ์ ๊ณตํด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
๋ง์ฝ ๋๋จธ์ง ํ๋กํผํฐ์๋ ์ ๊ทผํ๊ณ ์ถ๋ค๋ฉด ํ์ ๊ฐ๋๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
๐ก ํ์ ๊ฐ๋(Type Guard)๋?
TypeScript์์ ํ์ ์ ๋ณดํธํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ๊ธฐ๋ฅ ์ค ํ๋์ด๋ค.
ํ์
๊ฐ๋๋ ํน์ ์ฝ๋ ๋ธ๋ก์์ ํ์
์ ๋ฒ์๋ฅผ ์ ํํด
ํด๋น ์ฝ๋ ๋ธ๋ก ์์์ ํ์
์์ ์ฑ์ ๋ณด์ฅํด ์ค๋ค.
์๋ ์ฝ๋๋ ํ์ ๊ฐ๋๋ฅผ ์ฌ์ฉํด ์์ฑ๋ ์ฝ๋์ด๋ค.
function askSomeone(someone: Developer | Person) {
// in ์ฐ์ฐ์ : ํ์
์คํฌ๋ฆฝํธ์์ ๊ฐ์ฒด์ ์์ฑ์ด ์กด์ฌํ๋์ง๋ฅผ ์ฒดํฌํ๋ ์ฐ์ฐ์
// in ์ฐ์ฐ์๋ ๊ฐ์ฒด์ ์์ฑ ์ด๋ฆ๊ณผ ํจ๊ป ์ฌ์ฉํ์ฌ ํด๋น ์์ฑ์ด ๊ฐ์ฒด ๋ด์ ์กด์ฌํ๋์ง ์ฌ๋ถ๋ฅผ ๊ฒ์ฌ
if ('skill' in someone) {
console.log(someone.skill);
}
if ('age' in someone) {
console.log(someone.age);
}
}
TypeScript์์๋ in
์ฐ์ฐ์๋ฅผ ์ ๊ณตํ๊ณ ์๋ค.
in
์ฐ์ฐ์๋ ๊ฐ์ฒด์ ํ๋กํผํฐ ์ด๋ฆ๊ณผ ํจ๊ป ์ฌ์ฉ๋๋ฉฐ,
ํด๋น ํ๋กํผํฐ๊ฐ ๊ฐ์ฒด ๋ด์ ์กด์ฌํ๋์ง ์ฌ๋ถ๋ฅผ ๊ฒ์ฌํ๋ค.
์ธํฐ์น์ (Intersection)์ ๋ ์ด์์ ํ์ ์ ๊ฒฐํฉํ์ฌ ์๋ก์ด ํ์ ์ ๋ง๋๋ ๋ฐฉ๋ฒ์ด๋ค.
&
์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ํํํ๋ค.
interface Developer {
name: string;
skill: string;
}
interface Person {
name: string;
age: number;
}
type User = Developer & Person;
์ด๋ฐ ์์ผ๋ก ํ์
์ ๊ฒฐํฉํด ์ฌ์ฉํ ์ ์๋ค.
์ฌ๊ธฐ์ User
๋ณ์๋ Developer
, Person
๊ฐ๊ฐ์ ์ ์๋ ์์ฑ ๋ชจ๋๋ฅผ ๋ฐ๊ฒ ๋๋ค.
์ฌ๊ธฐ์ type
์ ์ถํ ๋์ฌ ํ์
๋ณ์นญ์์ ๋ฐฐ์ฐ๊ฒ ๋๋ฏ๋ก,
์ง๊ธ์ ์ธํฐ์น์
ํ์
์ ์ด๋ป๊ฒ ์ฌ์ฉํ๋ ์ง์ ๋ํด์๋ง ์ง์คํ๊ฒ ๋ค.
์ด๋ฐ ์์ผ๋ก ์ธํฐ์น์ ์ผ๋ก ํ์ ์ ์ฐ๊ฒฐํด ํ๋์ ๋จ์ผ ํ์ ์ผ๋ก ํํํ ์ ์๊ธฐ ๋๋ฌธ์, ํ์ ๊ฐ๋๊ฐ ํ์ํ์ง ์๋ค.
interface Developer {
name: string;
skill: string;
}
interface Person {
name: string;
age: number;
}
function askSomeone(someone: Developer & Person) {
console.log(someone.age);
console.log(someone.name);
console.log(someone.skill);
}
์์ ์ฝ๋๋ ์ธํฐ์น์
ํ์
์ ์ฌ์ฉํ์ฌ Developer
์ Person
์ ํ๋์ ํ์
์ผ๋ก ๋ฌถ์๋ค.
๋ฐ๋ผ์ askSomeone
ํจ์ ๋ด์์ ์ ์๋ ํ๋กํผํฐ์ ์ ๋ถ ์ ๊ทผํ ์ ์๋ค.
๊ทธ๋ฌ๋ ์ธํฐ์น์
ํ์
์ ํ์
๊ฐ๋๋ ํ์ ์๋ ๋ฐ๋ฉด Developer
์ Person
์ด๋ผ๋ ์๋ก์ด
๊ต์งํฉ์ ๋ง๋ค์ด ๋ด๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, ์ ๋ฌ์ธ์๋ฅผ ์ ๋ฌํ ๋ ๋ชจ๋ ํ๋กํผํฐ๋ฅผ ์ ๋ถ ๋ณด๋ด์ค์ผ๋ง ํ๋ค.
๋ฐ๋๋ก ์ ๋์จ ํ์ ์ ํ์ ๊ฐ๋๋ฅผ ํด์ค์ผ ํ์ง๋ง ์ ๋ฌ์ธ์๋ฅผ ์ ๋ฌํ ๋ ์ ํ์ง๊ฐ ์๊ธฐ๊ฒ ๋๋ค.
interface Developer {
name: string;
skill: string;
}
interface Person {
name: string;
age: number;
}
function askSomeone(someone: Developer | Person) {
// ์ด๋ฐ ์์ผ๋ก ํ๋กํผํฐ์ ์ ๊ทผํ ์ ์๋ค.
if ('skill' in someone) {
console.log(someone.skill);
}
if ('age' in someone) {
console.log(someone.age);
}
}
// ์ ๋์จ ํ์
์ ์ ๋ฌ์ธ์๋ฅผ ์ ๋ฌํ ๋ ์ ํ์ง๊ฐ ์๊ธด๋ค.
askSomeone({name: '๊น์ฝ๋ฉ', skill: '์น ๊ฐ๋ฐ'});
askSomeone({name: '๊น์ฝ๋ฉ', age: 20});
function askSomeone2(someone: Developer & Person) {
// ํ์
๊ฐ๋๋ฅผ ์ฌ์ฉํ์ง ์์๋ ๋ชจ๋ ํ๋กํผํฐ์ ์ ๊ทผํ ์ ์๋ค.
console.log(someone.age);
console.log(someone.name);
console.log(someone.skill);
}
// ๊ทธ๋ฌ๋ ์ธํฐ์น์
ํ์
์ผ๋ก ๊ฒฐํฉํ๊ฒ ๋๋ค๋ฉด ์ ๋ฌ์ธ์๋ฅผ ์ ๋ฌํ ๋ ์ ํ์ง๊ฐ ์๋ค.
askSomeone2({name: '๊น์ฝ๋ฉ', skill: '์น ๊ฐ๋ฐ', age:20});
TypeScript์ ์ด๊ฑฐํ(Enum)์ ํน์ ๊ฐ์ ์งํฉ์ ์ ์ํ ๋ ์ฌ์ฉ๋๋ค.
JavaScript์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๊ฑฐํ์ ์ง์ํ์ง ์์ง๋ง,
TypeScript์์๋ ๋ฌธ์ํ ์ด๊ฑฐํ๊ณผ ์ซ์ํ ์ด๊ฑฐํ์ ์ง์ํ๋ค.
enum Color {
Red,
Green,
Blue,
}
์ ์์ ์์๋ Color
๋ผ๋ ์ด๊ฑฐํ์ ์ ์ํ๊ณ ์๋ค. ์ด๊ฑฐํ์ ๊ฐ์ Red
, Green
, Blue
์ธ ๊ฐ์ด๋ค.
์ซ์ํ ์ด๊ฑฐํ(Enum)
์ด๊ฑฐํ์ ์ซ์ํ๊ณผ ๋ฌธ์์ดํ, ํน์ ์ด ๋์ ์กฐํฉ์ผ๋ก ์ ์๋ ์ ์๋ค.
๋ํดํธ ๊ฐ์ผ๋ก ์ซ์ํ์ ์ฌ์ฉํ๋ฉฐ, ๊ฐ ๊ฐ์ ์๋์ผ๋ก 0๋ถํฐ ์์ํ์ฌ 1์ฉ ์ฆ๊ฐํ๋ค.
๊ทธ๋ฌ๋ ๋ค์๊ณผ ๊ฐ์ด ์๋์ผ๋ก ๊ฐ์ ์ง์ ํ ์๋ ์๋ค.
enum Color {
Red = 1,
Green = 2,
Blue = 4,
}
์ ์์ ์์๋ Red
๊ฐ 1, Green
์ด 2, Blue
๊ฐ 4๋ก ์ ์๋์๋ค.
์ด๊ฑฐํ์ ๊ฐ์ ๋ํด ์ฐ์ ์ฐ์ฐ์ ์ํํ ์๋ ์๋ค.
enum Color {
Red = 1,
Green = 2,
Blue = 4,
}
let c: Color = Color.Green;
let greenValue: number = Color.Green;
let blueValue: number = Color.Blue;
console.log(c); // ์ถ๋ ฅ: 2
console.log(greenValue); // ์ถ๋ ฅ: 2
console.log(blueValue); // ์ถ๋ ฅ: 4
์ด๊ฑฐํ์ ์ผ๋ฐ์ ์ผ๋ก ์์๊ฐ์ ๋์ ํ์ฌ ์ฌ์ฉ๋๋ฏ๋ก, ํ์
์คํฌ๋ฆฝํธ์์๋ ์ด๊ฑฐํ์ด ๋ง์ด ์ฌ์ฉ๋๋ค.
์ด๊ฑฐํ์ ์ฝ๋๋ฅผ ๋์ฑ ๊ฐ๋
์ฑ ๋๊ฒ ๋ง๋ค์ด์ฃผ๊ณ , ์คํ์ ๊ฐ์ ์ค์๋ฅผ ๋ฐฉ์งํด์ค๋ค.
๋ฌธ์ํ ์ด๊ฑฐํ(Enum)
๋ฌธ์ํ ์ด๊ฑฐํ์ ์์์ ์ดํด๋ณธ ์ซ์ํ ์ด๊ฑฐํ๊ณผ ๊ฐ๋
์ ์ผ๋ก๋ ๊ฑฐ์ ๋น์ทํ๋ค.
๋ฌธ์ํ ์ด๊ฑฐํ์ ์ด๊ฑฐํ์ ๊ฐ์ ์ ๋ถ ๋ค ํน์ ๋ฌธ์ ๋๋ ๋ค๋ฅธ ์ด๊ฑฐํ ๊ฐ์ผ๋ก ์ด๊ธฐํํด์ผ ํ๋ค.
enum Direction {
Up = "UP",
Down = "DOWN",
Left = "LEFT",
Right = "RIGHT",
}
let myDirection: Direction = Direction.Up;
console.log(myDirection); // ์ถ๋ ฅ: "UP"
์ ์ฝ๋๋ Direction
์ด๋ผ๋ ๋ฌธ์์ด ๊ธฐ๋ฐ์ ์ด๊ฑฐํ(Enum)์ ์ ์ํ๊ณ ์์ต๋๋ค.
Up
, Down
, Left
, Right
๊ฐ๊ฐ์๋ ๋ฌธ์์ด ๊ฐ์ด ํ ๋น๋์ด ์๋ค.
๊ทธ๋ฆฌ๊ณ myDirection
๋ณ์๋ฅผ Direction.Up
์ผ๋ก ์ด๊ธฐํํ๊ณ ์๋ค.
์ถ๋ ฅ ๊ฒฐ๊ณผ๋ก๋ "UP"
์ด ๋์ค๊ฒ ๋๋ค.
๋ํ ๋ฌธ์ํ ์ด๊ฑฐํ์๋ ์ซ์ํ ์ด๊ฑฐํ๊ณผ๋ ๋ค๋ฅด๊ฒ auto-incrementing์ด ์๋ค.
๋์ ๋๋ฒ๊น
์ ํ ๋ ์ซ์ํ ์ด๊ฑฐํ์ ๊ฐ์ ๊ฐ๋ ๋ถ๋ช
ํํ๊ฒ ๋์ฌ ๋๊ฐ ์์ง๋ง
๋ฌธ์ํ ์ด๊ฑฐํ์ ํญ์ ๋ช
ํํ ๊ฐ์ด ๋์ ์ฝ๊ธฐ ํธํ๋ค.
๋ฌธ์์ด ๊ธฐ๋ฐ์ ์ด๊ฑฐํ์ ์ฃผ๋ก ์ธ๋ถ์์ ๊ฐ์ ธ์จ ๊ฐ์ TypeScript์์ ๋ค๋ฃจ๊ธฐ ์ํด์ ์ฌ์ฉ๋๋ค.
์๋ฅผ ๋ค์ด, HTTP ์์ฒญ ๋ฐฉ์์ ๋ํ๋ด๋ ์ด๊ฑฐํ์ ์ ์ํ ์ ์๋ค.
enum HttpMethod {
Get = "GET",
Post = "POST",
Put = "PUT",
Delete = "DELETE",
}
function makeRequest(url: string, method: HttpMethod) {
// ...
}
makeRequest("/api/data", HttpMethod.Post);
์ ์ฝ๋์์๋ HTTP ์์ฒญ ๋ฐฉ์์ ๋ํ๋ด๋ HttpMethod
์ด๊ฑฐํ์ ์ ์ํ๊ณ ์๋ค.
makeRequest
ํจ์๋ URL๊ณผ HTTP ์์ฒญ ๋ฐฉ์์ ์ธ์๋ก ๋ฐ์ต๋๋ค.
HTTP ์์ฒญ ๋ฐฉ์์ ์ง์ ํ ๋๋ HttpMethod.Post
์ ๊ฐ์ด ์ด๊ฑฐํ ๊ฐ์ ์ฌ์ฉํฉ๋๋ค.
์ด๋ ๊ฒ ์ด๊ฑฐํ์ ์ฌ์ฉํ๋ฉด ์คํ์ ๊ฐ์ ์ค์๋ฅผ ๋ฐฉ์งํ ์ ์์ผ๋ฉฐ, ์ฝ๋์ ๊ฐ๋ ์ฑ๊ณผ ์์ ์ฑ์ ๋์ผ ์ ์๋ค.
์ญ ๋งคํ (Reverse mappings)
์ญ ๋งคํ์ ์ซ์ํ ์ด๊ฑฐํ์๋ง ์กด์ฌํ๋ ํน์ง์
๋๋ค.
์ด๊ฑฐํ์ ํค(key
)๋ก ๊ฐ(value
)์ ์ป์ ์ ์๊ณ , ๊ฐ(value
)์ผ๋ก ํค(key
)๋ฅผ ์ป์ ์๋ ์๋ค.
enum Enum {
A
}
let a = Enum.A;
let nameOfA = Enum[a]; // "A"
์์ ๊ฐ์ด ์ด๊ฑฐํ์ ํค๋ก ๊ฐ์ ์ป์ ์ ์์ง๋ง, ๊ฐ์ผ๋ก๋ ์ด๊ฑฐํ์ ํค๋ฅผ ์ป์ ์ ์๋ค.
์ด๋ ์ซ์ํ ์ด๊ฑฐํ์๋ง ์กด์ฌํ๋ฉฐ, ๋ฌธ์ํ ์ด๊ฑฐํ์์๋ ์กด์ฌํ์ง ์๋ ํน์ง์ด๋ค.
TypeScript์์ ์ธํฐํ์ด์ค(Interface)๋ ์ผ๋ฐ์ ์ผ๋ก ํ์
์ฒดํฌ๋ฅผ ์ํด ์ฌ์ฉ์ด ๋๋ค. ์ธํฐํ์ด์ค๋ ๋ณ์, ํจ์, ํด๋์ค์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์ธํฐํ์ด์ค์ ์ ์ธ๋ ํ๋กํผํฐ ๋๋ ๋ฉ์๋์ ๊ตฌํ์ ๊ฐ์ ํ์ฌ ์ผ๊ด์ฑ์ ์ ์งํ๋๋ก ํ๋ค. JavaScript๋ ์ธํฐํ์ด์ค๋ฅผ ๋ฐ๋ก ์ง์ํ์ง ์์ง๋ง, TypeScript๋ ์ธํฐํ์ด์ค๋ฅผ ์ง์ํ๋ค. TypeScript์ ์์ฝ์ด์ธ interface
๋ฅผ ์ฌ์ฉํ์ฌ TypeScript ์ธํฐํ์ด์ค๋ฅผ ์์ฑํ ์ ์๋ค.
๐ก ์์ฝ์ด(reserved word) : ์ปดํจํฐ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ์ด๋ฏธ ๋ฌธ๋ฒ์ ์ธ ์ฉ๋๋ก ์ฌ์ฉ๋๊ณ ์๊ธฐ ๋๋ฌธ์ ์๋ณ์๋ก ์ฌ์ฉํ ์ ์๋ ๋จ์ด๋ฅผ ์๋ฏธํ๋ค. ์๋ฅผ ๋ค์ด return
, import
, const
, let
๋ฑ์ด ์์ผ๋ฉฐ, ์ด๋ฐ ๋จ์ด๋ค์ ํจ์์ ์ด๋ฆ์ด๋ ๋ณ์์ ์ด๋ฆ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
TypeScript์์ ๋ณ์๋ฅผ ์ ์ธํ ๋ ์ธํฐํ์ด์ค๋ฅผ ์๋์ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ค.
TypeScript์์ ์ธํฐํ์ด์ค๋ ๊ฐ์ฒด(Object)์ ๊ตฌ์กฐ๋ฅผ ์ ์ํ๊ธฐ ์ํด ์ฃผ๋ก ์ฌ์ฉ๋๋ ์์ฝ์ด์ด๋ค.
interface User {
name: string;
age: number;
}
// ์ ์์ ์ผ๋ก ์ ์ธ๋๋ค.
const user: User = {
name: "anna",
age: 20
}
// ํ๋กํผํฐ์ ์์๋ฅผ ์งํค์ง ์์๋ ์ ์์ ์ผ๋ก ์ ์ธ๋๋ค.
const user: User = {
age: 20,
name: "anna"
}
// ์ ์๋ ํ๋กํผํฐ๋ณด๋ค ์ ๊ฒ ์์ฑํ๊ธฐ ๋๋ฌธ์ ์๋ฌ๊ฐ ๋๋ค.
const user: User = {
name: "anna"
}
// ์ ์๋ ํ๋กํผํฐ๋ณด๋ค ๋ง์ด ์์ฑํ๊ธฐ ๋๋ฌธ์ ์๋ฌ๊ฐ ๋๋ค.
const user: User = {
name: "anna",
age: 20,
job: "developer"
}
์์ ์ฝ๋๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ ์ํ๊ธฐ ์ํด interface
์์ฝ์ด๋ฅผ ์ฌ์ฉํ์ฌ User
์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค์๋ค.
์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค ๋ ์์ฝ์ด๋ฅผ ์์ฑํ๊ณ , ์ธํฐํ์ด์ค์ ์ด๋ฆ์ ๋๋ฌธ์๋ก ์์ฑํ๋ค.
์ด๋ ๊ฒ ์ธํฐํ์ด์ค์ ์ด๋ฆ์ ๋๋ฌธ์๋ก ์์ํ๋ ๊ฒ์ *๋ค์ด๋ฐ ์ปจ๋ฒค์ ์ด๋ค.
๐ก ๋ค์ด๋ฐ ์ปจ๋ฒค์ (Naming Convention) : ์ด๋ฆ์ ์ง๋ ์ผ์ข ์ ๊ด๋ก์ด๋ค. TypeScript๋ก ๊ฐ๋ฐํ ๋ ๋๋ถ๋ถ์ ๊ฐ๋ฐ์๋ ์ธํฐํ์ด์ค์ ์ด๋ฆ์ ๋๋ฌธ์๋ก ์์ํ๋๋ก ์์ฑํ๋ค. ์ธํฐํ์ด์ค๋ ๊ฐ์ฒด์ ํ์ ์ ์ ์ํ๊ณ , ๊ฐ์ฒด๊ฐ ๋๋ฌธ์๋ก ์์ํ๋ ๊ฒ๊ณผ ์ ์ฌํ๊ธฐ ๋๋ฌธ์ ์ผ๊ด์ฑ ์๋ ์ฝ๋ ์์ฑ์ ์ํด ์ด๋ฌํ ๊ด๋ก๋ฅผ ๋ฐ๋ฅด๋ ๊ฒ์ด๋ค.
์ธํฐํ์ด์ค ๋ด์๋ name
๊ณผ age
๊ฐ ์ ์๋์ด ์๊ธฐ ๋๋ฌธ์, User
์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋ณ์๋ฅผ ์ ์ธํ ๋๋ ๋ฐ๋์ ์ ์๋ ํ๋กํผํฐ๋ฅผ ์ ๋ถ ์์ฑํด์ผ ํ๋ค. ๋ํ interface
๋ก ์ ์๋ ์์ฑ๋ง ์ง์ ํ ์ ์์ผ๋ฉฐ, ๊ทธ ์ธ ํ๋กํผํฐ๋ฅผ ์ถ๊ฐ๋ก ์์ฑํ๊ณ ์ ํด๋ ์ธํฐํ์ด์ค ๋ด์ ์ ์๋์ด ์์ง ์๊ธฐ ๋๋ฌธ์ ์ถ๊ฐ๋ก ํ๋กํผํฐ๋ฅผ ๋ ์์ฑํ์ฌ ์ ์ธํ ์ ์๋ค.
๊ทธ๋ฌ๋ ์ธํฐํ์ด์ค ์์ ๋ชจ๋ ํ๋กํผํฐ๊ฐ ํ์ํ ๊ฒ์ ์๋๋ฉฐ, ์ด๋ค ์กฐ๊ฑด์์๋ง ์กด์ฌํ๊ฑฐ๋
์์ ์์ ์๋ ์๊ธฐ ๋๋ฌธ์ ?
์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ์ ํ๋กํผํฐ๋ฅผ ์์ฑํ ์๋ ์๋ค.
interface User {
name: string;
age?: number;
}
// ์ ์์ ์ผ๋ก ์ ์ธ๋๋ค.
const user: User = {
name: "anna"
}
์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด์ ํ๋กํผํฐ ์ด๋ฆ๊ณผ ํ์
์ ์ ์ํ๊ณ ,
ํจ์์ ๋งค๊ฐ๋ณ์ ํ์
๊ณผ ๋ฐํ ํ์
๋ ์ ์ํ ์ ์๋ค.
interface User {
name: string;
age: number;
job: string;
}
interface Greeting {
(user: User, greeting: string): string;
}
const greet: Greeting = (user, greeting) => {
return `${greeting}, ${user.name}! Your job : ${user.job}.`;
}
const user: User = {
name: "anna",
age: 30,
job: "developer"
};
const message = greet(user, "Hi");
console.log(message);
์์ ์ฝ๋๋ User
์ธํฐํ์ด์ค ์ธ์๋ Greeting
์ธํฐํ์ด์ค๋ฅผ ์ถ๊ฐ๋ก ์์ฑํ์ฌ ํจ์ ํ์
์ ์ ์ํ๋ค.
Greeting
์ธํฐํ์ด์ค๋ User
ํ์
๊ณผ ๋ฌธ์์ด ํ์
์ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์ ๋ฌธ์์ด ํ์
์ ๋ฐํํ๋ค.
greet
ํจ์๋ Greeting
์ ์ฌ์ฉํ์ฌ ๊ตฌํ๋์์ผ๋ฉฐ,
user
๊ฐ์ฒด์ ๋ฌธ์์ด "hi"
๋ฅผ ์ ๋ฌ์ธ์๋ก ์ ๋ฌ๋ฐ์ ๋ฌธ์์ด์ ๋ฐํํ๋ค.
Greeting
์ธํฐํ์ด์ค์์ ์ด๋ฏธ greet
์ ๋งค๊ฐ ๋ณ์์ธ user
์ greeting
์ ํ์
๊ณผ ๋ฐํ ํ์
์ด ์์ฑ๋์ด ์๊ธฐ ๋๋ฌธ์, greet
ํจ์๋ string
ํ์
์ ๋ฐํํ๋ค๊ณ ๋ช
์ํ์ง ์์๋ ๋๋ฉฐ, ๋งค๊ฐ ๋ณ์์ ํ์
๋ํ ์์ฑํ์ง ์์๋ ๋๋ค.
ํด๋์ค์์๋ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ํด๋์ค์์๋ ์ธํฐํ์ด์ค๋ฅผ ์๋์ ๊ฐ์ด ์ฌ์ฉํ๋ค.
interface Calculator {
add(x: number, y: number): number;
substract(x: number, y: number): number;
}
class SimpleCalculator implements Calculator {
add(x: number, y:number) {
return x + y;
}
substract(x: number, y: number) {
return x - y;
}
}
const caculator = new SimpleCalculator();
console.log(caculator.add(4, 9)); //13
console.log(caculator.substract(10, 5)); //5
์์ ์ฝ๋์์ Calculator
์ธํฐํ์ด์ค๋ add
์ substract
๋ฉ์๋๋ฅผ ์ ์ํ๊ณ ์๊ณ ,
SimpleCaculator
ํด๋์ค๋ Calculator
์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ๋์๋ค.
Caculator
์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์ SimpleCaculator
ํด๋์ค ๋ด์๋
Calculator
์ธํฐํ์ด์ค ๋ด์ ์ ์๋ ๋ ๋ฉ์๋๋ฅผ ๋ฐ๋์ ์์ฑํด์ผ ํ๋ค.
JavaScript์์ ํด๋์ค๋ฅผ ํ์ฅํ ๋ extends
๋ผ๋ ํค์๋๋ฅผ ์ฌ์ฉํด
๊ธฐ์กด์ ์กด์ฌํ๋ ํด๋์ค๋ฅผ ์์ํด ์๋ก์ด ํด๋์ค๋ฅผ ์ ์ํ ์ ์๋ค.
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
sayHello() {
console.log(`Hello, my name is ${this.name} and I'm ${this.age} years old.`);
}
}
// Person ํด๋์ค๋ฅผ extends ํค์๋๋ฅผ ์ฌ์ฉํด ์์ํ์ฌ ์๋ก์ด ํด๋์ค์ธ Student๋ฅผ ์ ์ํ๋ค.
class Student extends Person {
constructor(name, age, grade) {
super(name, age);
this.grade = grade;
}
study() {
console.log(`${this.name} is studying hard for the grade ${this.grade}.`);
}
}
์ด๊ฐ์ด ์ธํฐํ์ด์ค๋ extends
๋ผ๋ ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ์กด์ ์กด์ฌํ๋ ์ธํฐํ์ด์ค๋ฅผ ์์ํด ํ์ฅ์ด ๊ฐ๋ฅํ๋ค.
์ด๋ ๊ฒ ํ๋ฉด ๊ธฐ์กด์ ์กด์ฌํ๋ ์ธํฐํ์ด์ค์ ํ๋กํผํฐ๋ฅผ ๋ค๋ฅธ ์ธํฐํ์ด์ค์
๋ณต์ฌํ๋ ๊ฒ์ ๊ฐ๋ฅํ๊ฒ ํด ์ฃผ๋ฉฐ, ์ธํฐํ์ด์ค์ ์ฌ์ฌ์ฉ์ฑ์ ๋์ฌ์ค๋ค.
interface Person {
name: string;
age: number;
}
interface Developer extends Person {
language: string;
}
const person: Developer = {
language: "TypeScript",
age: 20,
name: "Anna",
}
์ด๋ ๊ฒ ๊ธฐ์กด์ ์กด์ฌํ๋ Person
์ธํฐํ์ด์ค๋ฅผ extends
ํค์๋๋ก ์์ํด ์๋ก์ด ์ธํฐํ์ด์ค์ธ
Developer
๋ฅผ ๋ง๋ค๊ณ , Developer
์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ person
์ด๋ผ๋ ๊ฐ์ฒด๋ฅผ ๊ตฌํํ๋ค.
Developer
์ธํฐํ์ด์ค๋ Person
์ธํฐํ์ด์ค๋ฅผ ์์ํ๊ณ ์์ผ๋ฏ๋ก,
Person
๋ด๋ถ์ ํ๋กํผํฐ๋ฅผ ๊ทธ๋๋ก ๋ฐ์์ฌ ์ ์๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก ์ฌ๋ฌ ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์ ํ์ฅํ ์๋ ์๋ค.
ํด๋น ์ฝ๋์์๋ ํ์
๋จ์ธ(type assertion)์ ์ฌ์ฉํ๊ณ ์์ผ๋ฏ๋ก,
์ฝ๋๋ฅผ ๋ณธ ํ ํ์
๋จ์ธ์ ๋ํด์๋ ๋ณด๋๋ก ํ๊ฒ ๋ค.
interface FoodStuff {
name: string;
}
interface FoodAmount {
amount: number;
}
interface FoodFreshness extends FoodStuff, FoodAmount {
isFreshed: boolean;
}
const food = {} as FoodFreshness;
food.name = "egg";
food.amount = 2;
food.isFreshed = true;
์์ ์ฝ๋์์ food
๋ณ์์ ๊ฐ์ผ๋ก ๋น ๊ฐ์ฒด๋ฅผ ํ ๋นํ๋ ๋ถ๋ถ์ ๋ณด๊ฒ ๋ค.
์ฌ๊ธฐ์ as
๋ผ๋ ํค์๋๋ฅผ ์ด์ฉํ์ฌ ํด๋น ๊ฐ์ FoodFeshness
๋ผ๋ ํ์
์ผ๋ก ์ ์ํ๊ณ ์๋๋ฐ,
์ด๋ฌํ ๋ฌธ๋ฒ์ ํ์
๋จ์ธ(type assertion) ์ด๋ผ๊ณ ํ๋ค.
ํ์
๋จ์ธ์ ์ปดํ์ผ๋ฌ์๊ฒ ํน์ ํ์
์ ๋ณด์ ์ฌ์ฉ์ ๊ฐ์ ํ๊ฒ ํจ์ผ๋ก์จ,
์ปดํ์ผ๋ฌ๊ฐ ๊ฐ์ง ์ ๋ณด๋ฅผ ๋ฌด์ํ๊ณ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ํ๋ ์์์ ํ์
์ ๊ฐ์ ํ ๋นํ ์ ์๋ค.
ํ์
๋ณ์นญ(Type Aliases)์ ํ์
์ ์๋ก์ด ์ด๋ฆ์ ๋ง๋๋ ๊ฒ์ด๋ค.
์ด๋ ์๋ก์ด ์ด๋ฆ์ผ๋ก ๊ธฐ์กด์ ํ์
์ ์ฐธ์กฐํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
ํ์
๋ณ์นญ์ ์ด์ฉํ์ฌ ํ์
์ ์๋ก์ด ์ด๋ฆ์ ๋ง๋ค ๋ ํค์๋ type
์ ์ฌ์ฉํ์ฌ ์์ฑํ๋ค.
๊ฐ๋จํ ์์๋ฅผ ๋ณด๊ฒ ๋ค.
type MyString = string;
let str1: string = 'hello!';
// string ํ์
์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ค.
let str2: MyString = 'hello world!';
์๋ string
์ด๋ผ๋ ํ์
์ด ์กด์ฌํ๊ณ ์์๋ค. ์ด์ myString
์ด๋ผ๋ ์๋ก์ด ์ด๋ฆ์ ๋ถ์ฌํ๋ค.
์ฌ๊ธฐ์ myString
๊ณผ string
์ ๋์ผํ ์๋ฏธ๋ฅผ ๊ฐ๊ฒ ๋๋ค.
์ฆ, ํ์ ์ ์ ์ํ ์ ์๋ ๋ชจ๋ ๊ณณ์๋ ํ์ ๋ณ์นญ์ ์ธ ์ ์๋ค.
์ด๋ฐ ๋ฐฉ์์ผ๋ก ํ์
๋ณ์นญ์ ์ฌ์ฉํ๋ฉด ์ฝ๋๋ฅผ ๋ ๊ฐ๊ฒฐํ๊ณ ๊ฐ๋
์ฑ ์ข๊ฒ ๋ง๋ค ์ ์๋ค.
๋ํ ๋ณต์กํ ํ์
์ ๊ฐ๋ตํ๊ฒ ํํํ๊ณ , ํ์
์ ์๋ฅผ ์ฌ์ฌ์ฉํ๋ ๋ฑ ๊ฐ๋
์ฑ์ ๋์ผ ์ ์๋ค.
์๋์ ์์๋ฅผ ๋ณด๊ฒ ๋ค.
type Person = {
id: number;
name: string;
email: string;
}
// Commentary ์ธํฐํ์ด์ค์์ Person ํ์
์ ์ฐธ์กฐํ๊ณ ์๋ค.
interface Commentary {
id: number;
content: string;
user: Person;
}
// ๊ฐ์ฒด์์ Commentary ์ธํฐํ์ด์ค๋ฅผ ์ฐธ์กฐํ๊ณ ์๋ค.
let comment1: Commentary = {
id: 1,
content: "๋ญ์์?",
user: {
id: 1,
name: "๊น์ฝ๋ฉ",
email: "kimcoding@codestates.com",
},
}
// Commentary ์ธํฐํ์ด์ค ๋ด๋ถ์ content ํ๋กํผํฐ๊ฐ ์กด์ฌํ๊ธฐ ๋๋ฌธ์
// content ํ๋กํผํฐ๋ฅผ ์์ฑํ์ง ์์ผ๋ฉด ์ปดํ์ผ ์๋ฌ๊ฐ ๋๋ค.
let kimcoding: Commentary = {
id: 1,
user: {
id: 1,
name: "๊น์ฝ๋ฉ",
email: "kimcoding@codestates.com",
},
};
// Person ํ์
๋ด๋ถ์ isDeveloper ํ๋กํผํฐ๊ฐ ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์
// isDeveloper ํ๋กํผํฐ๋ฅผ ์์ฑํ ์ ์ปดํ์ผ ์๋ฌ๊ฐ ๋๋ค.
let kimcoding: Commentary = {
id: 1,
content: "๋ญ์์?",
user: {
id: 1,
name: "๊น์ฝ๋ฉ",
email: "kimcoding@codestates.com",
isDeveloper: true,
},
};
์ด์ฒ๋ผ ์ธํฐํ์ด์ค๋ ๋ค๋ฅธ ๋ณ์๋ฅผ ์ ์ํ ๋ ํ์
๋ณ์นญ์ผ๋ก
์ ์ํ ํ์
์ ์ฐธ์กฐํ๊ฒ ๋จ์ผ๋ก์จ ์ฝ๋๋ฅผ ๋ ๊ฐ๊ฒฐํ๊ณ ๊ฐ๋
์ฑ ์ข๊ฒ ๋ง๋ค ์ ์๋ค.
ํ์
๋ณ์นญ์ผ๋ก ๋ง๋ค์ด์ง ํ์
์ ์ฐธ์กฐํ ์์๋
์ธํฐํ์ด์ค์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ด๋ถ์ ์ ์๋ ํ๋กํผํฐ๋ฅผ ์ ๋ถ ์ฐธ์กฐํด์ผ๋ง ํ๋ค.
๋ํ ํ์
๋ณ์นญ์ผ๋ก ๋ง๋ค์ด์ง ํ์
๋ด๋ถ์ ์ ์๋ ํ๋กํผํฐ ์ธ์
๋ค๋ฅธ ํ๋กํผํฐ๋ฅผ ๋ ์์ฑํ๊ฒ ๋๋ฉด ๊ทธ ๋ํ ์ปดํ์ผ ์๋ฌ๊ฐ ๋๋ค.
์ธํฐํ์ด์ค vs ํ์ ๋ณ์นญ
ํ์ ๋ณ์นญ ๋ํ ์ธํฐํ์ด์ค์ ๊ฐ์ ํน์ง์ด ์๊ธฐ ๋๋ฌธ์, ์ธํฐํ์ด์ค์ ์ญํ ์ ํ์ ๋ณ์นญ์ด ์ํํ ์๋ ์๋ค.
๊ทธ๋ฌ๋ ์ธํฐํ์ด์ค์ ํ์ ๋ณ์นญ์๋ ๋ฏธ๋ฌํ ์ฐจ์ด์ ์ด ์๋ค.
type Person = {
name: string;
age: number;
}
interface User {
name: string;
age: number;
}
let kimcoding: Person = {
name: '๊น์ฝ๋ฉ',
age: 30,
}
let coding: User = {
name: '๊น์ฝ๋ฉ',
age: 30,
}
์์ ๊ฐ์ด ์ฝ๋๋ค์ด ์์ฑ๋์ด ์๋ค.
์์ฑํ๋ ๋์ ์ ์ํ ํ์ ์ด๋ ์ธํฐํ์ด์ค ๋ด๋ถ์ ์ด๋ค ํ๋กํผํฐ๊ฐ ๋ค์ด๊ฐ ์๋์ง ๊ธฐ์ต์ด ๋์ง ์์ ๊ฒฝ์ฐ๊ฐ ์๋ค.
๊ทธ๋์ kimcoding
์ด ์ฐธ์กฐํ๊ณ ์๋ Person
ํ์
๊ณผ, coding
์ด
์ฐธ์กฐํ๊ณ ์๋ User
์ธํฐํ์ด์ค์ ๊ฐ๊ธฐ ๋ง์ฐ์ค๋ฅผ ์ฌ๋ ค๋์ ๋ณด์๋ค.
VSCode๋ก ์์ฑ ์, kimcoding
๊ฐ์ฒด๊ฐ ์ฐธ์กฐํ๊ณ ์๋ Person
์ ๋ง์ฐ์ค๋ฅผ ์ฌ๋ฆฌ๋ฉด Person
๋ด๋ถ์ ์ด๋ค ํ๋กํผํฐ๋ค์ด ์ ์๋์ด ์๋์ง ๋ณด์ธ๋ค. ๊ทธ๋ฌ๋ coding
๊ฐ์ฒด๊ฐ ์ฐธ์กฐํ๊ณ ์๋ User
์ ๋ง์ฐ์ค๋ฅผ ์ฌ๋ฆฌ๋ฉด User ๋ด๋ถ์ ์ด๋ค ํ๋กํผํฐ๋ค์ด ์ ์๋์ด ์๋์ง ๋ณด์ด์ง ์๋๋ค.
๋ฐ๋ผ์ ํ์
๋ณ์นญ์ผ๋ก ์ ์ํ ํ์
์ผ๋ก ์์ฑํ ์์๋ ์กฐ๊ธ ๋ ํธํ๊ฒ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๊ฒ๋๋ค.
๋ ์ด๋ฌํ ์ฐจ์ด์ ์ด ์๋ค.
type Person = {
name: string;
age: number;
}
interface User {
name: string;
age: number;
}
// ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
type Students extends Person {
className: string;
}
// ์ ์์ ์ผ๋ก ๋์ํ๋ค.
interface Students extends User {
className: string;
}
// ์ ์์ ์ผ๋ก ๋์ํ๋ค.
interface Students extends Person {
className: string;
}
ํ์ ๋ณ์นญ์ ๋ง ๊ทธ๋๋ก ํ์ ์ ์๋ก์ด ์ด๋ฆ์ ๋ถ์ฌํ๋ ๊ฒ์์ ๊ทธ์น๊ธฐ ๋๋ฌธ์ ํ์ฅ์ด ๋์ง ์๋๋ค.
๊ทธ๋ฌ๋ ์ธํฐํ์ด์ค๋ ํ์ฅ์ด ๊ฐ๋ฅํ๋ค.
์ธํฐํ์ด์ค๋ ๊ธฐ์กด์ ์ธํฐํ์ด์ค ๋ฐ ํ์
๋ณ์นญ์ผ๋ก ๋ง๋ค์ด์ง ํ์
๋ ๋ค ์์ํ ์ ์๊ธฐ ๋๋ฌธ์,
์ ์ฐํ ์ฝ๋ ์์ฑ์ ์ํด์๋ ์ธํฐํ์ด์ค๋ก ๋ง๋ค์ด์ ํ์ํ ๋๋ง๋ค ํ์ฅํ ์ ์๋ค.
TypeScript๋ ์ ์ ํ์
์ ์ง์ํ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ด๋ค.
์ ์ ํ์
์์คํ
์ ์ฌ์ฉํ๋ฉด ์ฝ๋์ ์์ ์ฑ์ ๋์ด๊ณ ๋๋ฒ๊น
์ ์ฉ์ดํ๊ฒ ํ ์ ์๋ค.
TypeScript๋ ํ์ ์ถ๋ก (Type Inference)์ด๋ผ๋ ๊ธฐ๋ฅ์ ํตํด ์ฝ๋ ์์ฑ์ ๋์์ค๋ค.
ํ์ ์ถ๋ก (Type Inference)์ ๊ธฐ๋ณธ
ํ์
์ถ๋ก (Type Inference)์ ๋ณ์๋ ํจ์์ ํ์
์ ์ ์ธํ์ง ์์๋
TypeScript๊ฐ ์๋์ผ๋ก ์ ์ถํ๋ ๊ธฐ๋ฅ์ด๋ค. ์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์ดํด๋ณด๊ฒ ๋ค.
let isNumber = 123;
์ด ์ฝ๋์์๋ ๋ณ์ isNumber
๋ฅผ ์ ์ธํ๊ณ , ์ซ์ 123
์ ํ ๋นํ๋ค.
์ด ๊ฒฝ์ฐ, ํ์
์คํฌ๋ฆฝํธ๋ isNumber
์ ํ์
์ ์๋์ผ๋ก ์ซ์(Number)๋ก ์ถ๋ก ํ๋ค.
์ต์ ๊ณตํต ํ์ (Best common type)
TypeScript๋ ์ฌ๋ฌ ํํ์์์ ํ์
์ถ๋ก ์ด ๋ฐ์ํ ๋, ํด๋น ํํ์์ ํ์
์ ์ฌ์ฉํ์ฌ "์ต์ ๊ณตํต ํ์
"์ ๊ณ์ฐํ๋ค.
์๋์ ๊ฐ์ ์ฝ๋๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ๋ค.
let x = [0, 1, null];
์ ์์ ์ x
ํ์
์ ์ถ๋ก ํ๋ ค๋ฉด ๊ฐ ๋ฐฐ์ด ์์์ ํ์
์ ๊ณ ๋ คํด์ผ ํ๋ค.
์ฌ๊ธฐ์ ๋ฐฐ์ด์ ํ์
์ผ๋ก ๊ณ ๋ฅผ ์ ์๋ ๋ ๊ฐ์ง ํ๋ณด๊ฐ ์๋ค: number
์ null
์ด๋ค.
์ต์ ๊ณตํต ํ์
์๊ณ ๋ฆฌ์ฆ์ ๊ฐ ํ๋ณด์ ํ์
์ ๊ณ ๋ คํ์ฌ, ๋ชจ๋ ํ๋ณด์ ํ์
์ ํฌํจํ ์ ์๋ ํ์
์ ์ ํํ๋ค.
๋ฌธ๋งฅ์์ ํ์ดํ(Contextual Typing)
ํ์
์คํฌ๋ฆฝํธ์์ ํ์
์ ์ถ๋ก ํ๋ ๋ ํ๋์ ๋ฐฉ์์ ๋ฐ๋ก ๋ฌธ๋งฅ์์ผ๋ก ํ์
์ ๊ฒฐ์ ํ๋ ๊ฒ์ด๋ค.
์ด ๋ฌธ๋งฅ์์ ํ์ดํ(ํ์
๊ฒฐ์ )์ ์ฝ๋์ ์์น(๋ฌธ๋งฅ)๋ฅผ ๊ธฐ์ค์ผ๋ก ์ผ์ด๋๋ค. ๋ค์๊ณผ ๊ฐ์ ํจ์๋ฅผ ์ดํด๋ณด๊ฒ ๋ค.
function add(a, b) {
return a + b;
}
add
ํจ์๋ ๋ ๊ฐ์ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ์ ๋ํ ๊ฐ์ ๋ฐํํ๋ค.
ํ์ง๋ง ๋งค๊ฐ๋ณ์์ ํ์
์ด ๋ช
์๋์ด ์์ง ์๋ค.
์ด ๊ฒฝ์ฐ, ํ์
์คํฌ๋ฆฝํธ๋ ๋งค๊ฐ๋ณ์ a
์ b
์ ํ์
์ ์๋์ผ๋ก ์ถ๋ก ํ๋ค.
๋ง์ฝ ๋งค๊ฐ๋ณ์ a
์ b
๊ฐ ๋ชจ๋ ์ซ์(Number) ํ์
์ด๋ผ๋ฉด,
add
ํจ์์ ๋ฐํ ๊ฐ๋ ์ซ์(Number) ํ์
์ผ๋ก ์ถ๋ก ๋๋ค.
ํ์ ์ถ๋ก ์ ์ฅ์
์ด๋ฐ ํ์ ์ถ๋ก ์๋ ๋ช ๊ฐ์ง ์ฅ์ ์ด ์๋ค.
ํ์ ์ถ๋ก ์ ๋จ์
๊ทธ๋ฌ๋ ํ์ ์ถ๋ก ์ด ๋ ์ข์ ๊ฒ๋ง์ ์๋๋ค. ๋ช ๊ฐ์ง ๋จ์ ๋ ์๋ค.
๋ฐ๋ผ์, ํ์
์ถ๋ก ์ TypeScript์ ์ฅ์ ์ค ํ๋์ด์ง๋ง,
๋์ ๋ฐ๋ผ ๋ช
์์ ์ธ ํ์
์ง์ ์ด ํ์ํ ๊ฒฝ์ฐ๋ ์๋ค.
JavaScript์ TypeScript ๋ชจ๋ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์ง์ํ๋ฉฐ, ํด๋์ค(class)๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์๋ค.
๊ทธ๋ฌ๋ ๋ ์ธ์ด์ ํด๋์ค๋ ๋ช ๊ฐ์ง ์ฐจ์ด์ ์ด ์๋ค.
JavaScript์์ ํด๋์ค๋ ES6(ECMAScript 2015)์์ ์ฒ์ ๋์
๋์๋ค.
ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ฐ์ฒด์ ์์ฑ๊ณผ ๋ฉ์๋๋ฅผ ์ ์ํ ์ ์๋ค.
์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ JavaScript ํด๋์ค๋ฅผ ๋ง๋ค ์ ์๋ค.
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
greet() {
console.log(`์๋
ํ์ธ์, ์ ์ด๋ฆ์ ${this.name}์ด๊ณ , ${this.age}์ด ์
๋๋ค.`);
}
}
์ ์ฝ๋์์ Person
ํด๋์ค๋ name
๊ณผ age
์์ฑ์ ๊ฐ์ง๊ณ greet()
๋ฉ์๋๋ฅผ ์ ์ํ๋ค.
์ด ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ ์ ์๋ค.
const person = new Person('Alice', 30);
person.greet(); // "์๋
ํ์ธ์, ์ ์ด๋ฆ์ Alice์ด๊ณ , 30์ด ์
๋๋ค."
TypeScript์ ํด๋์ค๋ JavaScript์ ํด๋์ค์ ๋น์ทํ์ง๋ง ๋ช ๊ฐ์ง ์ถ๊ฐ๋ ๊ธฐ๋ฅ์ด ์๋ค.
์๋ฅผ ๋ค์ด, TypeScript์์๋ ํด๋์ค์ ์์ฑ๊ณผ ๋ฉ์๋์ ๋ํ ํ์
์ ๋ช
์ํ ์ ์๋ค.
๋ค์์ TypeScript์ ํด๋์ค ์์์ด๋ค.
class Person {
name: string;
age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
greet(): void {
console.log(`์๋
ํ์ธ์, ์ ์ด๋ฆ์ ${this.name}์ด๊ณ , ${this.age}์ด ์
๋๋ค.`);
}
}
์ ์ฝ๋์์ name
์์ฑ๊ณผ age
์์ฑ์ ๋ฌธ์์ด๊ณผ ์ซ์ ํ์
์ผ๋ก ์ ์๋์ด ์๋ค.
์ฝ๊ฐ์ ์ฐจ์ด์ ์ TypeScript์์ ํด๋์ค๋ฅผ ์ ์ํ ๋, constructor
๋ฅผ ์ด์ฉํ์ฌ
์ด๊ธฐํํ๋ ๋ฉค๋ฒ๋ค์ ์ ๋ถ ์๋จ์์ ์ ์๋ฅผ ํด์ค์ผ ํ๋ค๋ ๊ฒ์ด๋ค.
๋ํ contructor
๋ด ์ธ์๋ก ๋ฐ์ ๋๋ ์ ํํ ํ์
์ ๋ช
์ํด ์ค์ผ ํ๋ค.
const person = new Person('Alice', 30);
person.greet(); // "์๋
ํ์ธ์, ์ ์ด๋ฆ์ Alice์ด๊ณ , 30์ด ์
๋๋ค."
TypeScript๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋๋ ์์ ๊ฐ์ด JavaScript์ ๋น์ทํ ๋ฐฉ์์ผ๋ก ํ ์ ์๋ค.
ํด๋์ค์ ์์(Inheritance)
TypeScript์ ํด๋์ค(class)๋ ์ธํฐํ์ด์ค(interface)์ ๋ง์ฐฌ๊ฐ์ง๋ก
๊ธฐ์กด์ ์กด์ฌํ๋ ํด๋์ค๋ฅผ ์์๋ฐ์ ํ์ฅํ์ฌ ์๋ก์ด ํด๋์ค๋ฅผ ๋ง๋ค ์ ์๋ค.
์ด๋๋ extends
ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์์ํ ์ ์๋ค.
class Animal {
move(distanceInMeters: number): void {
console.log(`${distanceInMeters}m ์ด๋ํ์ต๋๋ค.`);
}
}
class Dog extends Animal {
speak(): void {
console.log("๋ฉ๋ฉ!");
}
}
const dog = new Dog();
dog.move(10);
dog.speak();
์์ ์ฝ๋์์ Animal
์ด๋ผ๋ ํด๋์ค๋ฅผ Dog
๋ผ๋ ํด๋์ค๊ฐ ์์๋ฐ๊ณ ์๋ค.
Dog
ํด๋์ค๋ Animal
ํด๋์ค๋ก๋ถํฐ ํ๋กํผํฐ์ ๋ฉ์๋๋ฅผ ์์๋ฐ์ผ๋ฉฐ,
Dog
ํด๋์ค๋ ํ์ ํด๋์ค๋ผ๊ณ ๋ ๋ถ๋ฆฌ๋ฉฐ, ํ์ํด๋์ค(subclasses)๋ผ๊ณ ๋ ๋ถ๋ฆฐ๋ค.
์ฌ๊ธฐ์ Animal
ํด๋์ค๋ ๊ธฐ์ด ํด๋์ค, ์์ํด๋์ค(superclasses)๋ผ๊ณ ๋ถ๋ฆฐ๋ค.
public, private ํค์๋
๊ธฐ๋ณธ์ ์ผ๋ก ํด๋์ค ๋ด์ ์ ์ธ๋ ๋ฉค๋ฒ๋ ์ธ๋ถ๋ก ๊ณต๊ฐ๋๋ ๊ฒ์ด ๋ํดํธ ๊ฐ์ด๋ค.
๊ทธ๋ฌ๋ ๊ณต๊ฐ๋๋ค๊ณ ๋ช
์์ ์ผ๋ก๋ ํ์ํด ์ค ์ ์๋ค. ์ด๋ public ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
class Person {
public name: string;
public age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
greet(): void {
console.log(`์๋
ํ์ธ์, ์ ์ด๋ฆ์ ${this.name}์ด๊ณ , ${this.age}์ด ์
๋๋ค.`);
}
}
ํน์ ์ธ๋ถ์ ๋๋ฌ๋ด์ง ์์ ๋ฉค๋ฒ๊ฐ ์๋ค๋ฉด private
ํค์๋๋ก ๋ช
์ํด ์ฃผ๋ฉด ๋๋ค.
class Person {
public name: string;
private age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
greet(): void {
console.log(`์๋
ํ์ธ์, ์ ์ด๋ฆ์ ${this.name}์ด๊ณ , ${this.age}์ด ์
๋๋ค.`);
}
}
readonly ํค์๋
readonly
ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ํ๋กํผํฐ๋ฅผ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ๋ง๋ค ์ ์๋ค.
์ฝ๊ธฐ ์ ์ฉ ํ๋กํผํฐ๋ค์ ์ ์ธ ๋๋ ์์ฑ์์์ ์ด๊ธฐํํด์ผ ํ๋ค.
class Mydog {
readonly name: string;
constructor(theName: string) {
this.name = theName;
}
}
let spooky = new Mydog("์คํธํค");
spooky.name = "๋ฉ์ง ์คํธํค"; // ์๋ฌ
์์ ์ฝ๋๋ name
์ด readonly
๋ก ๋ช
์๋์ด ์๊ธฐ ๋๋ฌธ์, ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ค.
์ด๋ฐ ์์ผ๋ก ๋ณ๊ฒฝ๋๋ฉด ์ ๋ ๊ฐ์ readonly
๋ก ๋ช
์ํ์ฌ ๋ณดํธํ ์ ์๋ค.
ํ์ ์คํฌ๋ฆฝํธ์ ์ ๋ค๋ฆญ(Generic)์ ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๊ณ ํ์ ์์ ์ฑ์ ๋ณด์ฅํ๋ ๊ธฐ๋ฅ์ด๋ค.
์ ๋ค๋ฆญ์ ์ฌ์ฉํ๋ฉด ํจ์๋ ํด๋์ค๋ฅผ ์์ฑํ ๋, ์ฌ์ฉ๋ ๋ฐ์ดํฐ์ ํ์
์ ๋ฏธ๋ฆฌ ์ง์ ํ์ง ์๊ณ ,
์ดํ์ ํจ์๋ ํด๋์ค๋ฅผ ํธ์ถํ ๋ ์ธ์๋ก ์ ๋ฌ๋ ๋ฐ์ดํฐ์ ํ์
์ ๋ฐ๋ผ ์๋์ผ๋ก ํ์
์ ์ถ๋ก ํ๊ฒ ๋๋ค.
์๋์ ๊ฐ์ ์ฝ๋๊ฐ ์๋ค.
function printLog(text) {
return text;
}
์์ printLog
ํจ์๋ ํ๋ผ๋ฏธํฐ๋ก text
๋ฅผ ๋ฐ๊ณ ์์ผ๋ฉฐ, ๋ฐํ ๊ฐ์ผ๋ก text
๋ฅผ ๋ฆฌํดํ๊ณ ์๋ค.
์ด๋ฅผ ์ ๋ค๋ฆญ ์์ด ๊ตฌํํ๋ค๋ฉด ์๋์ ๊ฐ์ด ๊ตฌํํ ์ ์์ ๊ฒ์ด๋ค.
function printLog(text: string): string {
return text;
}
printLog('hello'); // ์ ์
printLog(123); //์๋ฌ
์ฒซ ๋ฒ์งธ ํจ์๋ printLog
ํจ์์ ํน์ ํ์
์ ์ฃผ์ด ์์ฑํ ์ฝ๋์ด๋ค.
ํ์
์ ๋ช
์๋์์ง๋ง, string
ํ์
์ธ์ ๋ค๋ฅธ ํ์
์ด ๋ค์ด์จ๋ค๋ฉด ์ปดํ์ผ ์๋ฌ๊ฐ ๋ ๊ฒ์ด๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ ์ค๋ณต์ผ๋ก ํจ์๋ฅผ ์ ์ธํ๋ ๋ฐฉ๋ฒ์ด ์์ ๊ฒ์ด๋ค.
function printLog(text: string): string {
return text;
}
function printLogNumber(text: number): number {
return text;
}
printLog('hello'); // ์ ์
printLogNumber(123); //์ ์
๊ทธ๋ฌ๋ ์ด ๋ฐฉ๋ฒ์ ํ์
์ ๊ฐ๋
์ฑ ๋ฐ ์ ์ง๋ณด์์ฑ์ด ๋๋น ์ง๋ค.
ํ์
์ ๋ค๋ฅด๊ฒ ๋ฐ๊ธฐ ์ํด ๊ฐ์ ์ฝ๋๋ฅผ ํ์
๋ง ๋ฐ๊ฟ์ ๋ช
์ํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
๋๋ |
์ฐ์ฐ์๋ฅผ ์ด์ฉํด ์ ๋์จ ํ์
์ผ๋ก ์ ์ธํ๋ ๋ฐฉ๋ฒ์ด ์์ ๊ฒ์ด๋ค.
function printLog(text: string | number) {
return text;
}
printLog('hello'); // ์ ์
printLogNumber(123); //์ ์
์ด ๋ฐฉ๋ฒ์ ๋ค์ด๊ฐ๋ ์ธ์๋ ํด๊ฒฐ์ด ๋์ง๋ง, ํจ์ ๋ด์์ string
๊ณผ number
๊ฐ ๋ ๋ค ์ ๊ทผํ ์ ์๋ API๋ง ์ ๊ณตํ๋ค.
์ด ์ธ์๋ ํ์
์ด ์ ํํ ์ถ๋ก ๋์ง ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ ์ ์๋ค.
์ด์ด any
ํ์
์ ์ฌ์ฉํด ์์ฑํ ์ฝ๋์ด๋ค.
function printLog(text: any): any {
return text;
}
์ด ๋ฐฉ๋ฒ์ ์ด๋ค ํ์ ์ด๋ ๋ฐ์ ์ ์์ง๋ง ์ค์ ๋ก ํจ์๊ฐ ๋ฐํํ ๋ ์ด๋ค ํ์ ์ธ์ง ์ถ๋ก ํ ์ ์๊ฒ ๋๋ค.
๋ฐ๋ผ์ ์ ๋ค๋ฆญ์ ์ฌ์ฉํ๊ฒ ๋ ํ์์ฑ์ด ์๊ธด๋ค.
์ ๋ค๋ฆญ์ ์ฌ์ฉํ๋ฉด ์ด์ ๊ฐ์ด ์์ฑํ ์ ์๋ค.
function printLog<T>(text: T): T {
return text;
}
printLog
ํจ์์ T
๋ผ๋ ํ์
๋ณ์๋ฅผ ์ถ๊ฐํ๋ค.
T
๋ ์ ์ ๊ฐ ์ค ํ๋ผ๋ฏธํฐ์ ํ์
์ ์บก์ฒํ๊ณ , ์ด ์ ๋ณด๋ฅผ ๋์ค์ ์ฌ์ฉํ ์ ์๊ฒ ํ๋ค.
์ฌ๊ธฐ์์๋ T
๋ฅผ ๋ฐํ ํ์
์ผ๋ก ๋ค์ ์ฌ์ฉํ๋ค.
๋ฐ๋ผ์ ํ๋ผ๋ฏธํฐ์ ๋ฐํ ํ์ ์ด ๊ฐ์ ํ์ ์ ์ฌ์ฉํ๊ณ ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
printLog
ํจ์๋ ํ์
์ ๋ถ๋ฌธํ๊ณ ๋์ํ๋ฏ๋ก ์ ๋ค๋ฆญ์ด๋ผ ํ ์ ์๋ค.
any
๋ฅผ ์ฐ๋ ๊ฒ๊ณผ๋ ๋ค๋ฅด๊ฒ ์ธ์์ ๋ฐํ ํ์
์ string
์ ์ฌ์ฉํ
์ฒซ ๋ฒ์งธ printLog
ํจ์๋งํผ ์ ํํ๋ค. ์ฆ ํ์
์ ์ถ๋ก ํ ์ ์๊ฒ ๋๋ค.
์ด๋ ๊ฒ ์ ๋ค๋ฆญ์ ์์ฑํ๊ณ ๋๋ฉด ์๋์ ๊ฐ์ด ์์ฑํ ์ ์๋ค.
const str = printLog<string>('hello');
์ฌ๊ธฐ์ ํจ์๋ฅผ ํธ์ถํ ๋์ ์ธ์ ์ค ํ๋๋ก์จ T
๋ฅผ string
ํ์
์ผ๋ก
๋ช
์ํด ์ฃผ๊ณ ํ์
์ฃผ๋ณ์ <>
๋ก ๊ฐ์ธ์ฃผ์๋ค.
ํน์ ํ์ ์ถ๋ก ๊ธฐ๋ฅ์ ํ์ฉํด์ ์์ฑํ ์ ์๋ค.
const str = printLog('hello');
์ด๋ ํ์
์ถ๋ก ๊ธฐ๋ฅ์ ํ์ฉํด ์์ฑํ ์ฝ๋์ด๋ค.
์ ๋ฌํ๋ ์ธ์์ ๋ฐ๋ผ ์ปดํ์ผ๋ฌ๊ฐ ์๋์ผ๋ก T
์ ๊ฐ์ ์ ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
์ด๋ ํ์ ์ด ๋ณต์กํด์ ธ ์ปดํ์ผ๋ฌ๊ฐ ํ์ ์ ์ ์ถํ ์ ์๊ฒ ๋๋ ๊ฒฝ์ฐ์๋ ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ด๋ค.
์ธํฐํ์ด์ค์๋ ์ ๋ค๋ฆญ์ ์ฌ์ฉํ ์ ์๋ค.
interface Item<T> {
name: T;
stock: number;
selected: boolean;
}
์ด์ ๊ฐ์ด ์์ฑํ๋ฉด Item
์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋ง๋ ๊ฐ์ฒด๋ name
์ ๊ฐ์ผ๋ก ์ด๋ค ํ์
์ด
๋ค์ด๊ฐ์ง๋ง ์์ฑ์ ํด์ฃผ๋ฉด ์ธํฐํ์ด์ค๋ฅผ ์ฌ๋ฌ ๊ฐ ๋ง๋ค์ง ์๊ณ ๋ ์ฌ์ฌ์ฉ์ ํ ์ ์๊ฒ ๋๋ค.
const obj: Item<string> = {
name: "T-shirts",
stock: 2,
selected: false
};
const obj: Item<number> = {
name: 2044512,
stock: 2,
selected: false
};
์ด๋ฐ ์์ผ๋ก ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ๋ผ ์ ์๊ฒ ๋๋ค.
์ ๋ค๋ฆญ์ ์ฌ์ฉํ๋ TypeScript์์ ํฉํ ๋ฆฌ๋ฅผ ์์ฑํ ๋ ์์ฑ์ ํจ์๋ก ํด๋์ค ํ์ ์ ์ฐธ์กฐํด์ผ ํ๋ค.
class GenericNumber<T> {
zeroValue: T;
add: (x: T, y: T) => T;
}
let myGenericNumber = new GenericNumber<number>();
myGenericNumber.zeroValue = 0;
myGenericNumber.add = function(x, y) { return x + y; };
์ด๊ฒ์ GenericNumber
ํด๋์ค์ ๋ฌธ์ ๊ทธ๋๋ก ์ฌ์ฉํ์ง๋ง number
ํ์
๋ง ์ฐ๋๋ก ์ ํํ๋ ๊ฒ์ ์๋ค.
๋์ string
์ด๋ ํจ์ฌ ๋ณต์กํ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์ ๋ค๋ฆญ์ ์ฌ์ฉํ๊ธฐ ์์ํ๋ฉด, printLog
์ ๊ฐ์ ์ ๋ค๋ฆญ ํจ์๋ฅผ ๋ง๋ค ๋,
์ปดํ์ผ๋ฌ๊ฐ ํจ์ ๋ณธ๋ฌธ์ ์ ๋ค๋ฆญ ํ์
ํ๋ ๋งค๊ฐ๋ณ์๋ฅผ ์ฐ๋๋ก ๊ฐ์ํ๋ค.
์์ ๋ณธ printLog
ํจ์๋ฅผ ์์๋ก ๋ณด๊ฒ ๋ค.
function printLog<T>(text: T): T {
console.log(text.length);
return text;
}
์์ ๊ฐ์ด console.log(text.length);
๋ฅผ ์์ฑํ๊ฒ ๋๋ฉด ์ปดํ์ผ ์๋ฌ๊ฐ ๋๋ค.
์๋ํ๋ฉด ๊ฐ๋ฐ์๊ฐ string
ํ์
์ด ์๋ number
ํ์
์ ๋ณด๋ผ ์๋ ์๊ธฐ ๋๋ฌธ์,
T
์๋ .length
๊ฐ ์๋ค๋ ๊ฒ์ ์ถ๋ก ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋๋ ์ ๋ค๋ฆญ์ ํ์ ์ ์ค์ ์ ์ฐํ๊ฒ ํจ์์ ํ์ ์ ์ ์ํด ์ค ์ ์๋ค.
function printLog<T>(text: T[]): T[] {
console.log(text.length);
return text;
}
์ด ์ ๋ค๋ฆญ ํจ์ ์ฝ๋๋ ์ผ๋จ T
๋ผ๋ ๋ณ์ ํ์
์ ๋ฐ๊ณ , ์ธ์ ๊ฐ์ผ๋ก๋ ๋ฐฐ์ด ํํ์ T
๋ฅผ ๋ฐ๋๋ค.
๋ฐ๋ผ์ ์ ๋ค๋ฆญ ํ์
์ด ๋ฐฐ์ด์ด๊ธฐ ๋๋ฌธ์, .length
๋ฅผ ํ์ฉํ๊ฒ ๋๋ค.
ํน์ ๋ค์๊ณผ ๊ฐ์ด ์กฐ๊ธ ๋ ๋ช ์์ ์ผ๋ก ์์ฑ์ด ๊ฐ๋ฅํ๋ค.
function printLog<T>(text: Array<T>): Array<T> {
console.log(text.length);
return text;
}
์์ ์ ๋ค๋ฆญ ํ์ ๋ณ์ ์ธ์๋ ์ ๋ค๋ฆญ ํจ์์ ์ด๋ ์ ๋ ์ด๋ค ํ์ ์ด ๋ค์ด์ฌ ๊ฒ์ธ์ง ํํธ๋ฅผ ์ค ์ ์๋ค.
๋ค์ ์์ ๋ณธ printLog
ํจ์๋ฅผ ์์๋ก ๋ณด๊ฒ ๋ค.
function printLog<T>(text: T): T {
console.log(text.length);
return text;
}
์ธ์์ ํ์
์ ์ ์ธํ T
๋ ์์ง ์ด๋ค ํ์
์ธ์ง ๊ตฌ์ฒด์ ์ผ๋ก ์ ์ํ์ง ์์๊ธฐ ๋๋ฌธ์ length
์ฝ๋์์ ์ค๋ฅ๊ฐ ๋๋ค.
์ด๋ด ๋ ๋ง์ฝ ํด๋น ํ์
์ ์ ์ํ์ง ์๊ณ ๋ length
์์ฑ ์ ๋๋ ํ์ฉํ๋ ค๋ฉด ์๋์ ๊ฐ์ด ์์ฑํ๋ค.
interface TextLength {
length: number;
}
function printLog<T extends TextLength>(text: T): T {
console.log(text.length);
return text;
}
์ด์ ๊ฐ์ด extends
์ง์์๋ฅผ ์ด์ฉํด ์์ฑํ๊ฒ ๋๋ฉด ํ์
์ ๋ํ
๊ฐ์ ๋ ์๋์ง๋ง length
์ ๋ํด ๋์ํ๋ ์ธ์๋ง ๋๊ฒจ๋ฐ์ ์ ์๊ฒ ๋๋ค.
ํน์ keyof
๋ฅผ ์ด์ฉํด์ ์ ์ฝ์ ์ค ์๋ ์๋ค.
interface Item<T> {
name: T;
stock: number;
selected: boolean;
}
function printLog<T extends keyof Item>(text: T): T {
return text;
}
printLog('name'); //์ ์
pirntLog('key'); //์๋ฌ
์ ๋ค๋ฆญ์ ์ ์ธํ ๋ <T extends keyof Item>
๋ถ๋ถ์์ ์ฒซ ๋ฒ์งธ ์ธ์๋ก
๋ฐ๋ ๊ฐ์ฒด์ ์๋ ์์ฑ๋ค์ ์ ๊ทผํ ์ ์๊ฒ๋ ์ ํํ ์ ์๋ค.
์ด๋ฒ ๊ณผ์ ๋ ์ด๋ฒ ์ ๋์์ ํํ ๋ฆฌ์ผ๋ก ์ค์ตํ๋ ๋๋ก JavaScript ์ธ์ด๋ก ๋ง๋ค์ด์ง React App์ ํ๊ฒฝ์ TypeScript ์ธ์ด๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ํ๊ฒฝ์ ๊ตฌ์ฑํด ๋ณด๊ณ , JavaScript ์ธ์ด๋ก ์์ฑ๋ ์ปดํฌ๋ํธ๋ค์ TypeScript ์ธ์ด๋ก ๋ณํํ๋ ๊ณผ์ ์ ํ์ด์ ํจ๊ป ํด๊ฒฐํ๊ฒ ๋ฉ๋๋ค.
์ค์ ์ค๋ฌด์์๋ ์กด์ฌํ๋ ํ๋ก์ ํธ์ ํ๊ฒฝ์ ๋ณ๊ฒฝํด ๋ณด๊ณ ,
๊ธฐ์กด์ ์์ฑ๋์ด ์๋ ์ธ์ด๋ฅผ ๋ค๋ฅธ ์ธ์ด๋ก ๋ฐ๊พธ๋ ๊ณผ์ ์ ์ข
์ข
์์ต๋๋ค.
์ง๊ธ๊น์ง ๋ฐฐ์ด ๋ด์ฉ์ ๋ชจ๋ ์ข
ํฉํ์ฌ JavaScript ํ๊ฒฝ์์ ์์ฑ๋, React App์ TypeScript ํ๊ฒฝ์์ ๋ฆฌํฉํ ๋งํ๋ค.
TypeScript ์ธ์ด๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ํ๊ฒฝ ๊ตฌ์ฑํ๊ธฐ
์์ธ ์ปดํฌ๋ํธ ๊ตฌํํ๊ธฐ
ํ์ฌ ์ปดํฌ๋ํธ๋
์ด๋ค์ ์ด๋ฆ์