```ts
export function maxSlidingWindow(nums: number[], k: number): number[] {
  if (!Array.isArray(nums) || typeof k !== 'number' || !Number.isInteger(k)) {
    throw new Error('Invalid arguments');
  }

  if (k < 1 || k > nums.length) {
    throw new Error('k must be between 1 and nums.length');
  }

  const result: number[] = [];
  const deque: number[] = [];

  for (let i = 0; i < nums.length; i++) {
    // Remove indices that are out of the current window
    while (deque.length > 0 && deque[0] <= i - k) {
      deque.shift();
    }

    // Remove indices whose corresponding values are less than or equal to current value
    while (deque.length > 0 && nums[deque[deque.length - 1]] <= nums[i]) {
      deque.pop();
    }

    // Add current index to the deque
    deque.push(i);

    // Start adding results once we've processed k elements
    if (i >= k - 1) {
      result.push(nums[deque[0]]);
    }
  }

  return result;
}
```