microsoft / microsoft/TypeScript
Difference in overload pick between JS and TS with default generic type parameter
@sandersn y travaille déjà.
Depuis le 8/7/2020.
- Langage dominant
- Go
- Étoiles
- 111k
- Forks
- 14.3k
- Merge moyen
- 2 j 4 h
- PR mergées (30 j)
- 132
Description
TypeScript Version: 4.0.0-dev.20200703, 3.9.2 (playground)
Search Terms: js ts overload difference, javascript different overload, javascript wrong overload, javascript overload generic empty object
Code
definition.d.ts
export class EmptyObjectOverloads<T = {}> {
constructor(a: Readonly<T>);
/** @deprecated */
constructor(a: T, b?: any);
}
export class RecordOverloads<T = Record<string, any>> {
constructor(a: Readonly<T>);
/** @deprecated */
constructor(a: T, b?: any);
}
ts-example.ts
import { EmptyObjectOverloads, RecordOverloads } from './declaration';
class TSExampleEmpty extends EmptyObjectOverloads {
constructor(a: any) {
// hover over super: constructor EmptyObjectOverloads<{}>(a: Readonly<{}>): EmptyObjectOverloads<{}> (+1 overload)
super(a);
}
}
class TSExampleRecord extends RecordOverloads {
constructor(a: any) {
// hover over super: constructor RecordOverloads<Record<string, any>>(a: Readonly<Record<string, any>>): RecordOverloads<Record<string, any>> (+1 overload)
super(a);
}
}
js-example.js
class JSExampleEmpty extends EmptyObjectOverloads {
/** @param {*} a */
constructor(a) {
// hover over super: constructor EmptyObjectOverloads<any>(a: any, b?: any): EmptyObjectOverloads<any> (+1 overload)
super(a); // deprecation warning '(a: any, b?: any): EmptyObjectOverloads<any>' is deprecated ts(6385)
}
}
class JSExampleRecord extends RecordOverloads {
/** @param {*} a */
constructor(a) {
// hover over super: constructor RecordOverloads<Record<string, any>>(a: Readonly<Record<string, any>>): RecordOverloads<Record<string, any>> (+1 overload)
super(a);
}
}
Expected behavior:
Both TSExampleEmpty and JSExampleEmpty pick same overload similar to TSExampleRecord and JSExampleRecord.
Actual behavior:
TSExampleEmpty uses default generic value {} and picks first overload.
For JSExampleEmpty generic value to is any and second (deprecated) overload picked, while JSExampleRecord works as expected.
In real world examples this behavior marks all super(props); in React class components in JS files as deprecated.
Of course it's impossible to report TS issue without mentioning React 😆 related constructor declaration
Playground Link:
Example TS Example JS
Related Issues: Haven't found any
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Évaluation
Cette issue n'a pas encore été évaluée.