microsoft / microsoft/TypeScript

Polymorphic `this` breaks when a module exports a variable and interface with the same name

Ouverte
#19,397 1 commentaire 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Bug Domain: This-Typing
Langage dominant
Go
Étoiles
111k
Forks
14.4k
Merge moyen
1 j 19 h
PR mergées (30 j)
117

Description

Importing a variable that has a corresponding interface of the same name from a module causes unexpected behavior.

In the screenshot below, the function, doSomething, should return the type Model<number> due to polymorphic this; however, it returns Model<T>, which is unusable.

screen shot 2017-10-20 at 11 02 03 pm

Here is an easy way to reproduce this behavior:

  1. npm install -g @types/sequelize sequelize
  2. Replace node_modules/@types/sequelize/index.d.ts with the following
declare namespace sequelize {
    interface Model<T>  {
        doSomething(arg: T): this;
    }
}

declare var sequelize: { Model: sequelize.Model<any> };

export = sequelize;
  1. create a file with the following contents:
import { Model } from 'sequelize';

let a: Model<number> = null as any;


a.doSomething(5).doSomething();

Workaround:
Use import * as ... syntax and the names will resolve correctly.

screen shot 2017-10-20 at 11 22 28 pm

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.

Piste de recherche

Commencez par reproduire le problème avec la déclaration sequelize fournie et en important Model avec la syntaxe d’importation nommée. Suivez la manière dont le compilateur résout la variable exportée et l’interface portant le même nom lors de la vérification de this polymorphe. Le travail est terminé lorsque l’exemple infère Model et autorise l’appel chaîné sans nécessiter la solution de contournement par importation de namespace.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
typescript
Domaine
compilers
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
35/100

Recevez les nouvelles issues par e-mail

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