图形化编程 - Typescript 运行时类型检查
我正在尝试使用 TypeScript 构建一个图形化编程编辑器,类似于 Max、Grasshopper 或 Antimony。
基本的想法是,一个模块表示一个函数,输入在左边,输出在右边,你可以用边将输入和输出连接在一起。
我现在面临的挑战是,我想要对一个块有一个类型安全的静态定义,同时能够在运行时进行类型自省,以防止用户连接类型不匹配的输入和输出。
最简单的起点就是把一个块定义为一个函数。例如:
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
}
}
但是,我已经不太满意自己没能将输入和输出类型与 evaluate 定义连接起来。
我认为几乎能解决我问题的方法是,如果有某种方式可以在运行时自省一个函数的类型定义,即使只是像检查一个类的 instanceof 那样简单。
我希望这一切都能讲清楚——如果有任何需要我解释的地方,请告诉我。