Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/YePpHa/ts-di-transformer
A proof-of-concept of using interfaces with a dependency injection system with custom transformers
https://github.com/YePpHa/ts-di-transformer
custom dependency injection interface javascript symbol transformer typescript
Last synced: about 2 months ago
JSON representation
A proof-of-concept of using interfaces with a dependency injection system with custom transformers
- Host: GitHub
- URL: https://github.com/YePpHa/ts-di-transformer
- Owner: YePpHa
- Created: 2019-01-04T09:25:07.000Z (over 5 years ago)
- Default Branch: master
- Last Pushed: 2023-01-07T05:44:39.000Z (over 1 year ago)
- Last Synced: 2024-07-08T22:02:20.128Z (2 months ago)
- Topics: custom, dependency, injection, interface, javascript, symbol, transformer, typescript
- Language: TypeScript
- Homepage:
- Size: 596 KB
- Stars: 12
- Watchers: 1
- Forks: 0
- Open Issues: 14
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Dependency Injection with Interfaces for TypeScript
[![](https://img.shields.io/npm/v/ts-di-transformer.svg?style=flat)](https://npmjs.com/package/ts-di-transformer)This is a proof-of-concept of using interfaces with dependency injection. The
only requirement for this to work is using a custom transformer.All the neccessary information is resolved on compile-time. The runtime part get
fed the needed information through `.bind()` and `.resolve()`.__Disclaimer: This has only been tested on TypeScript v3.2.2. Any other version
may break this.__## How does it work?
The interfaces are converted into symbols when calling `InterfaceSymbol()`
(replace `T` with the interface). The symbol that's returned will always be the
same for each interface.As this example is not using `reflect-metadata` it's also resolving the
parameters of the constructor. It will automatically append an extra parameter
to both `.bind()` and `.resolve()` with an array of the parameters.See https://github.com/YePpHa/ts-di-transformer-example for a proper example of
how to use it.### Before custom transformer
```TypeScript
interface IBird {
canFly(): boolean;
}class Crow implements IBird {
public canFly() {
return true;
}
}class App {
constructor(bird: IBird) {
if (bird.canFly()) {
console.log("Bird can fly");
} else {
console.log("Bird can't fly");
}
}
}const container = new Container();
container.bind(InterfaceSymbol(), Crow);container.resolve(App);
```### After custom transformer
```TypeScript
interface IBird {
canFly(): boolean;
}class Crow implements IBird {
public canFly() {
return true;
}
}class App {
constructor(bird: IBird) {
if (bird.canFly()) {
console.log("Bird can fly");
} else {
console.log("Bird can't fly");
}
}
}const container = new Container();
container.bind(Symbol.for("2ef34e55ca621e95ab608501c23d72201fb80158c44cbfe6d3d509d8d2a418d8"), Crow, []);container.resolve(App, [Symbol.for("2ef34e55ca621e95ab608501c23d72201fb80158c44cbfe6d3d509d8d2a418d8")]);
```