Я пытаюсь найти лучший подход для сужения возвращаемого типа фабрики, не передавая сам класс.Ниже приведен пример использования условных типов, который является лучшим подходом, который я нашел до сих пор.Есть ли более чистый способ сузить тип возвращаемого значения?
Настройка
class Lion {
run() {
// Do something
}
}
class Fish {
swim() {
// Do something
}
}
class Snake {
slither() {
// Do something
}
}
enum AnimalType {
LION = 'lion',
FISH = 'fish',
SNAKE = 'snake',
}
В этом примере возвращается тип объединения, который мне не нужен
class AnimalFactory {
public static create(type: AnimalType) {
switch (type) {
case AnimalType.LION:
return new Lion();
case AnimalType.FISH:
return new Fish();
case AnimalType.SNAKE:
return new Snake();
default:
throw new Error('Invalid Type');
}
}
}
const fish = AnimalFactory.create(AnimalType.FISH); // Type: Lion | Fish | Snake :(
В этом примере возвращается правильный тип, но, похоже, много накладных расходов
type Animal<T> = T extends AnimalType.LION
? Lion
: T extends AnimalType.FISH
? Fish
: T extends AnimalType.SNAKE
? Snake
: unknown;
class AnimalFactory {
public static create<T extends AnimalType>(type: T): Animal<T> {
switch (type) {
case AnimalType.LION:
return new Lion() as Animal<T>;
case AnimalType.FISH:
return new Fish() as Animal<T>;
case AnimalType.SNAKE:
return new Snake() as Animal<T>;
default:
throw new Error('Invalid Type');
}
}
}
const fish = AnimalFactory.create(AnimalType.FISH); // Type: Fish :)
Есть ли более чистый способ сузить возврат к заводским значениямвведите только аргумент AnimalType
?