LiteGraph.js与TypeScript接口继承:类型扩展

LiteGraph.js与TypeScript接口继承:类型扩展

【免费下载链接】litegraph.js A graph node engine and editor written in Javascript similar to PD or UDK Blueprints, comes with its own editor in HTML5 Canvas2D. The engine can run client side or server side using Node. It allows to export graphs as JSONs to be included in applications independently. 【免费下载链接】litegraph.js 项目地址: https://gitcode.com/gh_mirrors/li/litegraph.js

在使用LiteGraph.js进行节点图开发时,TypeScript接口继承是扩展节点功能的关键技术。本文将详细介绍如何通过接口继承实现类型扩展,解决节点复用与功能扩展的核心痛点。

接口继承基础

LiteGraph.js的TypeScript类型定义位于src/litegraph.d.ts,提供了完整的节点和图结构类型描述。接口继承允许创建新接口扩展现有类型,实现功能复用和扩展。

基础继承示例

// 扩展INodeSlot接口添加自定义属性
interface ICustomNodeSlot extends INodeSlot {
  tooltip?: string; // 新增 tooltip 属性
  validation?: (value: any) => boolean; // 新增验证函数
}

上述代码通过继承INodeSlot接口,添加了tooltipvalidation属性,使节点插槽支持提示文本和输入验证。

类继承与接口实现

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;
  
  // ...实现细节
}

类型扩展注意事项

  1. 保持接口纯洁性:接口只定义契约,不包含实现
  2. 使用声明合并:扩展现有接口而不修改原始定义
  3. 类型兼容性:确保扩展类型与原始类型兼容
// 使用声明合并扩展现有接口
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图表直观展示:

mermaid

总结与扩展

通过TypeScript接口继承,我们可以:

  1. 扩展现有接口添加新功能
  2. 实现自定义节点类型层次结构
  3. 确保类型安全和代码可维护性

建议在实际项目中采用"基础接口+功能接口"的组合模式,通过声明合并扩展现有类型,避免修改原始定义。更多类型扩展技巧可参考官方文档中的"高级类型"章节。

下一篇将介绍"TypeScript泛型在节点图中的应用",探讨如何使用泛型创建类型安全的节点通信机制。

【免费下载链接】litegraph.js A graph node engine and editor written in Javascript similar to PD or UDK Blueprints, comes with its own editor in HTML5 Canvas2D. The engine can run client side or server side using Node. It allows to export graphs as JSONs to be included in applications independently. 【免费下载链接】litegraph.js 项目地址: https://gitcode.com/gh_mirrors/li/litegraph.js

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值