Skip to content

Commit 6b510ca

Browse files
committed
Only disable widening when the expression is contextually typed
1 parent af8ba9a commit 6b510ca

19 files changed

+145
-80
lines changed

Diff for: src/compiler/checker.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -18056,7 +18056,7 @@ namespace ts {
1805618056
type = getWidenedLiteralLikeTypeForContextualType(type, contextualType);
1805718057
}
1805818058

18059-
const widenedType = (isFunctionExpression(func) && !func.name) || isArrowFunction(func) ? type : getWidenedType(type);
18059+
const widenedType = ((isFunctionExpression(func) && !func.name) || isArrowFunction(func)) && getContextualType(func) ? type : getWidenedType(type);
1806018060
switch (functionFlags & FunctionFlags.AsyncGenerator) {
1806118061
case FunctionFlags.AsyncGenerator:
1806218062
return createAsyncIterableIteratorType(widenedType);

Diff for: tests/baselines/reference/callNonGenericFunctionWithTypeArguments.types

+4-4
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,15 @@ var r = f<string>(1);
1414
>1 : 1
1515

1616
var f2 = (x: number) => { return null; }
17-
>f2 : (x: number) => null
18-
>(x: number) => { return null; } : (x: number) => null
17+
>f2 : (x: number) => any
18+
>(x: number) => { return null; } : (x: number) => any
1919
>x : number
2020
>null : null
2121

2222
var r2 = f2<string>(1);
2323
>r2 : any
24-
>f2<string>(1) : null
25-
>f2 : (x: number) => null
24+
>f2<string>(1) : any
25+
>f2 : (x: number) => any
2626
>1 : 1
2727

2828
var f3: { (x: number): any; }

Diff for: tests/baselines/reference/declarationEmitAliasExportStar.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,4 @@ export interface ThingB {
2828
export * from "./thingB";
2929
//// [index.d.ts]
3030
import * as things from "./things";
31-
export declare const thing2: (param: things.ThingB) => null;
31+
export declare const thing2: (param: things.ThingB) => any;

Diff for: tests/baselines/reference/declarationEmitAliasExportStar.types

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ import * as things from "./things";
99
>things : typeof things
1010

1111
export const thing2 = (param: things.ThingB) => null;
12-
>thing2 : (param: things.ThingB) => null
13-
>(param: things.ThingB) => null : (param: things.ThingB) => null
12+
>thing2 : (param: things.ThingB) => any
13+
>(param: things.ThingB) => null : (param: things.ThingB) => any
1414
>param : things.ThingB
1515
>things : any
1616
>ThingB : things.ThingB
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
=== tests/cases/compiler/decoratorMetadataNoStrictNull.ts ===
22
const dec = (obj: {}, prop: string) => undefined
3-
>dec : (obj: {}, prop: string) => undefined
4-
>(obj: {}, prop: string) => undefined : (obj: {}, prop: string) => undefined
3+
>dec : (obj: {}, prop: string) => any
4+
>(obj: {}, prop: string) => undefined : (obj: {}, prop: string) => any
55
>obj : {}
66
>prop : string
77
>undefined : undefined
@@ -10,11 +10,11 @@ class Foo {
1010
>Foo : Foo
1111

1212
@dec public foo: string | null;
13-
>dec : (obj: {}, prop: string) => undefined
13+
>dec : (obj: {}, prop: string) => any
1414
>foo : string
1515
>null : null
1616

1717
@dec public bar: string;
18-
>dec : (obj: {}, prop: string) => undefined
18+
>dec : (obj: {}, prop: string) => any
1919
>bar : string
2020
}

Diff for: tests/baselines/reference/fatarrowfunctionsErrors.types

+3-3
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,10 @@ var y = x:number => x*x;
3939
>x : any
4040

4141
false? (() => null): null;
42-
>false? (() => null): null : () => null
42+
>false? (() => null): null : () => any
4343
>false : false
44-
>(() => null) : () => null
45-
>() => null : () => null
44+
>(() => null) : () => any
45+
>() => null : () => any
4646
>null : null
4747
>null : null
4848

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
//// [functionExpressionReturnTypeNotFresh.ts]
2+
const a = () => ({
3+
a: 12,
4+
b: 11
5+
});
6+
7+
declare function f(arg: {a: number}): void;
8+
f(a());
9+
10+
//// [functionExpressionReturnTypeNotFresh.js]
11+
"use strict";
12+
var a = function () { return ({
13+
a: 12,
14+
b: 11
15+
}); };
16+
f(a());
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
=== tests/cases/compiler/functionExpressionReturnTypeNotFresh.ts ===
2+
const a = () => ({
3+
>a : Symbol(a, Decl(functionExpressionReturnTypeNotFresh.ts, 0, 5))
4+
5+
a: 12,
6+
>a : Symbol(a, Decl(functionExpressionReturnTypeNotFresh.ts, 0, 18))
7+
8+
b: 11
9+
>b : Symbol(b, Decl(functionExpressionReturnTypeNotFresh.ts, 1, 10))
10+
11+
});
12+
13+
declare function f(arg: {a: number}): void;
14+
>f : Symbol(f, Decl(functionExpressionReturnTypeNotFresh.ts, 3, 3))
15+
>arg : Symbol(arg, Decl(functionExpressionReturnTypeNotFresh.ts, 5, 19))
16+
>a : Symbol(a, Decl(functionExpressionReturnTypeNotFresh.ts, 5, 25))
17+
18+
f(a());
19+
>f : Symbol(f, Decl(functionExpressionReturnTypeNotFresh.ts, 3, 3))
20+
>a : Symbol(a, Decl(functionExpressionReturnTypeNotFresh.ts, 0, 5))
21+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
=== tests/cases/compiler/functionExpressionReturnTypeNotFresh.ts ===
2+
const a = () => ({
3+
>a : () => { a: number; b: number; }
4+
>() => ({ a: 12, b: 11}) : () => { a: number; b: number; }
5+
>({ a: 12, b: 11}) : { a: number; b: number; }
6+
>{ a: 12, b: 11} : { a: number; b: number; }
7+
8+
a: 12,
9+
>a : number
10+
>12 : 12
11+
12+
b: 11
13+
>b : number
14+
>11 : 11
15+
16+
});
17+
18+
declare function f(arg: {a: number}): void;
19+
>f : (arg: { a: number; }) => void
20+
>arg : { a: number; }
21+
>a : number
22+
23+
f(a());
24+
>f(a()) : void
25+
>f : (arg: { a: number; }) => void
26+
>a() : { a: number; b: number; }
27+
>a : () => { a: number; b: number; }
28+

Diff for: tests/baselines/reference/functionImplementations.types

+4-4
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,8 @@ var nu = null;
112112

113113
var nu = function () {
114114
>nu : any
115-
>function () { return null;} () : null
116-
>function () { return null;} : () => null
115+
>function () { return null;} () : any
116+
>function () { return null;} : () => any
117117

118118
return null;
119119
>null : null
@@ -127,8 +127,8 @@ var un = undefined;
127127

128128
var un = function () {
129129
>un : any
130-
>function () { return undefined;} () : undefined
131-
>function () { return undefined;} : () => undefined
130+
>function () { return undefined;} () : any
131+
>function () { return undefined;} : () => any
132132

133133
return undefined;
134134
>undefined : undefined

Diff for: tests/baselines/reference/genericClassWithStaticsUsingTypeArguments.types

+2-2
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ class Foo<T> {
3434
>null : null
3535

3636
static e = function (x: T) { return null; }
37-
>e : (x: any) => null
38-
>function (x: T) { return null; } : (x: any) => null
37+
>e : (x: any) => any
38+
>function (x: T) { return null; } : (x: any) => any
3939
>x : any
4040
>T : No type information available!
4141
>null : null

Diff for: tests/baselines/reference/heterogeneousArrayLiterals.types

+24-24
Original file line numberDiff line numberDiff line change
@@ -88,21 +88,21 @@ var k = [() => 1, () => 1]; // { (): number }[]
8888
>1 : 1
8989

9090
var l = [() => 1, () => null]; // { (): any }[]
91-
>l : (() => number)[]
92-
>[() => 1, () => null] : (() => number)[]
91+
>l : (() => any)[]
92+
>[() => 1, () => null] : (() => any)[]
9393
>() => 1 : () => number
9494
>1 : 1
95-
>() => null : () => null
95+
>() => null : () => any
9696
>null : null
9797

9898
var m = [() => 1, () => '', () => null]; // { (): any }[]
99-
>m : ((() => number) | (() => string))[]
100-
>[() => 1, () => '', () => null] : ((() => number) | (() => string))[]
99+
>m : (() => any)[]
100+
>[() => 1, () => '', () => null] : (() => any)[]
101101
>() => 1 : () => number
102102
>1 : 1
103103
>() => '' : () => string
104104
>'' : ""
105-
>() => null : () => null
105+
>() => null : () => any
106106
>null : null
107107

108108
var n = [[() => 1], [() => '']]; // {}[]
@@ -185,21 +185,21 @@ module Derived {
185185
>1 : 1
186186

187187
var l = [() => base, () => null]; // { (): any }[]
188-
>l : (() => Base)[]
189-
>[() => base, () => null] : (() => Base)[]
188+
>l : (() => any)[]
189+
>[() => base, () => null] : (() => any)[]
190190
>() => base : () => Base
191191
>base : Base
192-
>() => null : () => null
192+
>() => null : () => any
193193
>null : null
194194

195195
var m = [() => base, () => derived, () => null]; // { (): any }[]
196-
>m : (() => Base)[]
197-
>[() => base, () => derived, () => null] : (() => Base)[]
196+
>m : (() => any)[]
197+
>[() => base, () => derived, () => null] : (() => any)[]
198198
>() => base : () => Base
199199
>base : Base
200200
>() => derived : () => Derived
201201
>derived : Derived
202-
>() => null : () => null
202+
>() => null : () => any
203203
>null : null
204204

205205
var n = [[() => base], [() => derived]]; // { (): Base }[]
@@ -310,13 +310,13 @@ function foo<T, U>(t: T, u: U) {
310310
>u : U
311311

312312
var f = [() => t, () => u, () => null]; // { (): any }[]
313-
>f : ((() => T) | (() => U))[]
314-
>[() => t, () => u, () => null] : ((() => T) | (() => U))[]
313+
>f : (() => any)[]
314+
>[() => t, () => u, () => null] : (() => any)[]
315315
>() => t : () => T
316316
>t : T
317317
>() => u : () => U
318318
>u : U
319-
>() => null : () => null
319+
>() => null : () => any
320320
>null : null
321321
}
322322

@@ -364,13 +364,13 @@ function foo2<T extends Base, U extends Derived>(t: T, u: U) {
364364
>u : U
365365

366366
var f = [() => t, () => u, () => null]; // { (): any }[]
367-
>f : ((() => T) | (() => U))[]
368-
>[() => t, () => u, () => null] : ((() => T) | (() => U))[]
367+
>f : (() => any)[]
368+
>[() => t, () => u, () => null] : (() => any)[]
369369
>() => t : () => T
370370
>t : T
371371
>() => u : () => U
372372
>u : U
373-
>() => null : () => null
373+
>() => null : () => any
374374
>null : null
375375

376376
var g = [t, base]; // Base[]
@@ -442,13 +442,13 @@ function foo3<T extends Derived, U extends Derived>(t: T, u: U) {
442442
>u : U
443443

444444
var f = [() => t, () => u, () => null]; // { (): any }[]
445-
>f : ((() => T) | (() => U))[]
446-
>[() => t, () => u, () => null] : ((() => T) | (() => U))[]
445+
>f : (() => any)[]
446+
>[() => t, () => u, () => null] : (() => any)[]
447447
>() => t : () => T
448448
>t : T
449449
>() => u : () => U
450450
>u : U
451-
>() => null : () => null
451+
>() => null : () => any
452452
>null : null
453453

454454
var g = [t, base]; // Base[]
@@ -520,13 +520,13 @@ function foo4<T extends Base, U extends Base>(t: T, u: U) {
520520
>u : U
521521

522522
var f = [() => t, () => u, () => null]; // { (): any }[]
523-
>f : ((() => T) | (() => U))[]
524-
>[() => t, () => u, () => null] : ((() => T) | (() => U))[]
523+
>f : (() => any)[]
524+
>[() => t, () => u, () => null] : (() => any)[]
525525
>() => t : () => T
526526
>t : T
527527
>() => u : () => U
528528
>u : U
529-
>() => null : () => null
529+
>() => null : () => any
530530
>null : null
531531

532532
var g = [t, base]; // Base[]

Diff for: tests/baselines/reference/implicitAnyDeclareFunctionExprWithoutFormalType.types

+6-6
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ var lamda3 = function myLambda3(myParam) { }
1818
>myParam : any
1919

2020
var lamda4 = () => { return null };
21-
>lamda4 : () => null
22-
>() => { return null } : () => null
21+
>lamda4 : () => any
22+
>() => { return null } : () => any
2323
>null : null
2424

2525
// these should be error for implicit any return type
@@ -30,8 +30,8 @@ var lambda5 = function temp() { return null; }
3030
>null : null
3131

3232
var lambda6 = () => { return null; }
33-
>lambda6 : () => null
34-
>() => { return null; } : () => null
33+
>lambda6 : () => any
34+
>() => { return null; } : () => any
3535
>null : null
3636

3737
var lambda7 = function temp() { return undefined; }
@@ -41,8 +41,8 @@ var lambda7 = function temp() { return undefined; }
4141
>undefined : undefined
4242

4343
var lambda8 = () => { return undefined; }
44-
>lambda8 : () => undefined
45-
>() => { return undefined; } : () => undefined
44+
>lambda8 : () => any
45+
>() => { return undefined; } : () => any
4646
>undefined : undefined
4747

4848
// this shouldn't be an error

0 commit comments

Comments
 (0)