Возвращайте типизированные классы, созданные на заводе

#typescript

Вопрос:

Я пытаюсь создать сопоставленные типы для возврата производных классов, если они найдены (если не просто возвращают значение по умолчанию), я сделал это:

 type MaybeDerivedAnimal<T extends string> = T extends keyof AllAnimals ? AllAnimals[T] : IAnimal;

type AllAnimals = {
    Dog: IDog;
    Cat: ICat; 
    // ...
};
 

Таким образом, я мог бы получить класс в такой функции, как эта:

 const someAnimals = new Map<string, MaybeDerivedAnimal<any>>();

getAnimal<T extends string>(name: T): MaybeDerivedAnimal<T> | undefined {
    return someAnimals.get(name)
}

dog = getAnimal("Dog");

dog.dogExclusiveFunction(); // <-- got typings for derived function
dog.generalAnimalFunction(); // <-- also for inherited function
 

Это сработало, но вот мой вопрос, хороший ли это способ сделать это?
кстати, мне помогла эта статья.