From cf6d98bb94621d2cd9186db1bbdb79e47a0319e0 Mon Sep 17 00:00:00 2001 From: Wesley Wigham Date: Tue, 10 Apr 2018 13:45:27 -0700 Subject: [PATCH] handle any'd method signature types (ie, from special property declarations) --- src/compiler/checker.ts | 3 + ...owJscheckJsTypeParameterNoCrash.errors.txt | 23 ++++++++ .../allowJscheckJsTypeParameterNoCrash.js | 38 +++++++++++++ ...allowJscheckJsTypeParameterNoCrash.symbols | 51 +++++++++++++++++ .../allowJscheckJsTypeParameterNoCrash.types | 57 +++++++++++++++++++ .../allowJscheckJsTypeParameterNoCrash.ts | 21 +++++++ .../TypeScript-Node-Starter | 2 +- 7 files changed, 194 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/allowJscheckJsTypeParameterNoCrash.errors.txt create mode 100644 tests/baselines/reference/allowJscheckJsTypeParameterNoCrash.js create mode 100644 tests/baselines/reference/allowJscheckJsTypeParameterNoCrash.symbols create mode 100644 tests/baselines/reference/allowJscheckJsTypeParameterNoCrash.types create mode 100644 tests/cases/compiler/allowJscheckJsTypeParameterNoCrash.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 42e7e8f7b16f8..58b31bb248ede 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -19090,6 +19090,9 @@ namespace ts { const links = getNodeLinks(node); const type = getTypeOfSymbol(node.symbol); + if (isTypeAny(type)) { + return type; + } // Check if function expression is contextually typed and assign parameter types if so. if (!(links.flags & NodeCheckFlags.ContextChecked)) { diff --git a/tests/baselines/reference/allowJscheckJsTypeParameterNoCrash.errors.txt b/tests/baselines/reference/allowJscheckJsTypeParameterNoCrash.errors.txt new file mode 100644 index 0000000000000..5548bc5e3dcc4 --- /dev/null +++ b/tests/baselines/reference/allowJscheckJsTypeParameterNoCrash.errors.txt @@ -0,0 +1,23 @@ +tests/cases/compiler/app.js(6,7): error TS2322: Type '1' is not assignable to type 'WatchHandler'. + + +==== tests/cases/compiler/func.ts (0 errors) ==== + interface ComponentOptions { + watch: Record>; + } + type WatchHandler = (val: T) => void; + declare function extend(options: ComponentOptions<{}>): void; + export var vextend = extend; +==== tests/cases/compiler/app.js (1 errors) ==== + import {vextend} from './func'; + // hover on vextend + export var a = vextend({ + watch: { + data1(val) { + this.data2 = 1; + ~~~~~~~~~~ +!!! error TS2322: Type '1' is not assignable to type 'WatchHandler'. + }, + data2(val) { }, + } + }); \ No newline at end of file diff --git a/tests/baselines/reference/allowJscheckJsTypeParameterNoCrash.js b/tests/baselines/reference/allowJscheckJsTypeParameterNoCrash.js new file mode 100644 index 0000000000000..c2b9ddb5556ee --- /dev/null +++ b/tests/baselines/reference/allowJscheckJsTypeParameterNoCrash.js @@ -0,0 +1,38 @@ +//// [tests/cases/compiler/allowJscheckJsTypeParameterNoCrash.ts] //// + +//// [func.ts] +interface ComponentOptions { + watch: Record>; +} +type WatchHandler = (val: T) => void; +declare function extend(options: ComponentOptions<{}>): void; +export var vextend = extend; +//// [app.js] +import {vextend} from './func'; +// hover on vextend +export var a = vextend({ + watch: { + data1(val) { + this.data2 = 1; + }, + data2(val) { }, + } +}); + +//// [func.js] +"use strict"; +exports.__esModule = true; +exports.vextend = extend; +//// [app.js] +"use strict"; +exports.__esModule = true; +var func_1 = require("./func"); +// hover on vextend +exports.a = func_1.vextend({ + watch: { + data1: function (val) { + this.data2 = 1; + }, + data2: function (val) { } + } +}); diff --git a/tests/baselines/reference/allowJscheckJsTypeParameterNoCrash.symbols b/tests/baselines/reference/allowJscheckJsTypeParameterNoCrash.symbols new file mode 100644 index 0000000000000..2ca59a3dc606f --- /dev/null +++ b/tests/baselines/reference/allowJscheckJsTypeParameterNoCrash.symbols @@ -0,0 +1,51 @@ +=== tests/cases/compiler/func.ts === +interface ComponentOptions { +>ComponentOptions : Symbol(ComponentOptions, Decl(func.ts, 0, 0)) +>V : Symbol(V, Decl(func.ts, 0, 27)) + + watch: Record>; +>watch : Symbol(ComponentOptions.watch, Decl(func.ts, 0, 31)) +>Record : Symbol(Record, Decl(lib.d.ts, --, --)) +>WatchHandler : Symbol(WatchHandler, Decl(func.ts, 2, 1)) +} +type WatchHandler = (val: T) => void; +>WatchHandler : Symbol(WatchHandler, Decl(func.ts, 2, 1)) +>T : Symbol(T, Decl(func.ts, 3, 18)) +>val : Symbol(val, Decl(func.ts, 3, 24)) +>T : Symbol(T, Decl(func.ts, 3, 18)) + +declare function extend(options: ComponentOptions<{}>): void; +>extend : Symbol(extend, Decl(func.ts, 3, 40)) +>options : Symbol(options, Decl(func.ts, 4, 24)) +>ComponentOptions : Symbol(ComponentOptions, Decl(func.ts, 0, 0)) + +export var vextend = extend; +>vextend : Symbol(vextend, Decl(func.ts, 5, 10)) +>extend : Symbol(extend, Decl(func.ts, 3, 40)) + +=== tests/cases/compiler/app.js === +import {vextend} from './func'; +>vextend : Symbol(vextend, Decl(app.js, 0, 8)) + +// hover on vextend +export var a = vextend({ +>a : Symbol(a, Decl(app.js, 2, 10)) +>vextend : Symbol(vextend, Decl(app.js, 0, 8)) + + watch: { +>watch : Symbol(watch, Decl(app.js, 2, 24)) + + data1(val) { +>data1 : Symbol(data1, Decl(app.js, 3, 10)) +>val : Symbol(val, Decl(app.js, 4, 10)) + + this.data2 = 1; +>this : Symbol(__type, Decl(lib.d.ts, --, --)) +>data2 : Symbol(data2, Decl(app.js, 4, 16), Decl(app.js, 6, 6)) + + }, + data2(val) { }, +>data2 : Symbol(data2, Decl(app.js, 4, 16), Decl(app.js, 6, 6)) +>val : Symbol(val, Decl(app.js, 7, 10)) + } +}); diff --git a/tests/baselines/reference/allowJscheckJsTypeParameterNoCrash.types b/tests/baselines/reference/allowJscheckJsTypeParameterNoCrash.types new file mode 100644 index 0000000000000..396cdd4445eeb --- /dev/null +++ b/tests/baselines/reference/allowJscheckJsTypeParameterNoCrash.types @@ -0,0 +1,57 @@ +=== tests/cases/compiler/func.ts === +interface ComponentOptions { +>ComponentOptions : ComponentOptions +>V : V + + watch: Record>; +>watch : Record void> +>Record : Record +>WatchHandler : (val: T) => void +} +type WatchHandler = (val: T) => void; +>WatchHandler : (val: T) => void +>T : T +>val : T +>T : T + +declare function extend(options: ComponentOptions<{}>): void; +>extend : (options: ComponentOptions<{}>) => void +>options : ComponentOptions<{}> +>ComponentOptions : ComponentOptions + +export var vextend = extend; +>vextend : (options: ComponentOptions<{}>) => void +>extend : (options: ComponentOptions<{}>) => void + +=== tests/cases/compiler/app.js === +import {vextend} from './func'; +>vextend : (options: ComponentOptions<{}>) => void + +// hover on vextend +export var a = vextend({ +>a : void +>vextend({ watch: { data1(val) { this.data2 = 1; }, data2(val) { }, }}) : void +>vextend : (options: ComponentOptions<{}>) => void +>{ watch: { data1(val) { this.data2 = 1; }, data2(val) { }, }} : { watch: { data1(val: any): void; }; } + + watch: { +>watch : { data1(val: any): void; } +>{ data1(val) { this.data2 = 1; }, data2(val) { }, } : { data1(val: any): void; } + + data1(val) { +>data1 : (val: any) => void +>val : any + + this.data2 = 1; +>this.data2 = 1 : 1 +>this.data2 : (val: any) => void +>this : Record void> +>data2 : (val: any) => void +>1 : 1 + + }, + data2(val) { }, +>data2 : any +>val : any + } +}); diff --git a/tests/cases/compiler/allowJscheckJsTypeParameterNoCrash.ts b/tests/cases/compiler/allowJscheckJsTypeParameterNoCrash.ts new file mode 100644 index 0000000000000..90f9869d94d63 --- /dev/null +++ b/tests/cases/compiler/allowJscheckJsTypeParameterNoCrash.ts @@ -0,0 +1,21 @@ +// @checkJs: true +// @allowJs: true +// @outDir: ./dist +// @filename: func.ts +interface ComponentOptions { + watch: Record>; +} +type WatchHandler = (val: T) => void; +declare function extend(options: ComponentOptions<{}>): void; +export var vextend = extend; +// @filename: app.js +import {vextend} from './func'; +// hover on vextend +export var a = vextend({ + watch: { + data1(val) { + this.data2 = 1; + }, + data2(val) { }, + } +}); \ No newline at end of file diff --git a/tests/cases/user/TypeScript-Node-Starter/TypeScript-Node-Starter b/tests/cases/user/TypeScript-Node-Starter/TypeScript-Node-Starter index ed149eb0c787b..40bdb4eadabc9 160000 --- a/tests/cases/user/TypeScript-Node-Starter/TypeScript-Node-Starter +++ b/tests/cases/user/TypeScript-Node-Starter/TypeScript-Node-Starter @@ -1 +1 @@ -Subproject commit ed149eb0c787b1195a95b44105822c64bb6eb636 +Subproject commit 40bdb4eadabc9fbed7d83e3f26817a931c0763b6