devlog_owen
231219 [TIL] 타입스크립트 입문 본문
728x90
타입스크립트 기본 세팅
npm init -y
tsc --init --rootDir ./src --outDir ./dist --esModuleInterop --module commonjs --strict true --allowJS true --checkJS true
"scripts": {
"start": "tsc && node ./dist/index.js",
"build": "tsc --build",
"clean": "tsc --build --clean"
},
package.json을 위 코드로 수정함. 나중에 실행하기 편하도록 설정.
별다방 프로그램 코드
interface Beverage {
name: string;
price: number;
}
interface User {
id: number;
name: string;
role: "admin" | "customer";
}
interface Order {
orderId: number;
customerId: number;
customerName: string;
beverageName: string;
status: "placed" | "completed" | "picked-up";
}
let beverages: Beverage[] = [];
let orders: Order[] = [];
function isAdmin(user: User): boolean {
return user.role === "admin";
}
function isCustomer(user: User): boolean {
return user.role === "customer";
}
function addBeverage(user: User, name: string, price: number): void {
if (!isAdmin(user)) {
console.log("권한이 없습니다.");
return;
}
const newBeverage: Beverage = { name, price };
beverages.push(newBeverage);
}
function removeBeverage(user: User, beverageName: string): void {
if (!isAdmin(user)) {
console.log("권한이 없습니다.");
return;
}
beverages = beverages.filter((beverage) => beverage.name !== beverageName);
}
function getBeverages(user: User): Beverage[] {
if (!user) {
return [];
}
return beverages;
}
function findBeverage(beverageName: string): Beverage | undefined {
return beverages.find((beverage) => beverage.name === beverageName);
}
function placeOrder(user: User, beverageName: string): number {
if (!isCustomer(user)) {
console.log("권한이 없습니다.");
return -1;
}
const beverage = findBeverage(beverageName);
if (!beverage) {
console.log("해당 음료를 찾을 수 없습니다.");
return -1;
}
const newOrder: Order = {
orderId: orders.length + 1,
customerId: user.id,
customerName: user.name,
beverageName,
status: "placed",
};
orders.push(newOrder);
return newOrder.orderId;
}
function completeOrder(user: User, orderId: number): void {
if (!isAdmin(user)) {
console.log("권한이 없습니다.");
return;
}
const order = orders.find((order) => order.orderId === orderId);
if (order) {
order.status = "completed";
console.log(
`[고객 메시지] ${order.customerName}님~ 주문하신 ${order.beverageName} 1잔 나왔습니다~`
);
}
}
function pickUpOrder(user: User, orderId: number): void {
if (!isCustomer(user)) {
console.log("권한이 없습니다.");
return;
}
const order = orders.find(
(order) => order.orderId === orderId && order.customerId === user.id
);
if (order && order.status === "completed") {
order.status = "picked-up";
console.log(
`[어드민 메시지] 고객 ID[${order.customerId}]님이 주문 ID[${orderId}]을 수령했습니다.`
);
}
}
function main() {
const admin: User = {
id: 1,
name: "바리스타",
role: "admin",
};
// 유저 생성
const member1: User = {
id: 2,
name: "르탄이",
role: "customer",
};
const member2: User = {
id: 3,
name: "꿈꾸는개발자",
role: "customer",
};
// 음료 등록
addBeverage(admin, "아메리카노", 4000);
addBeverage(admin, "카페라떼", 4500);
addBeverage(admin, "에스프레소", 3000);
// 음료 삭제
removeBeverage(admin, "에스프레소");
console.log(
`안녕하세요~ ${
member1.name
} 고객님! 별다방에 오신 것을 환영합니다. 저희는 ${JSON.stringify(
getBeverages(member1)
)}를 판매하고 있습니다.`
);
// 음료 주문
const orderId1 = placeOrder(member1, "아메리카노");
if (orderId1 > 0) {
setTimeout(() => {
// 음료 제작 완료
completeOrder(admin, orderId1);
// 음료 수령
pickUpOrder(member1, orderId1);
}, 1000);
}
console.log(
`안녕하세요~ ${
member2.name
} 고객님! 별다방에 오신 것을 환영합니다. 저희는 ${JSON.stringify(
getBeverages(member2)
)}를 판매하고 있습니다.`
);
// 음료 주문
const orderId2 = placeOrder(member2, "카페라떼");
if (orderId2 > 0) {
setTimeout(() => {
// 음료 제작 완료
completeOrder(admin, orderId2);
// 음료 수령
pickUpOrder(member2, orderId2);
}, 3000);
}
}
main();
처음에 인터페이스 작성부터 사실 조금씩 틀리면서 따라 코딩했다. 특히 타입을 하나하나 지정하는듯한 저 템플릿(?)은 아직 더 적응해야할 것 같다. 그래도 ts는 프로그램 돌리기 이전에 에러를 확인할 수 있다는 점이 좋다. 심지어 좀 자세하게 이거는 왜 오류인지 설명해주는거 같다.
728x90
'TIL' 카테고리의 다른 글
231221 [TIL] 타입스크립트 디자인패턴 (1) | 2023.12.22 |
---|---|
231220 [TIL] 창민튜터님 멘토링 (0) | 2023.12.20 |
231218 [TIL] 백오피스 팀프로젝트 마무리 (0) | 2023.12.18 |
231215 [TIL] 백오피스 팀프로젝트 4일차 (0) | 2023.12.16 |
231214 [TIL] 백오피스 팀프로젝트 3일차 (0) | 2023.12.14 |