microsoft / microsoft/TypeScript

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

Ouverte
#39,509 1 commentaire 1 réaction 1 personne assignée Voir sur GitHub

@sandersn y travaille déjà.

Depuis le 8/7/2020.

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

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Évaluation

Cette issue n'a pas encore été évaluée.

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.