我正在优化我的库中的一些代码,然而,当我试图调用一个导入的类时,我有一个关于为什么括号表示法不起作用的问题。
参数type
接受camelCased类型的字符串,例如:myString
。参数data
可以是任何值。
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;
}
};
这就是我希望它看起来是什么样子,如果我使用点符号可视化它:
foo.fooBar(someRandomData)
这应该调用导入的类foo
上的静态方法fooBar(data)
,但是,我收到一条错误消息:
TypeError: [f][type] is not a function
如果我要将它恢复为我的if..else if
样式,它可以工作:
if (type.startsWith('foo')) return foo[type](data);
如何在不收到定义的错误消息的情况下执行上面所需的操作?
提前感谢您的帮助!
编辑:这是我从已有代码中修改的一个示例,因此,我修复了一些拼写错误。
编辑#2:根据请求,导入的类foo
如下所示:
export class foo{
static fooBar(data){
// Do stuff with data...
}
发布于 2019-06-05 09:32:00
最后,您需要一些对类或对象的引用才能开始。以下是如何实现这类功能的工作示例,但您需要从类实例的映射开始,以便能够访问它们:
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")));
发布于 2019-06-05 09:20:54
我建议你转而使用nodeJS内置的EventEmitter
。
你可以这样做:
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);
然后,当您想要触发一个事件时,您可以简单地:
discordEventEmitter.emit('fooBar', someData);
您还可以通过编写以下代码来简化事件处理程序注册:
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]);
});
https://stackoverflow.com/questions/56452929
复制相似问题