You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在运行时获取Angular对象的Type类型?

问题翻译

我有一个接收Angular Type类型参数的函数createThing,它会基于该Type构造组件对象:

createThing(kind: Type<any>) {
    // 创建一个kind类型的新组件
}

该函数是ViewContainerRef.createComponent的轻量封装。我想在父类Parent中定义clone方法,调用createThing创建Child类型实例,示例代码如下:

class Parent {
    ...
    clone() {
        createThing(this.Type)
    }
}

但this.Type不存在,typeof this返回字符串类型。请问如何在运行时获取当前或任意Angular对象的Type类型?

解决方案

方案1:显式在类中存储类型引用

给父类添加一个用于存储类型的属性,子类继承时传入自身的构造函数作为类型值:

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

class Parent {
  protected componentType: Type<any>;

  constructor(type: Type<any>) {
    this.componentType = type;
  }

  clone() {
    createThing(this.componentType);
  }
}

class Child extends Parent {
  constructor() {
    // 把Child自身的构造函数传给父类
    super(Child);
  }
}

这种方式清晰可控,适合需要明确管理类型的场景。

方案2:利用实例的constructor属性

JavaScript中每个对象的constructor属性指向它的构造函数,直接用这个属性并做类型断言即可:

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

class Parent {
  clone() {
    // 将constructor断言为Type类型
    const currentType = this.constructor as Type<any>;
    createThing(currentType);
  }
}

class Child extends Parent {}

这个方案最简洁,不需要额外的属性或构造函数参数,只要子类正常调用super(Angular组件子类都会遵循这个规范),就能正确获取到当前实例的类型。

注意事项

  • 确保组件类上装饰了@Component或@Injectable,这样Type才能被Angular的组件工厂正确识别。
  • 若遇到constructor类型断言报错,可以在父类中添加类型声明:constructor: Type<any>,强制指定类型。

内容的提问来源于stack exchange,提问作者Him

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 03:35:11