Я сталкиваюсь с проблемой круговой типизации при составлении, например, модели Steak
из произвольной карты «методов». Мое намерение для типа SteakModel
состоит в том, чтобы использовать его для ввода контекстного аргумента self
для каждого из дочерних методов модели, чтобы любой данный метод мог использовать другие методы. Кроме того, я хотел бы определить SteakModel
динамически, чтобы избежать необходимости обновлять две строки кода при каждом добавлении нового метода в модель.
Мой подход ниже приводит к ошибке компилятора: Type alias 'SteakModel' circularly references itself.(2456)
. Мне не удалось придумать приемлемое решение для ошибки без:
- (a) ручного определения типа
SteakModel
(то есть добавления записи в интерфейс всякий раз, когда я добавляю метод); - или (b) возвращение к определению класса (что вполне разумно, но не удовлетворяет мое любопытство!).
Я упускаю какие-либо другие очевидные решения?
type SteakModel = ReturnType<typeof Steak>
interface SteakConstructorArgs {
doneness: "Rare" | "Medium Rare" | "Overcooked :)"
}
const Steak = (args: SteakConstructorArgs) => {
const self = {
...args
}
return Object.assign(self, {
cook: CookSteak(self)
})
}
const CookSteak = (self: SteakModel) => () => {
switch(self.doneness){
case "Rare":
self.doneness = "Medium Rare"
break
case "Medium Rare":
self.doneness = "Overcooked :)"
break
}
return self
}
const dinner = Steak({doneness:"Rare"}).cook() // dinner = { "doneness": "Medium Rare" }
Playground Link