TypeScript type breakage under pnpm / preserveSymlinks=true due to extending Emitter from another package

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

Les mainteneurs répondent en général sous 2 jours

Personne n'a encore pris cette issue.

Évaluation

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

Piste de recherche

Commencez par l’exemple de socket.io-client/index.ts et la déclaration de Socket, puis suivez la manière dont @socket.io/component-emitter est importé avec preserveSymlinks=true. Reproduisez le problème dans une configuration pnpm, npm link ou monorepo et comparez les approches proposées pour l’identité des types. C’est terminé lorsque Socket conserve ses types on et emit lorsqu’il est lié par un symlink.

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

Description

needs investigation

Is your feature request related to a problem? Please describe.

When using socket.io-client in a symlinked setup (such as pnpm + preserveSymlinks=true or local linking via npm link), TypeScript loses several instance methods (on, emit, etc.) on the Socket class.

This happens because Socket extends the Emitter class from the @socket.io/component-emitter package:

import { Emitter } from "@socket.io/component-emitter";

export class Socket extends Emitter { ... }

Under preserveSymlinks=true, there can be multiple physical copies of @socket.io/component-emitter, resulting in distinct module identities for TypeScript.
As a result, Socket no longer appears to implement the correct emitter API.

This affects:

  • pnpm users (the default node_modules structure is symlink-based)
  • anyone linking socket.io-client locally (e.g. pnpm link, npm link, or monorepo setups)

Describe the solution you'd like

One of the following would make the types robust against symlinked environments:

  • Re-export the emitter types from socket.io-client to unify identity.
  • Use composition instead of inheritance for emitter behavior.
  • Define an internal interface for the emitter API instead of importing the external class.

Example of a minimal re-export solution:

// socket.io-client/index.ts
import { Emitter } from "@socket.io/component-emitter";
export { Emitter }; // re-export canonical symbol

export class Socket extends Emitter { ... }
Langage dominant
TypeScript
Étoiles
63.2k
Forks
10.2k
Merge moyen
1 j 23 h
PR mergées (30 j)
4

Préparer son environnement

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.

Autres issues de socketio/socket.io

Toutes les issues de socketio/socket.io

Issues similaires

Plus d'issues TypeScript

Recevez les nouvelles issues par e-mail

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