microsoft / microsoft/TypeScript
Difference in overload pick between JS and TS with default generic type parameter
@sandersn ya está trabajando en esto.
Desde el 8/7/2020.
- Lenguaje dominante
- Go
- Estrellas
- 111k
- Forks
- 14.3k
- Merge medio
- 2 d 4 h
- PR fusionados (30 d)
- 132
Descripción
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
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Evaluación
Este issue todavía no se ha evaluado.