首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >根据输入数据使用括号表示法

根据输入数据使用括号表示法
EN

Stack Overflow用户
提问于 2019-06-05 08:40:39
回答 2查看 83关注 0票数 1

我正在优化我的库中的一些代码,然而,当我试图调用一个导入的类时,我有一个关于为什么括号表示法不起作用的问题。

参数type接受camelCased类型的字符串,例如:myString。参数data可以是任何值。

代码语言:javascript
复制
import { foo } from './example';

export const find = (type: string, data: any) => {

// This next line effectively deletes the end of the string starting
// from the first capital letter.
    const f = type.replace(/[A-Z][a-z]+/, '');
    try {
        return [f][type](data);
    } catch (e) {
        return e;
    }
};

这就是我希望它看起来是什么样子,如果我使用点符号可视化它:

代码语言:javascript
复制
foo.fooBar(someRandomData)

这应该调用导入的类foo上的静态方法fooBar(data),但是,我收到一条错误消息:

代码语言:javascript
复制
TypeError: [f][type] is not a function

如果我要将它恢复为我的if..else if样式,它可以工作:

代码语言:javascript
复制
if (type.startsWith('foo')) return foo[type](data);

如何在不收到定义的错误消息的情况下执行上面所需的操作?

提前感谢您的帮助!

编辑:这是我从已有代码中修改的一个示例,因此,我修复了一些拼写错误。

编辑#2:根据请求,导入的类foo如下所示:

代码语言:javascript
复制
export class foo{
static fooBar(data){
// Do stuff with data...
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-05 09:32:00

最后,您需要一些对类或对象的引用才能开始。以下是如何实现这类功能的工作示例,但您需要从类实例的映射开始,以便能够访问它们:

代码语言:javascript
复制
class foo {
    fooBar(data: any) { return { name: 'foo', data } };
}

class example {
    exampleFood(data: any) { return { name: 'example', data } };
}

var lookup: { [classes: string]: any; } = { };
lookup['foo'] = new foo();
lookup['example'] = new example();

const find = (encodedType: string, data: any) => {
    // This next line effectively deletes the end of the string starting
    // from the first capital letter.
    const f = encodedType.replace(/[A-Z][a-z]+/, '');
    try {

        return lookup[f][encodedType](data);
    } catch (e) {
        return e;
    }
};

alert(JSON.stringify(find("fooBar", "Found you foo")));
alert(JSON.stringify(find("exampleFood", "Found you example")));
票数 0
EN

Stack Overflow用户

发布于 2019-06-05 09:20:54

我建议你转而使用nodeJS内置的EventEmitter

你可以这样做:

代码语言:javascript
复制
import * as EventEmitter from 'events';

import { foo } from './example';
import { bar } from './example2';

export const discordEventEmitter = new EventEmitter();

discordEventEmitter.on('fooBar', foo.fooBar);
discordEventEmitter.on('fooToo', foo.fooToo);
discordEventEmitter.on('barBell', bar.barBell);

然后,当您想要触发一个事件时,您可以简单地:

代码语言:javascript
复制
discordEventEmitter.emit('fooBar', someData);

您还可以通过编写以下代码来简化事件处理程序注册:

代码语言:javascript
复制
const fooProps = Object.getOwnPropertyNames(foo) as (keyof typeof foo)[];
fooProps.filter(k => typeof foo[k] === 'function').forEach(funcName => {
  discordEventEmitter.on(funcName, foo[funcName]);
});

const barProps = Object.getOwnPropertyNames(bar) as (keyof typeof bar)[];
fooProps.filter(k => typeof bar[k] === 'function').forEach(funcName => {
  discordEventEmitter.on(funcName, bar[funcName]);
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56452929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档