Come on, that's a laughable content.
A much better way to do it would be to create a factory registry, let each plane type register itself to it (using dependency injection) and have the factory just call the proper builder (and yes - crush and burn when an unknown plane type is passed) when getPlaneInstance() is called.
This kind of code and posts make me angry.
Its a bad example of a bad pattern, done by a sloppy and inexperienced engineer. The 'O' in SOLID is for 'open for extensions, close for modifications' - I guess that proudly showing off code that completely breaks it is a source of pride.
PlaneFactory.getInstance<Plane>('BoeingPlane')
Doesn't that defeat the point of both TypeScript and the factory pattern?
If error occurs then it should scream instead of silenting wrong stuff with empty behaviour objects
Consider using Result monad as a result of factory which will communicate if creation was successful and it will return either error or correct object
Basically return either
(success: false, null)
Or
(success: true, goodPlane)
You can also add diagnostic/message