* Type `this` in more constructor functions Previously, `this: this` in constructor functions only when there was an explicit `@constructor` tag on the function. Now, `this: this` for any function that's known to be a constructor function. This improves completions inside constructor functions; also note that previously the compiler *did* type `this: this` inside methods of constructor functions, so this fix makes us more consistent. This is reflected in the large number of baselines that improve. The fix is a simple switch to `isJSConstructor`, which is the standard way to detect constructor functions. I'm not sure why the original PR didn't use this method. I remember discussing this limitation in the original bug, #25979, and I guess I decided that it made sense. But I was heavily primed by the bug's framing of the problem in terms of `noImplicitThis`, which *should* require an explicit `@constructor` tag. With better typing comes better detection of `@readonly` assignment; I had to fix the readonly detection code to use `isJSConstructor` as well. * Remove `Add @class tag` fix for noImplicitThis. The new rules mean that it never applies. It's possible that it should apply to functions like ```js function f() { this.init() } ``` In which `init` is never defined, but I think this program is incomplete enough that not offering the fix is fine. * Fix precedence of `@this` Previously, both `@class` and `@this` in a jsdoc would cause the `@this` annotation to be ignored. This became a worse problem with this PR, because `this` is correctly typed even without the annotation. This commit makes sure that `@this` is checked first and used if present.
54 lines
1.5 KiB
Plaintext
54 lines
1.5 KiB
Plaintext
=== tests/cases/compiler/jsDocOptionality.js ===
|
|
function MyClass() {
|
|
>MyClass : typeof MyClass
|
|
|
|
this.prop = null;
|
|
>this.prop = null : null
|
|
>this.prop : any
|
|
>this : this
|
|
>prop : any
|
|
>null : null
|
|
}
|
|
/**
|
|
* @param {string} required
|
|
* @param {string} [notRequired]
|
|
* @returns {MyClass}
|
|
*/
|
|
MyClass.prototype.optionalParam = function(required, notRequired) {
|
|
>MyClass.prototype.optionalParam = function(required, notRequired) { return this;} : (required: string, notRequired?: string) => MyClass
|
|
>MyClass.prototype.optionalParam : any
|
|
>MyClass.prototype : any
|
|
>MyClass : typeof MyClass
|
|
>prototype : any
|
|
>optionalParam : any
|
|
>function(required, notRequired) { return this;} : (required: string, notRequired?: string) => MyClass
|
|
>required : string
|
|
>notRequired : string
|
|
|
|
return this;
|
|
>this : this
|
|
|
|
};
|
|
let pInst = new MyClass();
|
|
>pInst : MyClass
|
|
>new MyClass() : MyClass
|
|
>MyClass : typeof MyClass
|
|
|
|
let c1 = pInst.optionalParam('hello')
|
|
>c1 : MyClass
|
|
>pInst.optionalParam('hello') : MyClass
|
|
>pInst.optionalParam : (required: string, notRequired?: string) => MyClass
|
|
>pInst : MyClass
|
|
>optionalParam : (required: string, notRequired?: string) => MyClass
|
|
>'hello' : "hello"
|
|
|
|
let c2 = pInst.optionalParam('hello', null)
|
|
>c2 : MyClass
|
|
>pInst.optionalParam('hello', null) : MyClass
|
|
>pInst.optionalParam : (required: string, notRequired?: string) => MyClass
|
|
>pInst : MyClass
|
|
>optionalParam : (required: string, notRequired?: string) => MyClass
|
|
>'hello' : "hello"
|
|
>null : null
|
|
|