```ts
/**
 * Returns an array of the maximum value in each sliding window of size k.
 * Uses a deque to achieve O(n) time complexity.
 */
export function maxSlidingWindow(nums: number[], k: number): number[] {
  if (!Array.isArray(nums)) {
    throw new Error("nums must be an array");
  }

  if (!Number.isInteger(k)) {
    throw new Error("k must be an integer");
  }

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

  const deque: number[] = []; // Stores indices of potential max elements
  const result: 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 current value
    while (deque.length > 0 && nums[deque[deque.length - 1]] <= nums[i]) {
      deque.pop();
    }

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

    // Start recording results once we have processed at least k elements
    if (i >= k - 1) {
      result.push(nums[deque[0]]);
    }
  }

  return result;
}
```