Проверка типов во время выполнения Typescript

Я пытаюсь создать графический редактор, похожий на Max, Grasshopper или Antimony, используя TypeScript.

Основная идея состоит в том, что блок представляет функцию с входами слева и выходами справа, и вы можете соединять входы и выходы вместе с ребрами.

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что я хочу иметь безопасное для типов статическое определение блока вместе с некоторым самоанализом типов во время выполнения, чтобы пользователь не мог соединять входы и выходы с типами, которые не совпадают.

Самое простое место для начала - это просто определить блок как функцию. Например:

function AdditionBlock(x: number, y: number): number {
    return x + y
}

Тем не менее, есть некоторые проблемы с этим подходом.

  1. Как сгенерировать метки для каждого ввода / вывода в блоке?
  2. Как я могу проверить во время выполнения, что пользователь присоединяет правильный тип к одному из входов этого блока?

Я попытался немного усовершенствовать этот подход, но мне не удалось его осуществить:

Я создал свои собственные псевдонимы для внутренней системы типов, чтобы я мог использовать instanceof во время выполнения.

class IntrinsicType<ActualType> {}
const NumberType = new IntrinsicType<number>()
const StringType = new IntrinsicType<string>()

Затем я создал класс со статическими свойствами, определяющими входы, выходы и функцию оценки:

class AdditionBlock {
    static inputs: [
        { name: "x"; type: NumberType },
        { name: "y"; type: NumberType }
    ]
    static outputs: [{ name: "sum"; type: NumberType }]
    static evaluate(x: number, y: number): number {
        return x + y
    }
}

Но я уже не очень доволен тем, что не смог соединить типы ввода и вывода с определением оценки.

Я думаю, что это в значительной степени решило бы мою проблему, если бы был какой-то способ проанализировать определение типа функции во время выполнения, даже если бы это было так просто, как проверка на наличие instanceof класс.

Я надеюсь, что все имеет смысл - пожалуйста, дайте мне знать, если я должен что-то уточнить.

0 ответов

Другие вопросы по тегам