microsoft / microsoft/TypeScript
Difference in overload pick between JS and TS with default generic type parameter
@sandersn arbeitet bereits daran.
Seit 08.7.2020.
- Vorherrschende Sprache
- Go
- Sterne
- 111k
- Forks
- 14.3k
- Ø Merge
- 2 T. 4 Std.
- Gemergte PRs (30 T.)
- 132
Beschreibung
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
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Bewertung
Dieses Issue wurde noch nicht bewertet.