(...)
[1, 2, 3].myForEach(function() {
console.log(this);
});
// this: Window
[1, 2, 3].myForEach(function() {
console.log(this);
}, { a: 'b' });
/*
this: {
a: string;
}
*/
interface Array<T> {
myForEach<K = Window>(callback: (this: K, v: T, i: number, a: T[]) => void, thisArg?: K): void;
}
타입 매개변수 K를 선언했습니다. 타입 매개변수를 선언할 수 있는 자리는 Array<T, K>와 myForEach<K>인데, Array<T, K>를 수정할 수 없으므로 myForEach<K> 자리에 선언했습니다. Array<T, K>를 수정할 수 없는 이유는 lib.es5.d.ts에 있는 배열의 인터페이스와 타입 매개변수가 동일해야 하기 때문입니다.