【问题标题】:How to get a class from a string in TypeScript/JavaScript in an Angular 2 application?如何在 Angular 2 应用程序中从 TypeScript/JavaScript 中的字符串获取类?
【发布时间】:2017-02-13 06:02:24
【问题描述】:

在我的应用程序中,我有这样的东西:

user.ts

export class User { ... }

现在,我这样做:

app.component.ts

callAnotherFunction(User);

如果我将类名作为字符串,即"User",我该怎么做?如果可能,我将如何检查变量是否真的是可用的类?

例如:

let test = "User";

if (**test is really a usable class**) {
    console.log("Yay!");
    callAnotherFunction(**something to put here**);
} else {
    console.log("Error!");
}

我不确定这是否可能,但已经感谢您的意见。


到目前为止,我发现的只是这样的例子:

let test = "User";
let user = new window[test]();

user 将是User 的一个实例。此外,它似乎在我的 Angular 2 应用程序中不起作用——可能是范围错误。如果我想试试这个,我需要用什么来代替window

【问题讨论】:

  • 你不能。如果它不在window 上,你会从哪里获得对此类的参考?此外,缩小的User 类不会这样命名,更可能是更接近a 的名称。请解释一下你需要这个做什么。您尝试做的事情看起来是个坏主意,而且很可能您有 XY 问题。
  • 我想将动态内容放入一个 JavaScript 对象的实例中,例如 { "class": "User", "name": "estus" } 的结果应该与 let user = new User(); user.name = "estus"; 相同。为了保持完全动态,我需要通过字符串"User" 以某种方式获取User 的实例。
  • 您需要使用{ provide: 'User', useClass: User } 定义所有需要以这种方式访问​​的类,使用@Inject('User') user: User 注入它们,使用injector.get('User') 使用注入器动态获取它们。这很麻烦,但它会起作用。同样,这并不能解释为什么您需要以艰难的方式做到这一点。可能存在更符合框架的 DI 模式,因为这显然不是其中之一。
  • 我同意,我应该找到更好的方法来做我想做的事。感谢您的意见!

标签: javascript class oop angular typescript


【解决方案1】:

这听起来像是打字稿中的反思问题。

如果你还没有,也许你可以检查一下

Dynamically loading a typescript class (reflection for typescript)

【讨论】:

  • 是的,我已经读过了,谢谢。这些示例对我有用,但我想获取类而不是实例。在我上面的示例中,对于window["String"],它按预期工作。但由于我的自定义类User 不在window 中,我无法访问它。我怎样才能访问它,以便我可以做window["User"] 或类似的事情?
  • 您是否还看到:stackoverflow.com/a/38127705/1804189stackoverflow.com/a/35787628/1804189 他们解释了如何在 Typescript 1.8+ 中完成此操作
  • 是的,我现在的主要问题似乎是找出 User 所在的命名空间。我遵循通常的 Angular 2 模式,但您没有明确定义命名空间。
  • @andreas - 您是否能够使用通常的 Angular 2 模式从字符串中获取 typescript 类型?请提供任何有用的链接,我无法使用 Nico 提供的链接
猜你喜欢
  • 2017-05-04
  • 1970-01-01
  • 1970-01-01
  • 2016-05-12
  • 2016-11-04
  • 2016-05-17
  • 1970-01-01
  • 2020-06-16
  • 2016-08-28
相关资源
最近更新 更多