Filter undefined only in binding patterns in params (#38116)

initialiser. But this is only correct when the initialiser is for a
parameter. For example:

```ts
declare let x: { s: string } | undefined;
const { s } = x;
```

This PR removes undefined from the type of a binding pattern only when
the binding pattern's parent is a parameter. This fixes the regression
from 3.8. However, it's still not the ideal fix; we should be able to
use control flow to solve this problem. Consider:

```ts
const { s }: { s: string } | undefined = { s: 'hi' }
declare function f({ s }: { s: string } | undefined = { s: 'hi' }): void
```

Neither line should have an error, but the first does in 3.8 and after
this change.
This commit is contained in:
Nathan Shively-Sanders
2020-04-22 09:56:32 -07:00
committed by GitHub
parent d2016912b5
commit f248567dab
6 changed files with 41 additions and 3 deletions

View File

@@ -7306,7 +7306,7 @@ namespace ts {
parentType = getNonNullableType(parentType);
}
// Filter `undefined` from the type we check against if the parent has an initializer (which handles the `undefined` case implicitly)
else if (strictNullChecks && pattern.parent.initializer) {
else if (strictNullChecks && pattern.parent.initializer && isParameter(pattern.parent)) {
parentType = getTypeWithFacts(parentType, TypeFacts.NEUndefined);
}