My application makes use of factory helpers for provisioning various objects. Each factory implements an interface, which allows it to be mocked to aid testing. Traditionally, each factory would be a class that implements the interface:
interface IRequestFactory {
create(event: AWSLambda.APIGatewayProxyEvent): IRequest
}
class RealRequestFactory implements IRequestFactory {
public create(event: AWSLambda.APIGatewayProxyEvent): RealRequest {
return new RealRequest(event)
}
}
class MockRequestFactory implements IRequestFactory {
public create(event: AWSLambda.APIGatewayProxyEvent): MockRequest {
return new MockRequest(event)
}
}
RealRequestFactory
, or MockRequestFactory
can be instantiated and injected into other classes as a dependency. TypeScript however, allows us to declare anything as the interface type, so this can be done:
const realRequestFactory: IRequestFactory = {
create(event: AWSLambda.APIGatewayProxyEvent): Request {
return new Request(event)
}
}
In this case, I don't need to instantiate a class, and can still inject realRequestFactory
as a dependency of type IRequestFactory
. This approach seems simpler, but I'm not sure it would be considered best practice because it feels a bit like a singleton.
Is there a consensus for typing non-classes against interfaces?