mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-02-07 23:08:20 -06:00
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:
commit
fb89d47508
@ -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
|
||||
|
||||
@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user