LiteGraph.js与TypeScript接口继承:类型扩展
在使用LiteGraph.js进行节点图开发时,TypeScript接口继承是扩展节点功能的关键技术。本文将详细介绍如何通过接口继承实现类型扩展,解决节点复用与功能扩展的核心痛点。
接口继承基础
LiteGraph.js的TypeScript类型定义位于src/litegraph.d.ts,提供了完整的节点和图结构类型描述。接口继承允许创建新接口扩展现有类型,实现功能复用和扩展。
基础继承示例
// 扩展INodeSlot接口添加自定义属性
interface ICustomNodeSlot extends INodeSlot {
tooltip?: string; // 新增 tooltip 属性
validation?: (value: any) => boolean; // 新增验证函数
}
上述代码通过继承INodeSlot接口,添加了tooltip和validation属性,使节点插槽支持提示文本和输入验证。
类继承与接口实现
LiteGraph.js核心类如LGraphNode提供了节点基础功能,通过类继承和接口实现可创建复杂节点类型。
自定义节点实现
class ValidatedNode extends LGraphNode implements ICustomNodeSlot {
name: string;
type: string | -1;
tooltip?: string;
constructor(title?: string) {
super(title);
this.name = "validated_node";
this.type = "custom";
this.tooltip = "带输入验证的自定义节点";
}
// 实现验证逻辑
validation(value: any): boolean {
return typeof value === "number" && value > 0;
}
// 重写输入数据获取方法
getInputData<T = any>(slot: number, force_update?: boolean): T {
const data = super.getInputData<T>(slot, force_update);
if (!this.validation(data)) {
throw new Error(`输入数据验证失败: ${data}`);
}
return data;
}
}
// 注册自定义节点
LiteGraph.registerNodeType("custom/validated", ValidatedNode);
该示例创建了带输入验证功能的自定义节点,通过继承LGraphNode并实现ICustomNodeSlot接口,既保留了基础功能,又添加了自定义验证逻辑。
类型扩展最佳实践
接口组合模式
通过组合多个接口,创建功能丰富的复合类型:
// 组合多个接口
interface IAdvancedNode extends ICustomNodeSlot, IWidget {
// 组合接口自动包含所有属性
}
// 实现复合接口
class AdvancedNode extends LGraphNode implements IAdvancedNode {
// 实现所有接口的属性和方法
name: string;
type: string | -1;
value: any;
callback?: WidgetCallback;
// ...实现细节
}
类型扩展注意事项
- 保持接口纯洁性:接口只定义契约,不包含实现
- 使用声明合并:扩展现有接口而不修改原始定义
- 类型兼容性:确保扩展类型与原始类型兼容
// 使用声明合并扩展现有接口
declare module "./litegraph" {
interface INodeSlot {
// 添加新属性而不修改原始定义
required?: boolean;
}
}
实际应用场景
节点类型层次结构
LiteGraph.js节点系统支持复杂的类型层次结构,通过接口继承可构建分类明确的节点库:
// 基础数学节点接口
interface IMathNode {
operation: string;
calculate(a: number, b: number): number;
}
// 加法节点实现
class AddNode extends LGraphNode implements IMathNode {
operation: string = "add";
calculate(a: number, b: number): number {
return a + b;
}
onExecute() {
const a = this.getInputData<number>(0);
const b = this.getInputData<number>(1);
this.setOutputData(0, this.calculate(a, b));
}
}
// 乘法节点实现
class MultiplyNode extends AddNode {
operation: string = "multiply";
calculate(a: number, b: number): number {
return a * b;
}
}
可视化节点关系
继承关系可通过mermaid图表直观展示:
总结与扩展
通过TypeScript接口继承,我们可以:
- 扩展现有接口添加新功能
- 实现自定义节点类型层次结构
- 确保类型安全和代码可维护性
建议在实际项目中采用"基础接口+功能接口"的组合模式,通过声明合并扩展现有类型,避免修改原始定义。更多类型扩展技巧可参考官方文档中的"高级类型"章节。
下一篇将介绍"TypeScript泛型在节点图中的应用",探讨如何使用泛型创建类型安全的节点通信机制。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



