https://javascript.plainenglish.io/practical-solid-in-typescript-liskov-substitution-principle-8e38c773679e