์ด๊ฑฐํ
enum NumberColor {
RED = 0,
GREEN = 1,
BLUE = 2,
};
enum StringColor {
RED = 'red',
GREEN = 'green',
BLUE = 'blue',
};
์ธํฐํ์ด์ค
// Todo ์ธํฐํ์ด์ค๋ฅผ ์์ฑํฉ๋๋ค.
interface Todo {
id: number;
content: string;
isDone: boolean;
}
// Todo ์ธํฐํ์ด์ค๋ฅผ ํ์
์ผ๋ก ๋ฐ๋ todos๋ฅผ ์์ฑํฉ๋๋ค.
let todos: Todo[] = [];
// Todo ์ธํฐํ์ด์ค๋ฅผ ํ์
์ผ๋ก ๋ฐ๋ addTodo๋ฅผ ์์ฑํฉ๋๋ค.
function addTodo(todo: Todo) {
todos = [...todos, todo];
}
// Todo ์ธํฐํ์ด์ค๋ฅผ ํ์
์ผ๋ก ๋ฐ๋ newTodo๋ฅผ ์์ฑํฉ๋๋ค.
const newTodo: Todo = {
id: 1,
content: 'learn typescript',
isDone: false,
};
addTodo(newTodo);
console.log(todos);
์ธํฐํ์ด์ค ์์
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;
const food = {} as FoodFreshness;
์ด ์ฝ๋๋ ํ์ ๋จ์ธ(type assertion)์ ์ฌ์ฉํ์ฌ ๋ณ์ food๋ฅผ FoodFreshness ํ์ ์ผ๋ก ์ง์ ํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
ํ์ ๋จ์ธ์ ๊ฐ๋ฐ์๊ฐ ์ปดํ์ผ๋ฌ์๊ฒ "๋๋ ์ด ๋ณ์๊ฐ ํน์ ํ์ ์ด๋ค"๋ผ๊ณ ํ์ ํ ๋ ์ฌ์ฉํ๋ค.
์์ ์ฝ๋์์๋ ๋น ๊ฐ์ฒด {}๋ฅผ FoodFreshness ํ์ ์ผ๋ก ๋จ์ธํ๊ณ ์๋ค.
ํ์ง๋ง ๋น ๊ฐ์ฒด์๋ FoodFreshness ์ธํฐํ์ด์ค์ ์ ์๋ ํ๋กํผํฐ๋ค์ด ์กด์ฌํ์ง ์์ผ๋ฏ๋ก, ๋์ค์ ํ๋กํผํฐ๋ค์ ์ถ๊ฐํด๋ ์ปดํ์ผ๋ฌ๋ ์ด๋ฅผ ๊ฐ์งํ์ง ๋ชปํ๋ค. ๋ฐ๋ผ์ ํ์ ๋จ์ธ์ ์ฃผ์ํด์ ์ฌ์ฉํด์ผ ํ๋ค.
interface User {
name: string;
age: number;
}
//Student ์ธํฐํ์ด์ค๋ฅผ ์์ฑํฉ๋๋ค.
interface Student extends User {
gradle: number;
}
//Student ์ธํฐํ์ด์ค๋ฅผ ๋ฐ๋ kimcoding์ ์์ฑํฉ๋๋ค.
//kimcoding์ ์ด๋ฆ์ ๊น์ฝ๋ฉ์ด๊ณ , ๋์ด๋ 20์ธ์ด๋ฉฐ, ํ๋
์ 1์
๋๋ค.
const kimcoding: Student = { name: '๊น์ฝ๋ฉ', age: 20, gradle: 1 };
console.log(kimcoding);
interface Color {
name: string;
brightness: number;
}
interface ClothesType {
kind: string;
length: number;
}
//Closet ์ธํฐํ์ด์ค๋ฅผ ์์ฑํฉ๋๋ค.
interface Closet extends Color, ClothesType {
season: string;
}
//Closet ์ธํฐํ์ด์ค๋ฅผ ๋ฐ๋ skirt๋ฅผ ์์ฑํฉ๋๋ค.
//skirt๋ ๋
ธ๋์์ด๋ฉฐ, ๋ฐ๊ธฐ๋ 0์ด๊ณ , ์ข
๋ฅ๋ ์น๋ง์ด๋ฉฐ ๊ธธ์ด๋ 5 ์ ๋๋ก ์ค๊ฐ์ด๋ฉฐ ์ฌ๋ฆ์ฉ์
๋๋ค.
const skirt: Closet = {
name: 'skirt',
brightness: 0,
kind: '์น๋ง',
length: 5,
season: '์ฌ๋ฆ',
};
console.log(skirt);
ํ์ ๋ณ์นญ(Type Aliases)
: ํ์ ๋ณ์นญ(Type Aliases)์ ํ์ ์ ์๋ก์ด ์ด๋ฆ์ ๋ง๋๋ ๊ฒ์ด๋ค.
(์๋ก์ด ์ด๋ฆ์ผ๋ก ๊ธฐ์กด์ ํ์ ์ ์ฐธ์กฐํ๋ ๊ฒ์ ์๋ฏธ)
ํ์ ๋ณ์นญ์ ์ด์ฉํ์ฌ ํ์ ์ ์๋ก์ด ์ด๋ฆ์ ๋ง๋ค ๋ ํค์๋ type์ ์ฌ์ฉํ์ฌ ์์ฑํ๋ค.
์ธํฐํ์ด์ค 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,
}
๊ฐ๊ฐ ๋ง์ฐ์ค๋ฅผ ์ฌ๋ ค๋ณด๋ฉด type์ผ๋ก ์ ์ธํ kimcoding์ Person ํ์ ๋ด๋ถ ํ๋กํผํฐ๊ฐ ๋ณด์ด๊ณ
๋ฐ๋ฉด interface๋ก ์ ์ธํ coding์ User ๋ด๋ถ์ ์ด๋ค ํ๋กํผํฐ๊ฐ ์๋์ง ๋ณด์ด์ง ์๋๋ค.
ํ์ง๋ง ํ์ ๋ณ์นญ์ผ๋ก ์์ฑํ ์ฝ๋๋ extends๋ก ํ์ฅํ ์ ์๋ค. ๊ทธ๋ฌ๋ ์ธํฐํ์ด์ค๋ ๊ฐ๋ฅํ๋ค.
ํฐํ์ด์ค๋ ๊ธฐ์กด์ ์ธํฐํ์ด์ค ๋ฐ ํ์ ๋ณ์นญ์ผ๋ก ๋ง๋ค์ด์ง ํ์ ๋ ๋ค ์์ํ ์ ์๊ธฐ ๋๋ฌธ์, ์ ์ฐํ ์ฝ๋ ์์ฑ์ ์ํด์๋ ์ธํฐํ์ด์ค๋ก ๋ง๋ค์ด์ ํ์ํ ๋๋ง๋ค ํ์ฅํ ์ ์๋ค.
type Todo = {
id: number;
title: string;
isDone: boolean;
};
//Todo ํ์
์ ์ฌ์ฉํด ๊ฐ์ฒด๋ฅผ ์ ์ํฉ๋๋ค.
const show: Todo = {
id: 1,
title: 'lotus',
isDone: true,
};
//Todo ํ์
์ ์ฌ์ฉํ ๊ฐ์ฒด๋ฅผ ์ถ๋ ฅํด๋ด
๋๋ค.
function getTodo(todo: Todo) {
console.log(todo);
}
getTodo(show);
ํ์ ์ถ๋ก (Type Inference)
: TypeScript๋ ํ์ ์ถ๋ก (Type Inference)์ด๋ผ๋ ๊ธฐ๋ฅ์ ํตํด ์ฝ๋ ์์ฑ์ ๋์์ค๋ค.
ํ์ ์ถ๋ก (Type Inference)์ ๋ณ์๋ ํจ์์ ํ์ ์ ์ ์ธํ์ง ์์๋ TypeScript๊ฐ ์๋์ผ๋ก ์ ์ถํ๋ ๊ธฐ๋ฅ์ด๋ค.
let isNumber = 123;
ํ์ ์คํฌ๋ฆฝํธ๋ isNumber์ ํ์ ์ ์๋์ผ๋ก ์ซ์(Number)๋ก ์ถ๋ก ํ๋ค.
์ต์ ๊ณตํต ํ์ (Best common type)
let x = [0, 1, null];
x ํ์ ์ ์ถ๋ก ํ๋ ค๋ฉด ๊ฐ ๋ฐฐ์ด ์์์ ํ์ ์ ๊ณ ๋ คํด์ผ ํ๋ค. ์ฌ๊ธฐ์ ๋ฐฐ์ด์ ํ์ ์ ๊ณ ๋ฅผ ์ ์๋ ํ๋ณด๊ฐ number์ null์ด๋ค.
์ต์ ๊ณตํต ํ์ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ ํ๋ณด์ ํ์ ์ ๊ณ ๋ คํ์ฌ, ๋ชจ๋ ํ๋ณด์ ํ์ ์ ํฌํจํ ์ ์๋ ํ์ ์ ์ ํํ๋ค.
๋ฌธ๋งฅ์์ ํ์ดํ(Contextual Typing)
๋ ํ๋์ ํ์ ์ ์ถ๋ก ํ๋ ๋ฐฉ๋ฒ์ ๋ฌธ๋งฅ์์ผ๋ก ํ์ ์ ๊ฒฐ์ ํ๋ ๊ฒ์ด๋ค. ๋ฌธ๋งฅ์์ ํ์ดํ(ํ์ ๊ฒฐ์ )์ ์ฝ๋์ ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก ์ผ์ด๋๋ค.
function add(a, b) {
return a + b;
}
๋งค๊ฐ๋ณ์ ํ์ ์ ์ง์ ํ์ง ์์์ง๋ง, ๋ง์ฝ a์ b๊ฐ ๋ชจ๋ number ํ์ ์ด๋ผ๋ฉด, add ํจ์ ๋ฐํ๊ฐ๋ numberํ์ ์ผ๋ก ์ถ๋ก ํ ์ ์๋ค.
ํด๋์ค(Class)
JavaScript์ ํด๋์ค
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
greet() {
console.log(`์๋
ํ์ธ์, ์ ์ด๋ฆ์ ${this.name}์ด๊ณ , ${this.age}์ด ์
๋๋ค.`);
}
}
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}์ด ์
๋๋ค.`);
}
}
javascript์์ ์ฐจ์ด์ ์ TypeScript์์ ํด๋์ค๋ฅผ ์ ์ํ ๋, constructor๋ฅผ ์ด์ฉํ์ฌ ์ด๊ธฐํํ๋ ๋ฉค๋ฒ๋ค์ ์ ๋ถ ์๋จ์์ ์ ์๋ฅผ ํด์ค์ผ ํ๋ค. ๋ํ contructor ๋ด ์ธ์๋ก ๋ฐ์ ๋๋ ์ ํํ ํ์ ์ ๋ช ์ํด ์ค์ผ ํ๋ค.
ํด๋์ค์ ์์(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();
public, private ํค์๋
๊ธฐ๋ณธ์ ์ผ๋ก ํด๋์ค ๋ด์ ์ ์ธ๋ ๋ฉค๋ฒ๋ ์ธ๋ถ๋ก ๊ณต๊ฐ๋๋ ๊ฒ์ด ๋ํดํธ ๊ฐ์ด๋ค.
๊ทธ๋ฌ๋ ๋ช ์์ ์ผ๋ก ํ์ํด์ผ ํ ๊ฒฝ์ฐ ์๋์ ๊ฐ์ด ์์ฑํ ์ ์๋ค.
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 ํค์๋๋ฅผ ์ฌ์ฉํ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ค.
'๐ FrontEnd -Study > TypeScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
TypeScript React์์ useRef์ 3๊ฐ์ง ์ ์ (0) | 2024.01.24 |
---|---|
[TS] ์ง์ ๋ ๋ฐ์ดํฐ ๊ฐ์ฒด์ ๋ํ ~์ ํจํ ํค์ธ์ง TypeScript๊ฐ ์ถ๋ก ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ฐ์ํฉ๋๋ค. (0) | 2024.01.03 |
[typescript ํ์ ] (0) | 2023.05.30 |
[typescript ํ๋ก์ ํธ ํ๊ฒฝ ๊ตฌ์ถ] (0) | 2023.05.30 |
๋๊ธ