【问题标题】:Test the existence of a dynamically chosen class测试是否存在动态选择的类
【发布时间】:2019-01-04 08:44:25
【问题描述】:

我想要处理来自外部来源的数据。为了做到这一点,我收到的对象被标记为它们的原始类名。现在我想使用该标签名称并使用它在我自己的应用程序中填充模型。我被困在检查该类在我的代码库中是否具有等价物的步骤上。它看起来像这样:

this.objects.forEach((object) => {

if (typeof object.class_tag !== 'undefined') { //the problem line
//create class instance
}

});

在 php 中,我只需调用 class_exists 即可实现此目的

<?php
if (class_exists($object->class_tag)) {}

这里的正确方法是什么?

【问题讨论】:

  • 应用中的类型安全性有多重要?例如,它 必须 是 X 类的一个实例吗?在这里想想匿名对象会容易得多。
  • @James 需要在每个模型的基础上区别对待数据。这在普通对象中会很困难

标签: node.js ecmascript-6 es6-class


【解决方案1】:

我看不出只有一行的明确方法。

其中一种可能的方法是注册现有课程的方式。 例如,如果您稍后使用某种namespace,您可以简单地检查该类在命名空间中是否存在。 示例代码:

class A {}
const a = "A"
const namespace = { A };

if (namespace[a]) {
  // class exists, you can create object
  const instance = new namespace[a]();
}

可能,更好的方法是为您制作一些serviceregisterClasscheckClasscreateInstance。所以你的逻辑被包裹在一个地方。

【讨论】:

  • 对我来说,服务是通往这里的道路 - 没有惯用的方法,我会说明确会更好地避免任何意外行为。
  • @James 我想说,如果 TS 必须做这样的事情,应用程序中存在一些架构问题。
【解决方案2】:

我找到了办法

(感谢https://stackoverflow.com/a/34656123/746549

let logger = require('../javascripts/serverlog');
let util = require('util');

let Extension = require('../models/object/Extension');

const classes = {Extension: Extension};

/**
 * Utility to emulate class exists / dynamic class naming
 * @param className
 * @returns {*}
 */
module.exports.dynamicClass = (className) => {

    logger.debug(classes);
    logger.debug(className);
    if (classes[className]) {
        return classes[className];
    } else {
        return false;
    }

};

用法:

let ClassOrFalse = dynamicClass.dynamicClass(object._class_tag);

【讨论】:

    猜你喜欢
    • 2014-10-20
    • 1970-01-01
    • 1970-01-01
    • 2018-11-21
    • 2019-03-26
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多