index
thisType
-매서드들에 this를 한번에 방법이다.
const obj = {
data: {
money: 0,
},
methods: {
addmoney(amount: number) {
this.moeny += amonut;
},
useMoney(amount: number) {
this.money += amount;
},
},
};
- 위 예시에서
addmoney와useMoney에서 같은this를 사용하고 싶지만 이 예제서this는data와obj를 합친 값이다.
타입 추가 버전
type Data = { money: number };
type Methods = {
addMoney(this: Data & Methods, amount: number): void;
useMoney(this: Data & Methods, amount: number): void;
};
type Obj = {
data: Data;
methods: Methods;
};
const obj: Obj = {
data: {
money: 0,
},
methods: {
addMoney(amount) {
this.money += amount;
},
useMoney(amount) {
this.money -= amount;
},
},
};
- 다만 위경우에 this를 일일히 타이핑 해줘야하는 문제가 있다 이를 방지하기 위해
type Data = { money: number };
type Methods = {
addMoney(amount: number): void;
useMoney(amount: number): void;
};
type Obj = {
data: Data;
methods: Methods & ThisType<Data & Methods>;
};
const obj: Obj = {
data: {
money: 0,
},
methods: {
addMoney(amount) {
this.money += amount;
},
useMoney(amount) {
this.money -= amount;
},
},
};
ThisType을 활용해 위처럼 사용할 수 있다.
foreach 만들기
[1, 2, 3] = myForeach(() => {});
interface Array<T> {
myForEach(callback: (v: T, i: number, a: T[]) => void): void;
}
lib.es5.d.ts의 타입도 정확하진 않다. 그 이유는 실행환경마다this가 변경되기 떄문이다.- 이렇든 실행되는 환경에 맞게 타입을 작성해야한다.
map 만들기
- 100% 정확하게 타이핑 하는것은 매우 어려운일이다.
interface Array<T> {
(...)
map<U>(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): U[];
(...)
}