Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Class is loaded twice on different pathes #231

Open
cluxig opened this issue Dec 14, 2022 · 4 comments
Open

Class is loaded twice on different pathes #231

cluxig opened this issue Dec 14, 2022 · 4 comments

Comments

@cluxig
Copy link

cluxig commented Dec 14, 2022

Imagine you have a class X:

import { SimpleService } from '@/services/simple-service.ts';
import { injectable } from 'tsyringe';

@injectable()
export class X {
    constructor(s: SimpleService) {}
}

and a class Y:

import { SimpleService } from '../services/simple-service.ts';
import { injectable } from 'tsyringe';

@injectable()
export class Y {
    constructor(s: SimpleService) {}
}
import { singleton } from 'tsyringe';

@singleton()
export class SimpleService {
    constructor() {}
}

tsconfig.json

{
 ...
 "paths": { "@/*": [ "src/*" ] }
}

Than X and Y load their own class SimpleService. This is problematic, if you use dependency injection, i.e. with tsyringe (@singleton()), or other Constructor-related Type token things, because now the Type class SimpleService just exists two times at runtime. I think it's not related to tsyringe, because the registration-key is just the class-Type. Other frameworks will fail similarly.

If you either always use the relative imports or always the absolute imports, just one loaded class exists at runtime.

Hence tsconfig-paths is probably doing something wrong. Both imports must lead to same loaded class at runtime.

@nemmtor
Copy link

nemmtor commented Dec 18, 2022

I have same issue. I am using absolute import in one place and relative import in another place for class and instanceof is failing because of that:

// httpError.ts
export class HttpError extends Error {...};

// foo.ts
import { HttpError } from '@errors'; // absolute import

export const foo = () => {
  throw new HttpError(...);
}

// index.ts
import { HttpError } from './errors'; // relative import

try {
  foo();
} catch(error){
  console.log(error instanceof HttpError); // false
}

@nemmtor
Copy link

nemmtor commented Dec 18, 2022

Probably duplicate of this one

@overshom
Copy link

Confirm, that is a critical issue for library. Cannot rely on instances anymore.

Having non-unique singleton is critical.

@overshom
Copy link

This solution helped me to fix my app for tsconfig-paths issue nestjs/nest#986 (comment)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants