From 6ac0dbcaef51ef09148e935c39e4108f53a2dfe7 Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Tue, 16 Apr 2019 09:46:45 -0700 Subject: [PATCH 1/3] Propagate ObjectFlags.NonInferrableType through widening --- src/compiler/checker.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 72e85b3f8a81b..4fb20294d4583 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -14231,7 +14231,7 @@ namespace ts { const result = createAnonymousType(type.symbol, members, emptyArray, emptyArray, stringIndexInfo && createIndexInfo(getWidenedType(stringIndexInfo.type), stringIndexInfo.isReadonly), numberIndexInfo && createIndexInfo(getWidenedType(numberIndexInfo.type), numberIndexInfo.isReadonly)); - result.objectFlags |= (getObjectFlags(type) & ObjectFlags.JSLiteral); // Retain js literal flag through widening + result.objectFlags |= (getObjectFlags(type) & (ObjectFlags.JSLiteral | ObjectFlags.NonInferrableType)); // Retain js literal flag through widening return result; } From dbe71a2ddde9dddad486f92a2bd3a1241e70eae2 Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Tue, 16 Apr 2019 10:00:49 -0700 Subject: [PATCH 2/3] Add regression test --- tests/cases/compiler/genericFunctionInference2.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tests/cases/compiler/genericFunctionInference2.ts b/tests/cases/compiler/genericFunctionInference2.ts index 56caca847c23d..b83247a7781a3 100644 --- a/tests/cases/compiler/genericFunctionInference2.ts +++ b/tests/cases/compiler/genericFunctionInference2.ts @@ -13,3 +13,18 @@ const myReducer1: Reducer = combineReducers({ const myReducer2 = combineReducers({ combined: combineReducers({ foo }), }); + +// Repro from #30942 + +declare function withH(handlerCreators: HandleCreatorsFactory): U; + +type Props = { out: number } + +type HandleCreatorsFactory = (initialProps: T) => { [P in keyof U]: (props: T) => U[P] }; + +const enhancer4 = withH((props: Props) => ({ + onChange: (props) => (e: any) => {}, + onSubmit: (props) => (e: any) => {}, +})); + +enhancer4.onChange(null); From 4668411464ca99d47b29d516e437c0d6899795e3 Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Tue, 16 Apr 2019 10:00:56 -0700 Subject: [PATCH 3/3] Accept new baselines --- .../reference/genericFunctionInference2.js | 20 +++++++ .../genericFunctionInference2.symbols | 52 +++++++++++++++++++ .../reference/genericFunctionInference2.types | 47 +++++++++++++++++ 3 files changed, 119 insertions(+) diff --git a/tests/baselines/reference/genericFunctionInference2.js b/tests/baselines/reference/genericFunctionInference2.js index 5a95abae8cb83..e8967ed8b8a57 100644 --- a/tests/baselines/reference/genericFunctionInference2.js +++ b/tests/baselines/reference/genericFunctionInference2.js @@ -14,6 +14,21 @@ const myReducer1: Reducer = combineReducers({ const myReducer2 = combineReducers({ combined: combineReducers({ foo }), }); + +// Repro from #30942 + +declare function withH(handlerCreators: HandleCreatorsFactory): U; + +type Props = { out: number } + +type HandleCreatorsFactory = (initialProps: T) => { [P in keyof U]: (props: T) => U[P] }; + +const enhancer4 = withH((props: Props) => ({ + onChange: (props) => (e: any) => {}, + onSubmit: (props) => (e: any) => {}, +})); + +enhancer4.onChange(null); //// [genericFunctionInference2.js] @@ -24,3 +39,8 @@ var myReducer1 = combineReducers({ var myReducer2 = combineReducers({ combined: combineReducers({ foo: foo }) }); +var enhancer4 = withH(function (props) { return ({ + onChange: function (props) { return function (e) { }; }, + onSubmit: function (props) { return function (e) { }; } +}); }); +enhancer4.onChange(null); diff --git a/tests/baselines/reference/genericFunctionInference2.symbols b/tests/baselines/reference/genericFunctionInference2.symbols index d77f1182b926a..ca099b062eb43 100644 --- a/tests/baselines/reference/genericFunctionInference2.symbols +++ b/tests/baselines/reference/genericFunctionInference2.symbols @@ -54,3 +54,55 @@ const myReducer2 = combineReducers({ }); +// Repro from #30942 + +declare function withH(handlerCreators: HandleCreatorsFactory): U; +>withH : Symbol(withH, Decl(genericFunctionInference2.ts, 14, 3)) +>T : Symbol(T, Decl(genericFunctionInference2.ts, 18, 23)) +>U : Symbol(U, Decl(genericFunctionInference2.ts, 18, 25)) +>handlerCreators : Symbol(handlerCreators, Decl(genericFunctionInference2.ts, 18, 29)) +>HandleCreatorsFactory : Symbol(HandleCreatorsFactory, Decl(genericFunctionInference2.ts, 20, 28)) +>T : Symbol(T, Decl(genericFunctionInference2.ts, 18, 23)) +>U : Symbol(U, Decl(genericFunctionInference2.ts, 18, 25)) +>U : Symbol(U, Decl(genericFunctionInference2.ts, 18, 25)) + +type Props = { out: number } +>Props : Symbol(Props, Decl(genericFunctionInference2.ts, 18, 78)) +>out : Symbol(out, Decl(genericFunctionInference2.ts, 20, 14)) + +type HandleCreatorsFactory = (initialProps: T) => { [P in keyof U]: (props: T) => U[P] }; +>HandleCreatorsFactory : Symbol(HandleCreatorsFactory, Decl(genericFunctionInference2.ts, 20, 28)) +>T : Symbol(T, Decl(genericFunctionInference2.ts, 22, 27)) +>U : Symbol(U, Decl(genericFunctionInference2.ts, 22, 29)) +>initialProps : Symbol(initialProps, Decl(genericFunctionInference2.ts, 22, 36)) +>T : Symbol(T, Decl(genericFunctionInference2.ts, 22, 27)) +>P : Symbol(P, Decl(genericFunctionInference2.ts, 22, 59)) +>U : Symbol(U, Decl(genericFunctionInference2.ts, 22, 29)) +>props : Symbol(props, Decl(genericFunctionInference2.ts, 22, 75)) +>T : Symbol(T, Decl(genericFunctionInference2.ts, 22, 27)) +>U : Symbol(U, Decl(genericFunctionInference2.ts, 22, 29)) +>P : Symbol(P, Decl(genericFunctionInference2.ts, 22, 59)) + +const enhancer4 = withH((props: Props) => ({ +>enhancer4 : Symbol(enhancer4, Decl(genericFunctionInference2.ts, 24, 5)) +>withH : Symbol(withH, Decl(genericFunctionInference2.ts, 14, 3)) +>props : Symbol(props, Decl(genericFunctionInference2.ts, 24, 25)) +>Props : Symbol(Props, Decl(genericFunctionInference2.ts, 18, 78)) + + onChange: (props) => (e: any) => {}, +>onChange : Symbol(onChange, Decl(genericFunctionInference2.ts, 24, 44)) +>props : Symbol(props, Decl(genericFunctionInference2.ts, 25, 15)) +>e : Symbol(e, Decl(genericFunctionInference2.ts, 25, 26)) + + onSubmit: (props) => (e: any) => {}, +>onSubmit : Symbol(onSubmit, Decl(genericFunctionInference2.ts, 25, 40)) +>props : Symbol(props, Decl(genericFunctionInference2.ts, 26, 15)) +>e : Symbol(e, Decl(genericFunctionInference2.ts, 26, 26)) + +})); + +enhancer4.onChange(null); +>enhancer4.onChange : Symbol(onChange, Decl(genericFunctionInference2.ts, 24, 44)) +>enhancer4 : Symbol(enhancer4, Decl(genericFunctionInference2.ts, 24, 5)) +>onChange : Symbol(onChange, Decl(genericFunctionInference2.ts, 24, 44)) + diff --git a/tests/baselines/reference/genericFunctionInference2.types b/tests/baselines/reference/genericFunctionInference2.types index 48b8d084fd629..75e116d169dd9 100644 --- a/tests/baselines/reference/genericFunctionInference2.types +++ b/tests/baselines/reference/genericFunctionInference2.types @@ -47,3 +47,50 @@ const myReducer2 = combineReducers({ }); +// Repro from #30942 + +declare function withH(handlerCreators: HandleCreatorsFactory): U; +>withH : (handlerCreators: HandleCreatorsFactory) => U +>handlerCreators : HandleCreatorsFactory + +type Props = { out: number } +>Props : Props +>out : number + +type HandleCreatorsFactory = (initialProps: T) => { [P in keyof U]: (props: T) => U[P] }; +>HandleCreatorsFactory : HandleCreatorsFactory +>initialProps : T +>props : T + +const enhancer4 = withH((props: Props) => ({ +>enhancer4 : { onChange: (e: any) => void; onSubmit: (e: any) => void; } +>withH((props: Props) => ({ onChange: (props) => (e: any) => {}, onSubmit: (props) => (e: any) => {},})) : { onChange: (e: any) => void; onSubmit: (e: any) => void; } +>withH : (handlerCreators: HandleCreatorsFactory) => U +>(props: Props) => ({ onChange: (props) => (e: any) => {}, onSubmit: (props) => (e: any) => {},}) : (props: Props) => { onChange: (props: Props) => (e: any) => void; onSubmit: (props: Props) => (e: any) => void; } +>props : Props +>({ onChange: (props) => (e: any) => {}, onSubmit: (props) => (e: any) => {},}) : { onChange: (props: Props) => (e: any) => void; onSubmit: (props: Props) => (e: any) => void; } +>{ onChange: (props) => (e: any) => {}, onSubmit: (props) => (e: any) => {},} : { onChange: (props: Props) => (e: any) => void; onSubmit: (props: Props) => (e: any) => void; } + + onChange: (props) => (e: any) => {}, +>onChange : (props: Props) => (e: any) => void +>(props) => (e: any) => {} : (props: Props) => (e: any) => void +>props : Props +>(e: any) => {} : (e: any) => void +>e : any + + onSubmit: (props) => (e: any) => {}, +>onSubmit : (props: Props) => (e: any) => void +>(props) => (e: any) => {} : (props: Props) => (e: any) => void +>props : Props +>(e: any) => {} : (e: any) => void +>e : any + +})); + +enhancer4.onChange(null); +>enhancer4.onChange(null) : void +>enhancer4.onChange : (e: any) => void +>enhancer4 : { onChange: (e: any) => void; onSubmit: (e: any) => void; } +>onChange : (e: any) => void +>null : null +