Проверка типов во время выполнения Typescript
Я пытаюсь создать графический редактор, похожий на Max, Grasshopper или Antimony, используя TypeScript.
Основная идея состоит в том, что блок представляет функцию с входами слева и выходами справа, и вы можете соединять входы и выходы вместе с ребрами.
Проблема, с которой я сейчас сталкиваюсь, заключается в том, что я хочу иметь безопасное для типов статическое определение блока вместе с некоторым самоанализом типов во время выполнения, чтобы пользователь не мог соединять входы и выходы с типами, которые не совпадают.
Самое простое место для начала - это просто определить блок как функцию. Например:
function AdditionBlock(x: number, y: number): number {
return x + y
}
Тем не менее, есть некоторые проблемы с этим подходом.
- Как сгенерировать метки для каждого ввода / вывода в блоке?
- Как я могу проверить во время выполнения, что пользователь присоединяет правильный тип к одному из входов этого блока?
Я попытался немного усовершенствовать этот подход, но мне не удалось его осуществить:
Я создал свои собственные псевдонимы для внутренней системы типов, чтобы я мог использовать 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
класс.
Я надеюсь, что все имеет смысл - пожалуйста, дайте мне знать, если я должен что-то уточнить.