如何确定对象是否是ViewRef?

时间:2018-05-08 15:40:28

标签: javascript angular

我有一个课程,我在我的应用程序中的多个地方使用。

import { TemplateRef } from '@angular/core';

export class ObjectPropertyDisplayStrategy<T> {
  content: TemplateRef<any> | ((record: T) => string) | string;
  displayStrategyType: DisplayStrategyType;

  constructor(content: TemplateRef<any> | ((record: T) => string) | string) {
    this.content = content;
    setDisplayStrategyType(this, content);
  }
}

从Typescript注释可以看出,构造函数需要将一个参数传递给它,类型为TemplateRefFunctionString。然后它将此参数传递给函数setDisplayStrategyType

function setDisplayStrategyType(
  displayStrategy: { displayStrategyType: DisplayStrategyType },
  content: TemplateRef<any> | ((record: any) => string) | string
) {
  if (Object.getPrototypeOf(content).constructor.name === 'TemplateRef_') {
    displayStrategy.displayStrategyType = DisplayStrategyType.Template;
    return;
  }

  switch (typeof content) {
    case typeof Function:
    displayStrategy.displayStrategyType = DisplayStrategyType.FunctionTransform;
      break;
    case typeof String:
    default:
    displayStrategy.displayStrategyType = DisplayStrategyType.String;
      break;
  }
}

此函数尝试确定将三种类型中的哪一种作为参数传递,然后设置一个枚举值,允许某些显示逻辑出现在Angular组件中。

具体来说,对于TemplateRef类型,它是通过以下逻辑确定的:if (Object.getPrototypeOf(content).constructor.name === 'TemplateRef_')。这在我使用ng build构建项目时有效。当我运行ng build --prod时,它会停止工作,似乎是因为当所有内容都被弄糊涂时,TemplateRef_对象变为类似e的内容。关于答案here的第一条评论中提到了此问题。

我已尝试使用TemplateRef符号来处理此问题,如下所示:

const a = typeof TemplateRef;
const b = new TemplateRef();
const c = Object.getPrototypeOf(TemplateRef);

ViewChild装饰器一样,因为它似乎是Angular中创建TemplateRef实例的一种方式。

const a = typeof ViewChild;
const b = new ViewChild();
const c = Object.getPrototypeOf(ViewChild);

这些策略似乎都不起作用。是否有一种可靠的方法来构建一个新的TemplateRef对象,我可以比较&#39;类型&#39;用我的传递属性或其他方式来做出这个决定,以便我的图书馆可以继续使用prod构建吗?

0 个答案:

没有答案