如何在运行时获取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
相关产品推荐
相关产品推荐

