microsoft / microsoft/TypeScript

Difference in overload pick between JS and TS with default generic type parameter

Abierto
#39,509 1 comentario 1 reacción 1 asignado Ver en GitHub

@sandersn ya está trabajando en esto.

Desde el 8/7/2020.

Needs Investigation
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

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.