Композиция с "Dynami c" и круглым типом - PullRequest
0 голосов
/ 19 апреля 2020

Я сталкиваюсь с проблемой круговой типизации при составлении, например, модели 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...