microsoft / microsoft/TypeScript

Type Merging between extends and intersection

Ouverte
#8,606 5 commentaires 2 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Effort: Moderate Help Wanted Suggestion
Langage dominant
Go
Étoiles
111k
Forks
14.4k
Merge moyen
1 j 19 h
PR mergées (30 j)
117

Description

TypeScript Version:

1.8.10

Code

interface Foo {
    on(type: 'foo', listener: (event: MouseEvent) => boolean): boolean;
    on(type: string, listener: (event: Event) => boolean): boolean;
}

interface Bar {
    on(type: 'bar', listener: (event: MSGestureEvent) => boolean): boolean;
    on(type: string, listener: (event: Event) => boolean): boolean;
}

interface FooBarA extends Foo, Bar {} // Error: not correctly extended

interface FooBarB extends Foo, Bar {
    on(type: 'foo', listener: (event: MouseEvent) => boolean): boolean;
    on(type: 'bar', listener: (event: MSGestureEvent) => boolean): boolean;
    on(type: string, listener: (event: Event) => boolean): boolean;
}

type FooBarC = Foo & Bar;

let foobar: FooBarC;

foobar.on('foo', (event) => { return false; });

Expected behavior:

That FooBarA would work instead of throwing an error.

Actual behavior:

FooBarA complains Interface 'FooBarA' cannot simultaneously extend types 'Foo' and 'Bar'. Named property 'on' of types 'Foo' and 'Bar' are not identical.

While that is true in the strictest sense, the "base" override matches, which means in theory the string literal types could be merged and the error should only occur if there is a conflict between a specific string literal type.

Using the intersection type works perfectly fine and the resulting type mirrors the runtime behaviour. Using the "reimplement all methods" (FooBarB) gets really tedious really quickly when you are trying to do something like model event listeners like the above.

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 la reproduction TypeScript 1.8.10 dans l’issue et comparez la manière dont FooBarA étend Foo et Bar avec l’intersection équivalente Foo & Bar. C’est terminé lorsque les surcharges compatibles sont fusionnées pour FooBarA, tandis que les surcharges spécifiques de littéraux de chaîne qui sont réellement en conflit produisent toujours une erreur.

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

Évaluation

Stack technique
typescript
Domaine
compilers
Type d'issue
Fonctionnalité
Difficulté
5/5
Temps estimé
Plus d'une semaine
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
25/100

Recevez les nouvelles issues par e-mail

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