When you write a class name directly in the providers array, NestJS expands it to the full useClass form where the class is used as both the token and the implementation. This works because TypeScript emits metadata for class types so the container knows how to instantiate it.
Shorthand works only when the class itself is the token — the most common case.
Use full form when providing an interface token, string token, or swapping implementation.
Use full form when using useValue, useFactory, or useExisting.
Shorthand is just syntactic sugar — both forms produce identical DI behavior.