[JSDoc으로 타입 힌트가 제공된 test.js의 .d.ts 파일을 만듭니다]
npx tsc test.js --declaration --allowJs --emitDeclarationOnly --outDir types
[프로젝트 세팅]
1. npm init -y
2. tsc --init --rootDir ./src --outDir ./dist --esModuleInterop --module commonjs --strict true --allowJS true --checkJS true
[any]
[unknown]
[union]
[object literal]
유틸리티 타입
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();
[도서관 프로그램]
enum Role {
LIBRARIAN,
MEMBER,
}
abstract class User {
constructor(public name: string, public age: number) {}
abstract getRole(): Role;
}
class Member extends User {
constructor(name: string, age: number) {
super(name, age);
}
getRole(): Role {
return Role.MEMBER;
}
}
class Librarian extends User {
constructor(name: string, age: number) {
super(name, age);
}
getRole(): Role {
return Role.LIBRARIAN;
}
}
class Book {
constructor(
public title: string,
public author: string,
public publishedDate: Date
) {}
}
interface RentManager {
getBooks(): Book[];
addBook(user: User, book: Book): void;
removeBook(user: User, book: Book): void;
rentBook(user: Member, book: Book): void;
returnBook(user: Member, book: Book): void;
}
class Library implements RentManager {
private books: Book[] = [];
private rentedBooks: Map<string, Book> = new Map<string, Book>();
getBooks(): Book[] {
// 깊은 복사를 하여 외부에서 books를 수정하는 것을 방지합니다.
return JSON.parse(JSON.stringify(this.books));
}
addBook(user: User, book: Book): void {
if (user.getRole() !== Role.LIBRARIAN) {
console.log("사서만 도서를 추가할 수 있습니다.");
return;
}
this.books.push(book);
}
removeBook(user: User, book: Book): void {
if (user.getRole() !== Role.LIBRARIAN) {
console.log("사서만 도서를 삭제할 수 있습니다.");
return;
}
const index = this.books.indexOf(book);
if (index !== -1) {
this.books.splice(index, 1);
}
}
rentBook(user: User, book: Book): void {
if (user.getRole() !== Role.MEMBER) {
console.log("유저만 도서를 대여할 수 있습니다.");
return;
}
if (this.rentedBooks.has(user.name)) {
console.log(
`${user.name}님은 이미 다른 책을 대여중이라 빌릴 수 없습니다.`
);
} else {
this.rentedBooks.set(user.name, book);
console.log(`${user.name}님이 [${book.title}] 책을 빌렸습니다.`);
}
}
returnBook(user: User, book: Book): void {
if (user.getRole() !== Role.MEMBER) {
console.log("유저만 도서를 반납할 수 있습니다.");
return;
}
if (this.rentedBooks.get(user.name) === book) {
this.rentedBooks.delete(user.name);
console.log(`${user.name}님이 [${book.title}] 책을 반납했어요!`);
} else {
console.log(`${user.name}님은 [${book.title}] 책을 빌린적이 없어요!`);
}
}
}
function main() {
const myLibrary = new Library();
const librarian = new Librarian("르탄이", 30);
const member1 = new Member("예비개발자", 30);
const member2 = new Member("독서광", 28);
const book = new Book("TypeScript 문법 종합반", "강창민", new Date());
const book2 = new Book("금쪽이 훈육하기", "오은영", new Date());
const book3 = new Book("요식업은 이렇게!", "백종원", new Date());
myLibrary.addBook(librarian, book);
myLibrary.addBook(librarian, book2);
myLibrary.addBook(librarian, book3);
const books = myLibrary.getBooks();
console.log("대여할 수 있는 도서 목록:", books);
myLibrary.rentBook(member1, book);
myLibrary.rentBook(member2, book2);
myLibrary.returnBook(member1, book);
myLibrary.returnBook(member2, book2);
}
main();
LIST
'4차산업혁명의 일꾼 > Java&Spring웹개발과 서버 컴퓨터' 카테고리의 다른 글
[장애대응 시나리오] JMeter 모니터링 (0) | 2024.01.07 |
---|---|
[자바전망과 비교]자바개발자는 Oracle DB? (4) | 2023.12.31 |
TDD와 Junit5 정리 (0) | 2023.12.15 |
항해플러스3기 아고라 참여 후 무신사 하헌우 코치님 티칭 정리 (0) | 2023.12.14 |
스프링 데이터 JPA 기초 정리 (0) | 2023.12.13 |