0

嗨团队我有一个非常小的问题,我有这个代码:

constructor(private mapper: any, private applyCallback: (arg0: INode) => void) {
super()

  /** @type {GanttMapper} */
  this.mapper = new GanttMapper(datamodel);
/** @type {function(INode):void} */
  this.applyCallback = applyCallback;

// create the dummy node
  this.dummyNode = new SimpleNode();
  // switch off the default template
  //type RouterClass = typeof ;
  //interface RouterDerived extends RouterClass { }
  console.log("routerClass");
  this.template = new IVisualTemplate({
      createVisual() {
          return null;
      },
      updateVisual() {
          return null;
      }
 });}

但在部分:

this.template = new IVisualTemplate({
      createVisual() {
          return null;
      },
      updateVisual() {
          return null;
      }
  });

我有一个错误,错误是这样的:无法 在 JS 中创建抽象类的实例此代码工作正常,但我试图以角度迁移它并且不工作。

我阅读了相同问题的另一部分,但我无法解决它......我尝试了所有重播技巧,但没有奏效。谢谢大家。

4

3 回答 3

2

这是因为 Angular(或者更确切地说是 TypeScript)比 JavaScript 更严格。在不削弱类型检查的情况下,您可以在 JavaScript 中做一些无法在 TypeScript 定义文件中正确表达的事情。这是其中之一。它可以在运行时工作,但是 TypeScript 编译器不理解这个特性,并且会警告你不要使用那个无法识别的结构。

这是yFiles类库独有的功能,称为快速接口实现

文档还指出:

TypeScript 中的快速接口实现
TypeScript .d.ts 文件不包含允许快速接口实现的类型。它们在运行时仍然有效,但 TypeScript 编译器仍然会产生错误。要解决此问题,您可以告诉编译器忽略违规行,或使用接口的匿名实现:

// @ts-ignore
const customHitTestable = new IHitTestable((context, location) => location.x > 25)

const customVisualCreator = new class extends BaseClass<IVisualCreator>(IVisualCreator) {
  createVisual(context: IRenderContext): Visual {
    return new SvgVisual(document.createElementNS("http://www.w3.org/2000/svg", "g"))
  }
  updateVisual(context: IRenderContext, oldVisual: Visual): Visual {
    return oldVisual
  }
}

在较新版本的 yFiles for HTML(自 2.3 起)中,现在有一个方便的简写,可以很好地与 typescript 配合使用:

const customHitTestable = IHitTestable.create((context, location) => location.x > 25)

这并不需要ts-ignoreand 适用于所有接口:如果接口中只有一个方法,您只需将其实现传递给.create接口对象上的方法即可。如果有更多成员,则需要通过带有成员名称的选项对象传入。现在,打字稿定义文件为这个用例提供了完整的完成。

于 2019-11-27T13:32:34.107 回答
0
{
  createVisual() {
    return null;
  },
  updateVisual() {
    return null;
  }
}

这不是有效的 JavaScript,请尝试

{
  createVisual: () => {
    return null;
  },
  updateVisual: () => {
    return null;
  }
}
于 2019-11-27T10:33:32.513 回答
0

这是 IVisualTempleate 的代码

这是 IVisualTempleate 的代码

于 2019-11-27T11:49:25.587 回答