Skip to content

Aliases

Problem

Implement aliases in a production-friendly way with @vielzeug/wireit while keeping setup and cleanup explicit.

Runnable Example

The snippet below is copy-paste runnable in a TypeScript project with @vielzeug/wireit installed.

Interface to implementation

ts
const ILoggerToken = createToken<ILogger>('ILogger');
const ConsoleLoggerToken = createToken<ConsoleLogger>('ConsoleLogger');

container.bind(ConsoleLoggerToken, ConsoleLogger);
container.alias(ILoggerToken, ConsoleLoggerToken);

// Both resolve to the same ConsoleLogger instance
const logger = container.get(ILoggerToken);

Swapping implementations

ts
if (process.env.NODE_ENV === 'production') {
  container.bind(LoggerToken, CloudLogger, { deps: [ConfigToken] });
} else {
  container.bind(LoggerToken, ConsoleLogger);
}

container.alias(ILoggerToken, LoggerToken);

Alias chains

ts
container.value(BaseConfigToken, { timeout: 5000 });
container.alias(AppConfigToken, BaseConfigToken);
container.alias(ServiceConfigToken, AppConfigToken);

// All three resolve to { timeout: 5000 }
container.get(ServiceConfigToken);

Expected Output

  • The example runs without type errors in a standard TypeScript setup.
  • The main flow produces the behavior described in the recipe title.

Common Pitfalls

  • Forgetting cleanup/dispose calls can leak listeners or stale state.
  • Skipping explicit typing can hide integration issues until runtime.
  • Not handling error branches makes examples harder to adapt safely.