我正在尝试使用 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
}
}
但是,我已经很不高兴我无法将输入和输出类型与评估定义联系起来。
我认为几乎可以解决我的问题的是,是否有某种方法可以在运行时内省函数的类型定义,即使它就像检查instanceof
a 类一样简单。
我希望一切都说得通——如果我需要澄清任何事情,请告诉我。