ν¨μμ λ§€κ° λ³μλ₯Ό μ νμ μΌλ‘ μ λ¬ λ°κ³ μΆμλ λ§€κ° λ³μλͺ λ€μ ?λ₯Ό μΆκ°
(()=>{
function user(name /*1οΈβ£*/: string, age?/*1οΈβ£2οΈβ£*/: number) {
console.log(name, age);
}
user('ν루', 5);
user('λ무'); // 3οΈβ£
})();
undefinedμ¬λ¬ μ’ λ₯μ νμ μ νμ©νκΈ° μν΄ | (OR μ°μ°μ) λ‘ μ°κ²°ν νμ
any νμ μ λͺ¨λ νμ μ νμ©νμ§λ§ μ λμΈ νμ μ | μ°μ°μλ‘ μ°κ²°λ νμ μ€ νλλ₯Ό νμ©
μ°μ°μμ μλ€κ° λ°λμ΄λ μκ΄μ΄ μλ€
μ½λ(ex06-05.ts)
(() => {
function logString(msg: string) {
console.log(msg);
}
logString("hello"); // 1οΈβ£
logString(123); // 2οΈβ£
// --------
function logNumber(msg: number) {
console.log(msg);
}
logNumber(235); // 1οΈβ£
logNumber("235");// 2οΈβ£
// --------
function log(msg: number | string) {
console.log(msg);
}
log(123); // 3οΈβ£
log("123"); // 3οΈβ£
})();
number, string μ΄ μμ, μ½λ(ex06-05-02.ts)
(() => {
function print(msg: number | string | boolean /*1οΈβ£*/) {
if (typeof msg === "string") { // 2οΈβ£
// stringμΌ κ²½μ°
console.log(`${msg} κΈμμ: ${msg.length}`);
}
if (typeof msg === "number") { // 2οΈβ£
// numberμΌ κ²½μ°
console.log(`${msg} + 10 = ${msg + 10}`);
}
if (typeof msg === "boolean") { // 2οΈβ£
// booleanμΌ κ²½μ°
console.log(`${msg}: ${msg ? "μ°Έ" : "κ±°μ§"}`);
}
}
print("world"); // 3οΈβ£
print(200); // 3οΈβ£
print(false);// 3οΈβ£
})();
number, string, boolean)μ νλνλ κ²μ¬νμ¬, μΌμΉνλ κ²½μ°μλ§ ν΄λΉ 쑰건문 μμ μ½λλ₯Ό μ€ννκ³ μΆλ ₯νκΈ° λλ¬Έμ΄λ€. νμ
μ΄ μ νν ꡬλΆλλ―λ‘ κ°κ° μλ§μ λ°©μμΌλ‘ μ²λ¦¬λμ΄ μ μ μΆλ ₯λλ€.κ°μ λ³μμ μ μ₯νλ―, νμ μ λ³μμ μ μ₯ν΄μ μ¬μ©
μ λμΈ νμ κ°μ 볡μ‘ν νμ μ μλ―Έ μλ μ΄λ¦μ λΆμ¬μ μ¬μ© (λ³μΉ)
type ν€μλλ‘ μ μΈνλ μ¬μ©μ μ μ νμ
λμΌν μ΄λ¦μΌλ‘ μ€λ³΅ μ μΈ λΆκ°
JSλ‘ μ»΄νμΌλλ©΄ μ κ±°λ¨
κ΄λ ¨μ μΈ λͺ λͺ κ·μΉ
μ½λ
(() => {
function logMessage(msg: string | number) {
console.log(msg);
}
function warnMessage(msg: number | string) {
// μ€νμΌ μ μ©
console.log(`%c${msg}`, "color: yellow; font-size: 20px;");
}
logMessage("hello");
logMessage(100);
warnMessage("bye");
warnMessage(200);
})();
(() => {
**type Massge = string | number; // 1οΈβ£
function logMessage(msg: Massge /* 2οΈβ£ */) {
console.log(msg);
}
function warnMessage(msg: Massge) {
// μ€νμΌ μ μ©
console.log(`%c${msg}`, "color: yellow; font-size: 20px;");
}
logMessage("hello");
logMessage(100);
warnMessage("bye");
warnMessage(200);
})();
κ°μ²΄μ μμ±λͺ κ³Ό μμ±κ°μ νμ μ μ§μ
μμ±μ , λλ ; μΌλ‘ ꡬλΆν μ μμ§λ§ 곡μ μ€νμΌ κ°μ΄λμμλ ;μ κΆμ₯
νμ λ³μΉμ νμ μΌλ‘ μ§μ ν κ°μ²΄λ νμ λ³μΉμ μ μλ μμ±λͺ κ³Ό μμ±μ νμ μ μ€μν΄μΌ ν¨
μ½λ(ex06-07.ts)
(() => {
type user = { // 1οΈβ£
name: string;
age: number;
};
const u1: user = { // 2οΈβ£
name: "ν루",
age: 1,
};
const u2: user = { // 2οΈβ£
name: "λ무",
age: 5,
};
console.log(u1.name); // 3οΈβ£
console.log(u2.age); // 3οΈβ£
})();
type ν€μλλ₯Ό μ΄μ©ν΄ userλΌλ νμ
λ³μΉμ μμ±νκ³ , name(string)κ³Ό age(number)μ νμ
ꡬ쑰λ₯Ό μ μν¨u1, u2λ user νμ
μ λͺ
μμ μΌλ‘ μ§μ νμ¬ κ°μ²΄λ₯Ό μμ±νμ. μ΄λ₯Ό ν΅ν΄ νμ
μμ μ±μ ν보ν¨u1.nameμ λ¬Έμμ΄(string)λ‘, u2.ageλ μ«μ(number)λ‘ νμ
μ΄ λ³΄μ₯λμ΄ κ°κ° μ μ μΆλ ₯λ¨νμ μ¬λ¬κ°λ₯Ό νλλ‘ ν©μΉκΈ° μν΄ &(AND μ°μ°μ) λ‘ μ°κ²°ν νμ
λμΌν μμ±μ μΈν°μΉμ
νμ
μΌλ‘ μΆκ°ν λ νμ
μ΄ λ€λ₯΄λ©΄ never νμ
μ΄ λλ©΄μ ν΄λΉ μμ±μ μ¬μ©μ΄ λΆκ°ν¨
μ½λ(ex06-08.ts)
(() => {
// ν μΌ λ±λ‘μ μ¬μ©
type TodoRegist = { // 1οΈβ£
title: string;
content: string;
};
// ν μΌ μ‘°νμ μ¬μ©
type TodoInfo = TodoRegist & { // 2οΈβ£
id: number;
done: boolean;
};
const todo1: TodoRegist = { // 3οΈβ£
title: "νμ
μ€ν¬λ¦½νΈ 곡λΆ",
content: "νμ
μ€ν¬λ¦½νΈ μμ
λλΉν΄μ 미리 μ±
μ½μ΄λ³΄κΈ°.",
};
const todo2: TodoInfo = { // 3οΈβ£
id: 13,
title: "νμ
μ€ν¬λ¦½νΈ 곡λΆ",
content: "νμ
μ€ν¬λ¦½νΈ μμ
λλΉν΄μ 미리 μ±
μ½μ΄λ³΄κΈ°.",
done: false,
};
console.log(todo1.title, ":", todo1.content);
console.log("todo2 ν©λ³Έ!: ", todo2.id, todo2.title,
todo2.content, todo2.done);
})();
TodoRegist νμ
μ λ§λ€μ΄ titleκ³Ό content μμ±μ κ°κ° string νμ
μ μ§μ TodoInfo νμ
μ TodoRegist νμ
μ μμλ°κ³ (& μ¬μ©), μΆκ°λ‘ id(number), done(boolean) μμ±μ νμ₯ν΄μ μ μtodo1μ TodoRegist νμ
μ λ°λ₯΄λ κ°μ²΄μ΄κ³ , todo2λ νμ₯λ TodoInfo νμ
μ λ°λ₯΄λ κ°μ²΄κ°μ²΄μ νμ μ μ μνκΈ° μν΄ μ¬μ©(κ°μ²΄μ μμ±λͺ κ³Ό μμ±κ°μ νμ μ μ§μ )
μμ±μ ,λλ ;μΌλ‘ ꡬλΆ
interface ν€μλλ‘ μ μΈνλ μ¬μ©μ μ μ νμ
μΈν°νμ΄μ€λ₯Ό νμ μΌλ‘ μ§μ ν κ°μ²΄λ ν΄λΉ μΈν°νμ΄μ€μ μ μλ μμ±λͺ κ³Ό μμ±μ νμ μ μ€μν΄μΌ ν¨
JSλ‘ μ»΄νμΌ νλ©΄ μ κ±°λ¨
μ½λ(ex06-07.ts, ex06-09.ts)
// ex06-07.ts
(() => {
type user = { // 1οΈβ£
name: string;
age: number;
};
const u1: user = {
name: "ν루",
age: 1,
};
const u2: user = {
name: "λ무",
age: 5,
};
console.log(u1.name);
console.log(u2.age);
})();
// ex06-09.ts
(() => {
interface User { // 1οΈβ£
name: string;
age: number;
}
const u1: User = {
name: "ν루",
age: 1,
};
const u2: User = {
name: "λ무",
age: 5,
};
console.log(u1.name);
console.log(u2.age);
})();
1οΈβ£ ex06-07.tsμ type, ex06-09.tsμ interfaceλ₯Ό μ¬μ©ν΄ user νμ
μ μ μν¨. λ λ€ name(string)κ³Ό age(number) μμ±μ κ°μ§
κΈ°λ³Έ μΈν°μΉμ μ¬μ©(ex06-10.ts): λ³μ, ν¨μμ λ§€κ° λ³μ, ν¨μμλ¦¬ν΄ νμ μ μ¬μ©
(() => {
interface User { // 1οΈβ£
name: string;
age: number;
}
const u1: User = { // 2οΈβ£
name: "ν루",
age: 1,
};
const u2: User = { // 2οΈβ£
name: "λ무",
age: 5,
};
console.log(u1.name);
console.log(u2.age);
const createUser = function (name: string, age: number): User {
return { name, age };
}; // 3οΈβ£
const u3: User = createUser("μ μ ν", 9);
console.log(u3.name);
function getAge(user: User): number { // 4οΈβ£
return user.age;
}
console.log(getAge(u1));
console.log(getAge(u2));
})();
UserλΌλ μ΄λ¦μΌλ‘ name(string)κ³Ό age(number)λ₯Ό κ°λ μΈν°νμ΄μ€λ₯Ό μμ±u1, u2 κ°μ²΄λ₯Ό User νμ
μΌλ‘ μ§μ νμ¬ νμ
μμ μ±μ ν보createUser ν¨μκ° User νμ
κ°μ²΄λ₯Ό λ°ννλλ‘ λ¦¬ν΄ νμ
μ μ§μ getAge ν¨μκ° λ§€κ°λ³μλ‘ User νμ
κ°μ²΄λ₯Ό λ°κ³ , κ·Έ κ°μ²΄μ age κ°μ λ°νν΄λμ€μ νμ μ§μ μ μ¬μ©
ν΄λμ€λͺ
λ€μ implements ν€μλ μΆκ°
μΈν°νμ΄μ€λ₯Ό νμ μΌλ‘ μ§μ ν ν΄λμ€μ λ©€λ² λ³μμ λ©μλλ μΈν°νμ΄μ€μ μ μλ μμ±κ³Ό μμ±μ νμ μ μ€μν΄μΌ ν¨
μ½λ(ex06-11.ts)
(() => {
interface Score { // 1οΈβ£
kor: number;
eng: number;
sum(): number;
avg(): number;
}
class HighSchool implements Score { // 2οΈβ£
kor: number;
eng: number;
constructor(kor: number, eng: number) {
this.kor = kor;
this.eng = eng;
}
sum() {
return this.kor + this.eng;
}
avg() {
return this.sum() / 2;
}
}
function printScore(score: Score) { // 3οΈβ£
console.log(score.sum(), score.avg());
}
const haru = new HighSchool(100, 90); // 4οΈβ£
printScore(haru); // 5οΈβ£
})();
1οΈβ£ ScoreλΌλ μΈν°νμ΄μ€λ₯Ό μμ±ν΄μ kor, eng (number νμ
)κ³Ό sum(), avg() λ©μλλ₯Ό μ μν¨
2οΈβ£ HighSchool ν΄λμ€κ° Score μΈν°νμ΄μ€λ₯Ό implements(ꡬν)νμ¬ kor, eng μμ±κ³Ό sum(), avg() λ©μλλ₯Ό ꡬνν¨
3οΈβ£ printScore ν¨μλ λ§€κ°λ³μλ‘ Score νμ
μ λ°κ³ , sum()κ³Ό avg() κ²°κ³Όλ₯Ό μΆλ ₯ν¨
4οΈβ£ haruλΌλ μ΄λ¦μΌλ‘ HighSchool μΈμ€ν΄μ€λ₯Ό μμ±νκ³ , kor=100, eng=90 κ°μ μ λ¬ν¨
5οΈβ£ printScore(haru)λ₯Ό νΈμΆν΄μ haru κ°μ²΄μ μ΄μ (sum())κ³Ό νκ· (avg())μ μΆλ ₯ν¨
Score μΈν°νμ΄μ€
ββ kor: number
ββ eng: number
ββ sum(): number
ββ avg(): number
HighSchool ν΄λμ€ (implements Score)
ββ kor
ββ eng
ββ sum()
β ββ return this.kor + this.eng
ββ avg()
ββ return this.sum() / 2
printScore(score: Score) ν¨μ
ββ console.log(score.sum())
ββ console.log(score.avg())
haru κ°μ²΄ μμ±
ββ new HighSchool(100, 90)
printScore(haru) νΈμΆ
ββ haru.sum() μ€ν
ββ haru.avg() μ€ν
?λ₯Ό μΆκ°μΈν°νμ΄μ€μ μμ±λͺ μμ readonlyν€μλ μΆκ°
κ°μ²΄ μμ±μμλ§ κ° ν λΉμ΄ κ°λ₯νκ³ μμ±λ μ΄νμλ μμ ν μ μλ μμ±μ λ§λ€λ μ¬μ©
μ½λ
(() => {
interface Todo {
readonly id: number;
title: string;
content: string;
done?: boolean;
}
const todo1: Todo = {
id: 1,
title: "TypeScript νμ΅νκΈ°",
content: "νμ΅νκΈ°",
done: false,
};
console.log(todo1);
const todo2: Todo = {
id: 2,
title: "TypeScript νμ΅νκΈ°",
content: "νμ΅νκΈ°",
};
console.log("λ³κ²½ μ ", todo2);
todo2.id = 3;
todo2.content = "νμ΅ λ";
console.log("λ³κ²½ ν", todo2);
})();
TodoλΌλ νμ
(μ€κ³λ)μ μ μνλ€. (readonly/optional νΉμ§ μμ)Todo νμ
μ μ΄μ©ν΄μ todo1 κ°μ²΄λ₯Ό λ§λ€μλ€. (μ€κ³λμ λ§μΆ° μμ±)todo2 κ°μ²΄λ₯Ό λ§λ€κ³ μμ νλ € νλλ°, readonly idλ μμ λͺ»νκ³ , contentλ μμ κ°λ₯νλ€λΆλͺ¨ μΈν°νμ΄μ€μ μμ±κ³Ό λ©μλ μ μλ₯Ό μμ μΈν°νμ΄μ€κ° λ¬Όλ € λ°κ³ νμ₯
interfaceμ μΈλΆμ extendsν€μλ λ€μ μμ λ°μ λΆλͺ¨ μΈν°νμ΄μ€ μ§μ
μ½λ(ex06-13.ts)
(() => {
interface TodoRegist { // 1οΈβ£
title: string;
content: string;
}
interface TodoInfo extends TodoRegist { // 2οΈβ£
id: number;
done: boolean;
}
const todo1: TodoRegist = { // 3οΈβ£
title: "TypeScript",
content: "νμ΅νκΈ°",
};
console.log("ν μΌ μμΈ μ‘°ν", todo1);
const todo2: TodoInfo = { // 4οΈβ£
id: 1,
title: "TS",
content: "νμ΅νκΈ°",
done: false,
};
console.log("ν μΌ μμΈ μ‘°ν", todo2); // 5οΈβ£
})();
TodoRegistλΌλ μΈν°νμ΄μ€λ₯Ό λ§λ€μ΄ titleκ³Ό content μμ±(string νμ
)μ μ μν¨TodoInfoλΌλ μΈν°νμ΄μ€λ₯Ό μμ±νκ³ , TodoRegistλ₯Ό extends(μμ)νμ¬ id, done μμ±μ μΆκ°ν¨title, contentλ μμλ°μμ μλ ν¬ν¨λ¨todo1 κ°μ²΄λ₯Ό TodoRegist νμ
μΌλ‘ μμ±νκ³ , titleκ³Ό content κ°μ ν λΉν¨todo2 κ°μ²΄λ₯Ό TodoInfo νμ
μΌλ‘ μμ±νκ³ , id, title, content, done κ°μ λͺ¨λ ν λΉν¨todo1, todo2 κ°μ²΄λ₯Ό console.logλ‘ μΆλ ₯νμ¬ λ΄μ© νμΈ