Repository: TypeScript
Issue: Property '[Symbol.iterator]' is missing in type 'PartialTuple<ConstructorParams<T>>
Labels: Needs Investigation

<!-- 🚨 STOP 🚨 𝗦𝗧𝗢𝗣 🚨 𝑺𝑻𝑶𝑷 🚨

Half of all issues filed here are duplicates, answered in the FAQ, or not appropriate for the bug tracker. Even if you think you've found a *bug*, please read the FAQ first, especially the Common "Bugs" That Aren't Bugs section!

Please help us by doing the following steps before logging an issue:
  * Search: https://github.com/Microsoft/TypeScript/search?type=Issues
  * Read the FAQ: https://github.com/Microsoft/TypeScript/wiki/FAQ

Please fill in the *entire* template below.
-->

<!--
Please try to reproduce the issue with the latest published version. It may have already been fixed.
For npm: `typescript@next`
This is also the 'Nightly' version in the playground: http://www.typescriptlang.org/play/?ts=Nightly
-->
**TypeScript Version:**  3.1 -> 3.7

<!-- Search terms you tried before logging this (so others can find this issue more easily) -->
**Search Terms:**
tuple, mapped tuple

**Code**

```ts
type Constructor = new (...args: any[]) => any;
type ConstructorParams<T extends Constructor> = T extends new (...args: infer P) => any ? P : never;
type PartialTuple<T extends any[]> = {[I in keyof T]: T[I] | undefined}
type ConstructorReturnType<T extends Constructor> =
    T extends new (...args: any[]) => infer R ? R : never;

function getClassFactory<T extends Constructor>(type: T) {
    type OptionalParams = PartialTuple<ConstructorParams<T>>;
    return getFunctionWithOptionalTypes<OptionalParams, ConstructorReturnType<T>>();
}
```

**Expected behavior:**
should compile correctly

**Actual behavior:**
shows error:
>Type 'PartialTuple<ConstructorParams<T>>' does not satisfy the constraint 'any[]'.
> Property '[Symbol.iterator]' is missing in type 'PartialTuple<ConstructorParams<T>>'.

**Playground Link:** 
[playground](https://www.typescriptlang.org/play/?ts=3.1.6&ssl=15&ssc=2&pln=6&pc=1#code/LAKAxgNghgzjAEBZAngYWnA3qev5gHsA7GAFwCcBXMUg8gCgAdyDGB5IgUwC54zyAlkQDmAGnjNWAFQDuBXkUoBbAEady4yYykALcpx7wVBAhE5QiASkwBfUHZChSyRp3ipi-arXLwAvPBcMvD0AHThUOTCMLwWyADaALqW-gB88HEA3E4ubh4kFN50AAqRUEowADxS8JwAHqScRAAmCPleNHTpATX1jS0IQSHhoZHRvEIAZurwxSl+6XHwAPyz8AqcAG7q2SDOrrORpAJQEFKUjGbVtQ1NrRlECYnd8JjxAJLwQvAA1pzIBEm8CkiV4Ug+iXgAB94JQWpxJkJOM0HPs8p5Cp1yAAlTikSjkIhSXLXPp3NoYqhY7o4PC9W4DQKcYJhCJRGIPJ7zdJTGbYlbwfkbbbkXagSZwmgCYjwYR49CwGAAMSgWOQpIZ93amJ8qXoaLBKWwIDw8DR8DYjGOxFOpXI5QQATtx1O50unEq2qpPjtDuqqVSu1N+nxhNleKVkutRAA6gJSDpLdHXbkqknpURbWUKuIvUUcXiCUSSVIA-RLLsHOKoxnw6RI0QpcQ4wn0zazqnqr6Kjd+vc4klxFJcaGiHrLLxWaN2WDuzBucCR0XjcHC2HbBkEHF7KBQIQCvAJY3oy3E1aM1n7T2AnLSAq4Cq1fQUPf57sgA)

I have to use 2 functions as I get `A rest parameter must be of an array type.` if I try to do it one function:

```
function getClassFactory<T extends Constructor>(type: T): new (...args: PartialTuple<ConstructorParams<T>>) => ConstructorReturnType<T> {
    return {} as any;
}
```
[playground](https://www.typescriptlang.org/play/?ssl=14&ssc=2&pln=12&pc=1#code/LAKAxgNghgzjAEBZAngYWnA3qev5gHsA7GAFwCcBXMUg8gCgAdyDGB5IgUwC54zyAlkQDmAGnjNWAFQDuBXkUoBbAEady4yYykALcpx7wVBAhE5QiASkwBfUHZChSyRp3ipi-arXLwAvPBcMvD0AHThUOTCMLwWyADaALqW-gB88HEA3E4ubh4kFN50AAqRUEowADxS8JwAHqScRAAmCPleNHTpATX1jS0IQSHhoZHRvEIAZurwxSl+6XHwAPyz8AqcAG7q2SDOrrORpAJQEFKUjGbVtQ1NrRlECYnd8JjxAJLwQvAA1pzIBEm8CkiV4Ug+iXgAB94JQWpxJkJOM0HPs8p5Cp1yAAlTikSjkIhSXLXPp3NoYqhY7o4PC9W4DQKcYJhCJRGIPJ7zdJTGbYlbwfkbbbkXagSZwmgCYjwYR49CwGAAMSgWOQpIZ93amJ8qXoaLBlg2LJGYw5pXIx1O50unEq2qpPgt5SqUlSqW57kpRRxeIJRJJbtetNw+nxhNeNgyCCy9lA8fAGPgEqIUuIAHUBKQdGxGMdiKdnRV-LL5RhlaqfMh6CgFXBLLsgA)

I am trying to create a type that returns a function with parameters equal to that of a class constructor but where each parameter is `T[P] | undefined`.
I've done similar to this before