From c1128d6957c7e60f54ef6b7c5cd7e1308fa2bb69 Mon Sep 17 00:00:00 2001 From: Wesley Wigham Date: Tue, 27 Feb 2018 16:12:03 -0800 Subject: [PATCH] Fix declaration emitted crash on mapped type with no type (#22213) --- src/compiler/declarationEmitter.ts | 7 ++++++- .../reference/mappedTypeNoTypeNoCrash.errors.txt | 16 ++++++++++++++++ .../reference/mappedTypeNoTypeNoCrash.js | 4 ++++ .../reference/mappedTypeNoTypeNoCrash.symbols | 9 +++++++++ .../reference/mappedTypeNoTypeNoCrash.types | 11 +++++++++++ tests/cases/compiler/mappedTypeNoTypeNoCrash.ts | 2 ++ 6 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/mappedTypeNoTypeNoCrash.errors.txt create mode 100644 tests/baselines/reference/mappedTypeNoTypeNoCrash.js create mode 100644 tests/baselines/reference/mappedTypeNoTypeNoCrash.symbols create mode 100644 tests/baselines/reference/mappedTypeNoTypeNoCrash.types create mode 100644 tests/cases/compiler/mappedTypeNoTypeNoCrash.ts diff --git a/src/compiler/declarationEmitter.ts b/src/compiler/declarationEmitter.ts index a9b3568bfe6..43c635db2f2 100644 --- a/src/compiler/declarationEmitter.ts +++ b/src/compiler/declarationEmitter.ts @@ -608,7 +608,12 @@ namespace ts { "?"); } write(": "); - emitType(node.type); + if (node.type) { + emitType(node.type); + } + else { + write("any"); + } write(";"); writeLine(); decreaseIndent(); diff --git a/tests/baselines/reference/mappedTypeNoTypeNoCrash.errors.txt b/tests/baselines/reference/mappedTypeNoTypeNoCrash.errors.txt new file mode 100644 index 00000000000..1e32656c699 --- /dev/null +++ b/tests/baselines/reference/mappedTypeNoTypeNoCrash.errors.txt @@ -0,0 +1,16 @@ +tests/cases/compiler/mappedTypeNoTypeNoCrash.ts(1,51): error TS2304: Cannot find name 'K'. +tests/cases/compiler/mappedTypeNoTypeNoCrash.ts(1,51): error TS4081: Exported type alias 'T0' has or is using private name 'K'. +tests/cases/compiler/mappedTypeNoTypeNoCrash.ts(1,57): error TS2304: Cannot find name 'K'. +tests/cases/compiler/mappedTypeNoTypeNoCrash.ts(1,57): error TS4081: Exported type alias 'T0' has or is using private name 'K'. + + +==== tests/cases/compiler/mappedTypeNoTypeNoCrash.ts (4 errors) ==== + type T0 = ({[K in keyof T]}) extends ({[key in K]: T[K]}) ? number : never; + ~ +!!! error TS2304: Cannot find name 'K'. + ~ +!!! error TS4081: Exported type alias 'T0' has or is using private name 'K'. + ~ +!!! error TS2304: Cannot find name 'K'. + ~ +!!! error TS4081: Exported type alias 'T0' has or is using private name 'K'. \ No newline at end of file diff --git a/tests/baselines/reference/mappedTypeNoTypeNoCrash.js b/tests/baselines/reference/mappedTypeNoTypeNoCrash.js new file mode 100644 index 00000000000..ad1d9bba0bf --- /dev/null +++ b/tests/baselines/reference/mappedTypeNoTypeNoCrash.js @@ -0,0 +1,4 @@ +//// [mappedTypeNoTypeNoCrash.ts] +type T0 = ({[K in keyof T]}) extends ({[key in K]: T[K]}) ? number : never; + +//// [mappedTypeNoTypeNoCrash.js] diff --git a/tests/baselines/reference/mappedTypeNoTypeNoCrash.symbols b/tests/baselines/reference/mappedTypeNoTypeNoCrash.symbols new file mode 100644 index 00000000000..7faf2d7b35f --- /dev/null +++ b/tests/baselines/reference/mappedTypeNoTypeNoCrash.symbols @@ -0,0 +1,9 @@ +=== tests/cases/compiler/mappedTypeNoTypeNoCrash.ts === +type T0 = ({[K in keyof T]}) extends ({[key in K]: T[K]}) ? number : never; +>T0 : Symbol(T0, Decl(mappedTypeNoTypeNoCrash.ts, 0, 0)) +>T : Symbol(T, Decl(mappedTypeNoTypeNoCrash.ts, 0, 8)) +>K : Symbol(K, Decl(mappedTypeNoTypeNoCrash.ts, 0, 16)) +>T : Symbol(T, Decl(mappedTypeNoTypeNoCrash.ts, 0, 8)) +>key : Symbol(key, Decl(mappedTypeNoTypeNoCrash.ts, 0, 43)) +>T : Symbol(T, Decl(mappedTypeNoTypeNoCrash.ts, 0, 8)) + diff --git a/tests/baselines/reference/mappedTypeNoTypeNoCrash.types b/tests/baselines/reference/mappedTypeNoTypeNoCrash.types new file mode 100644 index 00000000000..0ec1e7723f8 --- /dev/null +++ b/tests/baselines/reference/mappedTypeNoTypeNoCrash.types @@ -0,0 +1,11 @@ +=== tests/cases/compiler/mappedTypeNoTypeNoCrash.ts === +type T0 = ({[K in keyof T]}) extends ({[key in K]: T[K]}) ? number : never; +>T0 : number +>T : T +>K : K +>T : T +>key : key +>K : No type information available! +>T : T +>K : No type information available! + diff --git a/tests/cases/compiler/mappedTypeNoTypeNoCrash.ts b/tests/cases/compiler/mappedTypeNoTypeNoCrash.ts new file mode 100644 index 00000000000..fc9760c7a69 --- /dev/null +++ b/tests/cases/compiler/mappedTypeNoTypeNoCrash.ts @@ -0,0 +1,2 @@ +// @declaration: true +type T0 = ({[K in keyof T]}) extends ({[key in K]: T[K]}) ? number : never; \ No newline at end of file