断言一个类的成员类型与预定义的成员匹配

时间:2019-06-04 17:27:49

标签: angular typescript

使用OnPush变更检测策略进行单元测试组件时,调用fixture.detectChanges()仅在第一次时有效。

According to this comment on GitHub,如果组件在构造函数中将fixture.componentInstance.cdRef.markForCheck();作为cdRef注入,则可以通过调用ChangeDetectorRef来进行修复。

它奏效了,但是由于我已经几次遇到这个问题,所以我想创建一个小助手来进行标准化,并使发生的事情更加明显。

interface IChangeDetectable {
  [key: string]: ChangeDetectorRef;
}

export const forceChangeDetection =
  <T extends IChangeDetectable>(fixture: ComponentFixture<T>) => {
  const changeDetector = Object.values(fixture.componentInstance)
    .find((method) => method['detectChanges'] != null);
  if (changeDetector == null) {
    throw new Error('component must include change detection method');
  }
  changeDetector.detectChanges();
};

这有点令人费解,因为我们有数十个组件,并且持有ChangeDetectorRef实例的成员没有标准名称。强类型输入确实非常重要,因为我宁愿打字稿捕获丢失的ChangeDetectorRef,而不是等待测试失败。

但是,如果我用forceChangeDetection(fixture)来调用,其中fixtureComponentFixture<TestComponent>打字稿抱怨TestComponent中缺少索引签名,因为实现了IChangeDetectable不等于让至少一个成员实现ChangeDetectorRef

我可以用打字稿吗?确保有一个值与给定类型匹配的成员?

0 个答案:

没有答案