This article walks through building a fully functional dependency injection system in TypeScript โ no decorators, no reflect-metadata, no NestJS, no InversifyJS. Just the language itself. By the end, you'll understand DI deeply enough that reaching for a framework becomes a conscious choice, not a default.
You've seen the decorators. You've wrestled with reflect-metadata. What if you didn't need any of it?