Skip to content

Commit c48662c

Browse files
authored
Merge pull request #22675 from Microsoft/fixWideningInDestructuring
Fix widening in destructuring
2 parents bb23e96 + b7047e8 commit c48662c

6 files changed

+96
-6
lines changed

src/compiler/checker.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4310,12 +4310,12 @@ namespace ts {
43104310
function getTypeFromObjectBindingPattern(pattern: ObjectBindingPattern, includePatternInType: boolean, reportErrors: boolean): Type {
43114311
const members = createSymbolTable();
43124312
let stringIndexInfo: IndexInfo;
4313-
let hasComputedProperties = false;
4313+
let objectFlags = ObjectFlags.ObjectLiteral;
43144314
forEach(pattern.elements, e => {
43154315
const name = e.propertyName || <Identifier>e.name;
43164316
if (isComputedNonLiteralName(name)) {
43174317
// do not include computed properties in the implied type
4318-
hasComputedProperties = true;
4318+
objectFlags |= ObjectFlags.ObjectLiteralPatternWithComputedProperties;
43194319
return;
43204320
}
43214321
if (e.dotDotDotToken) {
@@ -4331,12 +4331,11 @@ namespace ts {
43314331
members.set(symbol.escapedName, symbol);
43324332
});
43334333
const result = createAnonymousType(undefined, members, emptyArray, emptyArray, stringIndexInfo, undefined);
4334+
result.flags |= TypeFlags.ContainsObjectLiteral;
4335+
result.objectFlags |= objectFlags;
43344336
if (includePatternInType) {
43354337
result.pattern = pattern;
43364338
}
4337-
if (hasComputedProperties) {
4338-
result.objectFlags |= ObjectFlags.ObjectLiteralPatternWithComputedProperties;
4339-
}
43404339
return result;
43414340
}
43424341

tests/baselines/reference/noImplicitAnyDestructuringParameterDeclaration.types

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ function f1([a], {b}, c, d) { // error
77
>d : any
88
}
99
function f2([a = undefined], {b = null}, c = undefined, d = null) { // error
10-
>f2 : ([a]: [any], { b }: { b?: null; }, c?: any, d?: any) => void
10+
>f2 : ([a]: [any], { b }: { b?: any; }, c?: any, d?: any) => void
1111
>a : any
1212
>undefined : undefined
1313
>b : any
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
//// [parameterDestructuringObjectLiteral.ts]
2+
// Repro from #22644
3+
4+
const fn1 = (options: { headers?: {} }) => { };
5+
fn1({ headers: { foo: 1 } });
6+
7+
const fn2 = ({ headers = {} }) => { };
8+
fn2({ headers: { foo: 1 } });
9+
10+
11+
//// [parameterDestructuringObjectLiteral.js]
12+
// Repro from #22644
13+
var fn1 = function (options) { };
14+
fn1({ headers: { foo: 1 } });
15+
var fn2 = function (_a) {
16+
var _b = _a.headers, headers = _b === void 0 ? {} : _b;
17+
};
18+
fn2({ headers: { foo: 1 } });
19+
20+
21+
//// [parameterDestructuringObjectLiteral.d.ts]
22+
declare const fn1: (options: {
23+
headers?: {};
24+
}) => void;
25+
declare const fn2: ({ headers }: {
26+
headers?: {};
27+
}) => void;
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
=== tests/cases/compiler/parameterDestructuringObjectLiteral.ts ===
2+
// Repro from #22644
3+
4+
const fn1 = (options: { headers?: {} }) => { };
5+
>fn1 : Symbol(fn1, Decl(parameterDestructuringObjectLiteral.ts, 2, 5))
6+
>options : Symbol(options, Decl(parameterDestructuringObjectLiteral.ts, 2, 13))
7+
>headers : Symbol(headers, Decl(parameterDestructuringObjectLiteral.ts, 2, 23))
8+
9+
fn1({ headers: { foo: 1 } });
10+
>fn1 : Symbol(fn1, Decl(parameterDestructuringObjectLiteral.ts, 2, 5))
11+
>headers : Symbol(headers, Decl(parameterDestructuringObjectLiteral.ts, 3, 5))
12+
>foo : Symbol(foo, Decl(parameterDestructuringObjectLiteral.ts, 3, 16))
13+
14+
const fn2 = ({ headers = {} }) => { };
15+
>fn2 : Symbol(fn2, Decl(parameterDestructuringObjectLiteral.ts, 5, 5))
16+
>headers : Symbol(headers, Decl(parameterDestructuringObjectLiteral.ts, 5, 14))
17+
18+
fn2({ headers: { foo: 1 } });
19+
>fn2 : Symbol(fn2, Decl(parameterDestructuringObjectLiteral.ts, 5, 5))
20+
>headers : Symbol(headers, Decl(parameterDestructuringObjectLiteral.ts, 6, 5))
21+
>foo : Symbol(foo, Decl(parameterDestructuringObjectLiteral.ts, 6, 16))
22+
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
=== tests/cases/compiler/parameterDestructuringObjectLiteral.ts ===
2+
// Repro from #22644
3+
4+
const fn1 = (options: { headers?: {} }) => { };
5+
>fn1 : (options: { headers?: {}; }) => void
6+
>(options: { headers?: {} }) => { } : (options: { headers?: {}; }) => void
7+
>options : { headers?: {}; }
8+
>headers : {}
9+
10+
fn1({ headers: { foo: 1 } });
11+
>fn1({ headers: { foo: 1 } }) : void
12+
>fn1 : (options: { headers?: {}; }) => void
13+
>{ headers: { foo: 1 } } : { headers: { foo: number; }; }
14+
>headers : { foo: number; }
15+
>{ foo: 1 } : { foo: number; }
16+
>foo : number
17+
>1 : 1
18+
19+
const fn2 = ({ headers = {} }) => { };
20+
>fn2 : ({ headers }: { headers?: {}; }) => void
21+
>({ headers = {} }) => { } : ({ headers }: { headers?: {}; }) => void
22+
>headers : {}
23+
>{} : {}
24+
25+
fn2({ headers: { foo: 1 } });
26+
>fn2({ headers: { foo: 1 } }) : void
27+
>fn2 : ({ headers }: { headers?: {}; }) => void
28+
>{ headers: { foo: 1 } } : { headers: { foo: number; }; }
29+
>headers : { foo: number; }
30+
>{ foo: 1 } : { foo: number; }
31+
>foo : number
32+
>1 : 1
33+
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// @declaration: true
2+
3+
// Repro from #22644
4+
5+
const fn1 = (options: { headers?: {} }) => { };
6+
fn1({ headers: { foo: 1 } });
7+
8+
const fn2 = ({ headers = {} }) => { };
9+
fn2({ headers: { foo: 1 } });

0 commit comments

Comments
 (0)