From b71980f321ffd13c8eb721edbfebc09415005a8c Mon Sep 17 00:00:00 2001 From: Andy Hanson Date: Tue, 5 Jun 2018 13:17:04 -0700 Subject: [PATCH] Support inferring an index signature from 'any' --- src/compiler/checker.ts | 4 ++++ .../reference/inferIndexSignatureFromAny.js | 7 +++++++ .../reference/inferIndexSignatureFromAny.symbols | 13 +++++++++++++ .../reference/inferIndexSignatureFromAny.types | 16 ++++++++++++++++ .../cases/compiler/inferIndexSignatureFromAny.ts | 2 ++ 5 files changed, 42 insertions(+) create mode 100644 tests/baselines/reference/inferIndexSignatureFromAny.js create mode 100644 tests/baselines/reference/inferIndexSignatureFromAny.symbols create mode 100644 tests/baselines/reference/inferIndexSignatureFromAny.types create mode 100644 tests/cases/compiler/inferIndexSignatureFromAny.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 62607797679ea..712139a46ff8e 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -7137,6 +7137,7 @@ namespace ts { return getUnionType(propTypes, UnionReduction.Subtype); } } + if (isTypeAny(type)) return type; return undefined; } @@ -12714,6 +12715,9 @@ namespace ts { inferFromObjectTypes(source, target); } } + else if (isTypeAny(source)) { + inferFromIndexTypes(source, target); + } } } diff --git a/tests/baselines/reference/inferIndexSignatureFromAny.js b/tests/baselines/reference/inferIndexSignatureFromAny.js new file mode 100644 index 0000000000000..428c4b9326217 --- /dev/null +++ b/tests/baselines/reference/inferIndexSignatureFromAny.js @@ -0,0 +1,7 @@ +//// [inferIndexSignatureFromAny.ts] +declare function f(x: { [key: string]: T }): T; +const a = f(null); + + +//// [inferIndexSignatureFromAny.js] +var a = f(null); diff --git a/tests/baselines/reference/inferIndexSignatureFromAny.symbols b/tests/baselines/reference/inferIndexSignatureFromAny.symbols new file mode 100644 index 0000000000000..b59fbc965f400 --- /dev/null +++ b/tests/baselines/reference/inferIndexSignatureFromAny.symbols @@ -0,0 +1,13 @@ +=== tests/cases/compiler/inferIndexSignatureFromAny.ts === +declare function f(x: { [key: string]: T }): T; +>f : Symbol(f, Decl(inferIndexSignatureFromAny.ts, 0, 0)) +>T : Symbol(T, Decl(inferIndexSignatureFromAny.ts, 0, 19)) +>x : Symbol(x, Decl(inferIndexSignatureFromAny.ts, 0, 22)) +>key : Symbol(key, Decl(inferIndexSignatureFromAny.ts, 0, 28)) +>T : Symbol(T, Decl(inferIndexSignatureFromAny.ts, 0, 19)) +>T : Symbol(T, Decl(inferIndexSignatureFromAny.ts, 0, 19)) + +const a = f(null); +>a : Symbol(a, Decl(inferIndexSignatureFromAny.ts, 1, 5)) +>f : Symbol(f, Decl(inferIndexSignatureFromAny.ts, 0, 0)) + diff --git a/tests/baselines/reference/inferIndexSignatureFromAny.types b/tests/baselines/reference/inferIndexSignatureFromAny.types new file mode 100644 index 0000000000000..5eff892f0b3f4 --- /dev/null +++ b/tests/baselines/reference/inferIndexSignatureFromAny.types @@ -0,0 +1,16 @@ +=== tests/cases/compiler/inferIndexSignatureFromAny.ts === +declare function f(x: { [key: string]: T }): T; +>f : (x: { [key: string]: T; }) => T +>T : T +>x : { [key: string]: T; } +>key : string +>T : T +>T : T + +const a = f(null); +>a : any +>f(null) : any +>f : (x: { [key: string]: T; }) => T +>null : any +>null : null + diff --git a/tests/cases/compiler/inferIndexSignatureFromAny.ts b/tests/cases/compiler/inferIndexSignatureFromAny.ts new file mode 100644 index 0000000000000..8a233c63aa891 --- /dev/null +++ b/tests/cases/compiler/inferIndexSignatureFromAny.ts @@ -0,0 +1,2 @@ +declare function f(x: { [key: string]: T }): T; +const a = f(null);