myForEach<K = Window>로 선언했기에 K는 기본적으로 Window입니다. 즉, thisArg를 사용하지 않으면 this의 타입이 Window가 됩니다. thisArg를 사용했다면 그 값의 타입이 this의 타입이 됩니다. thisArg에 { a: 'b' }를 넣은 테스트 사례에서는 K가 { a: string }이 되었으므로 this도 { a: string }이 됩니다.
다만 이 타입도 정확한 타입이 아닙니다. Node.js에서는 window가 아니라 global이기 때문입니다. 타입스크립트에서 정확하게 타이핑하지 못한 이유도 실행 환경에 따라 this가 변하기 때문입니다.
자신이 만든 타입이 100% 정확한 타입인지 알 수 있는 방법은 없습니다. 심지어 타입스크립트가 미리 만들어둔 타입마저 정확한 타입이 아닙니다. 그래서 생각해낼 수 있는 테스트 사례에 모두 부합하면 그냥 잘 만들었을 것이라 믿고 사용하는 것입니다. 사용하다가 에러가 발생하는 테스트 사례가 나오면 그때 고치면 됩니다.
마지막으로 알아두어야 할 것이 있습니다. 현재 코드는 에러가 없어도 실제로 실행되지 않습니다. 배열에 myMap이라는 메서드가 존재하지 않기 때문입니다. 타이핑만 했을 뿐 myMap이라는 메서드를 구현한 적이 없습니다. 단순히 타입 선언을 통해 타입스크립트를 속였을 뿐, 자바스크립트까지 속일 수는 없습니다. 타입스크립트에서 타입에러가 없더라도 실제로 실행됨이 보장되는 것은 아니라는 점도 알아두어야 합니다.