인터페이스
// 인터페이스의 경우 앞에 I를 붙여주는게 보기 좋음
export interface ICalculator {
add(a: number, b: number): number;
minus(a: number, b: number): number;
multiple(a: number, b: number): number;
divide(a: number, b: number): number;
}
import { ICalculator } from "./cal";
// 인터페이스를 구현한 클래스명의 뒤엔 Imp
export class CalculatorImplV1 implements ICalculator {
add(a: number, b: number): number {
return a + b;
}
minus(a: number, b: number): number {
return a - b;
}
multiple(a: number, b: number): number {
return a * b;
}
}
메인
import { ICalculator } from "./cal";
import { CalculatorImplV1 } from "./calImpl.v1";
// 타입은 인터페이스, 생성자는 클래스로 하여 의존성을 낮춤
const cal: ICalculator = new CalculatorImplV1();
console.log(cal.add(1, 2));
new를 이용한 함수 선언이 가능함
const add1: Function = new Function("a", "b", "return a + 2 * b");
인터페이스를 타입으로 설정 가능함
interface ADD2 {
(a: number, b: number): number;
}
const add2: ADD2 = function ADD2(a: number, b: number): number {
return a + b;
};
Proxy
- 객체의 속성 가져오기, 설정 및 정의와 같은 기본 객체 작업을 재정의할 수 있음
- 프록시 객체는 일반적으로 속성 액세스를 기록하고, 입력의 유효성을 검사하고, 형식을 지정하거나, 삭제하는 데 사용
- 매개변수
- target: 프록시할 원본 객체
- handler: 가로채는 작업과 가로채는 작업을 재정의하는 방법을 정의하는 객체
- handler의 get, set
- get
- target: 대상 객체
- property: 가져올 속성의 이름 또는 Symbol
- receiver: 프록시 또는 프록시에서 상속되는 객체
- set
- target: 대상 객체
- property: 설정할 속성의 이름 또는 Symbol
- value: 설정할 속성의 새 값
- receiver: 할당이 지시된 원래 객체
interface ICar {
name: string;
speed: number;
}
const car = { speed: 0, name: "" };
const carProxy: ICar = new Proxy<ICar>(car, {
get(target: ICar, p: keyof ICar) {
console.log("get", target, p);
return target[p];
},
set(target: ICar, p: keyof ICar, newValue: any) {
console.log("set", target, p, newValue);
if (p === "speed") target.speed = newValue > 0 ? newValue : 0;
return true;
},
});
carProxy.speed = 30;
console.log(carProxy.speed);
instanceof
- 상속관계를 확인하는 명령어
- 객체가 특정 클래스에 속하는지 아닌지를 확인할 수 있음
class IDetail {
constructor(public name: string, public age: number, public city: string) {}
}
type typeSNS = "KAKAO" | "NAVER";
interface IUser {
detail: IDetail;
marketing: boolean;
sns: typeSNS;
}
function setUser(
target: IUser,
param: keyof IUser,
newValue: typeof target[typeof param]
) {
if (param === "marketing" && typeof newValue === "boolean") {
target[param] = newValue;
// IDetail이 인터페이스일 경우 object로만 체크가 가능해서 클래스로 변경
// else if (param === "detail" && typeof newValue === "object") {
} else if (param === "detail" && newValue instanceof IDetail) {
} else if (param === "sns" && typeof newValue === "string") {
const v: typeSNS = newValue;
target[param] = v;
}
}