DI - Dependency(의존성) Injection(주입)
ioC - 제어의 역전
반복되는 코드 없애기
new 줄이기 (메모리 관련 문제)
export class ProductController {
buyProduct = (req, res) => {
// 1. 가진 돈을 검증하는 코드 (대략 10줄 작성 => 2줄로 줄었다)
const cashService = new CashService();
const hasMoney = cashService.checkValue();
// 2. 재고파악 및 판매여부를 검증하는 코드 (대략 10줄 작성 => 2줄로 줄었다)
const productService = new ProductService();
const isSoldOut = productService.checkSoldOut();
// 3. 상품을 구매하는 코드 ()
if (hasMoney && !isSoldOut) {
res.send("상품 구매가 완료되었습니다.");
}
};
ProductController가 CashService와 ProductService에 의존하고 있다. -> ProductController는 CashService와 ProductService가 없으면 아무것도 못한다.
ProductController와 CashService, ProductService와 강하게 결합되어있다. (tight coupling) - 위와 같은 말
자바스크립트의 타입을 강제 시키는 언어
에러의 사전 방지
코드 가이드 및 자동 완성(개발 생산성 향상)
function sumTs(a: number, b: number) {
return a + b;
}
sumTs('10', '20'); // Error: '10'은 number에 할당될 수 없습니다.
let aaa : string = "안녕하세요"
let bbb : number = 123
let ccc : boolean = true
interface IProfile {
name : string;
age: number;
}
let profile:IProfile = { name: "철수", age: 15 }
문자열 담는 상자에는 문자열만, 숫자 담는 상자에는 숫자만 담아야한다.
처음 들어온 값으로 타입을 추론한다.
// 타입추론
let aaa = "안녕하세요"
aaa = 3 // 숫자 타입 불가능
// 타입명시
let bbb: string = "반갑습니다"
bbb = 10 // 숫자 타입 불가능
// 타입명시가 필요한 상황
let ccc: (number | string) = 1000
ccc = "1000원"
// 숫자타입
let ddd: number = 10
ddd = "안녕하세요" // 문자 타입 불가능
ddd = "20" // 문자 타입 불가능
// 불린타입
let eee: boolean = true
eee = 11 // 숫자 타입 불가능
eee = false
eee = "false" // true로 작동함
// 배열타입
let fff: number[] = [1, 2, 3, 4]
let ggg: string[] = ["철수", "영희", "훈이"]
let hhh: (string | number)[] = ["철수", "영희", "훈이", 10, 20, 30] // 타입을 추론해서 어떤 타입을 사용하는지 알아보기
// 객체타입
interface IProfile {
name: string
age: string | number
school: string
hobby?: string // ?는 있어도 되고 없어도 되는 애
}
const profile: IProfile = {
name: "철수",
age: 9,
school: "다람쥐초등학교",
}
profile.name = "훈이" // 타입 추론으로는 이것만 가능
profile.age = "8살" // 문자 타입 불가능
profile.hobby = "수영" // hobby가 없음
any타입 명시
// any타입
let qqq: any ="철수"
qqq = true
qqq = 123
// 함수타입 => 어디서 누가 어떻게 호출할지 모르므로, 타입추론 불가능(반드시 타입 명시가 필요함)
function add(num1: number, num2: number, unit: string): string { // 리턴 할 결과도 명시
return num1 + num2 + unit
}
const result = add(1000,2000,"원") // 결과의 리턴 타입도 예측 가능하다.
const add2 = (num1: number, num2: number, unit: string): string => { // 리턴 할 결과도 명시
return num1 + num2 + unit
}
const result2 = add(1000,2000,"원") // 결과의 리턴 타입도 예측 가능하다.
tsc -> ts를 js로 변환
ts - node -> ts를 js로 변환시키고 실행
기존 객체에 새로운 기능을 추가할 수 있도록 하는 디자인 패턴입니다.
일반적으로 데코레이트 하려는 함수의 정의 전에 호출
cllable(전달받은 object 인자가 호출 가능한지를 판단)구조
yarn init -> package.json 파일 생성
yarn add typescript --dev -> 타입스크립트 모듈 설치
yarn add ts-node -> ts-node 설치
package.json파일에 "scripts": {"start:dev": "ts-node index.ts"}추가
yarn tsc --init -> tsconfig.json 생성
tsconfig.json파일에 데코레이터 사용을 위해 "experimentalDecorators": true 를 추가해 주세요.
추가로, tsconfig.json파일에 any 타입에 대한 Error 발생을 무력화 시키기 위해서 "noImplicitAny": false 를 추가해 주세요.
출처 : 코드캠프