Merge pull request #17252 from Microsoft/contextually-type-this-in-object-literals-in-javascript

Contextually type this in object literals in JS
This commit is contained in:
Nathan Shively-Sanders 2017-07-18 10:18:10 -07:00 committed by GitHub
commit fb89d47508
4 changed files with 74 additions and 1 deletions

View File

@ -12662,7 +12662,7 @@ namespace ts {
}
}
}
if (noImplicitThis) {
if (noImplicitThis || isInJavaScriptFile(func)) {
const containingLiteral = getContainingObjectLiteral(func);
if (containingLiteral) {
// We have an object literal method. Check if the containing object literal has a contextual type

View File

@ -0,0 +1,28 @@
=== tests/cases/conformance/types/thisType/context.js ===
const obj = {
>obj : Symbol(obj, Decl(context.js, 0, 5))
prop: 2,
>prop : Symbol(prop, Decl(context.js, 0, 13))
method() {
>method : Symbol(method, Decl(context.js, 1, 12))
this;
>this : Symbol(obj, Decl(context.js, 0, 11))
this.prop;
>this.prop : Symbol(prop, Decl(context.js, 0, 13))
>this : Symbol(obj, Decl(context.js, 0, 11))
>prop : Symbol(prop, Decl(context.js, 0, 13))
this.method;
>this.method : Symbol(method, Decl(context.js, 1, 12))
>this : Symbol(obj, Decl(context.js, 0, 11))
>method : Symbol(method, Decl(context.js, 1, 12))
this.unknown; // ok, obj has a string indexer
>this : Symbol(obj, Decl(context.js, 0, 11))
}
}

View File

@ -0,0 +1,32 @@
=== tests/cases/conformance/types/thisType/context.js ===
const obj = {
>obj : { [x: string]: any; prop: number; method(): void; }
>{ prop: 2, method() { this; this.prop; this.method; this.unknown; // ok, obj has a string indexer }} : { [x: string]: any; prop: number; method(): void; }
prop: 2,
>prop : number
>2 : 2
method() {
>method : () => void
this;
>this : { [x: string]: any; prop: number; method(): void; }
this.prop;
>this.prop : number
>this : { [x: string]: any; prop: number; method(): void; }
>prop : number
this.method;
>this.method : () => void
>this : { [x: string]: any; prop: number; method(): void; }
>method : () => void
this.unknown; // ok, obj has a string indexer
>this.unknown : any
>this : { [x: string]: any; prop: number; method(): void; }
>unknown : any
}
}

View File

@ -0,0 +1,13 @@
// @allowJs: true
// @checkJs: true
// @noEmit: true
// @Filename: context.js
const obj = {
prop: 2,
method() {
this;
this.prop;
this.method;
this.unknown; // ok, obj has a string indexer
}
}