Typescript 这是在使用decorator调用异步函数时发生的

Typescript 这是在使用decorator调用异步函数时发生的,typescript,Typescript,我的文件名为commands.js。在我的概念中,它将在调用实际函数之前被调用,并将检查消息是否有内容,内容是否等于(或类似于)cmd。在我使函数异步之前,一切都正常。我用decorator(根据tsc的提示)转换了文件,结果如下: import { Message } from "discord.js"; export function command(cmd:string, eq:boolean=false) { return (target, propertyKey: strin

我的文件名为
commands.js
。在我的概念中,它将在调用实际函数之前被调用,并将检查
消息
是否有
内容
内容
是否等于(或类似于)
cmd
。在我使函数异步之前,一切都正常。我用decorator(根据
tsc
的提示)转换了文件,结果如下:

import { Message } from "discord.js";

export function command(cmd:string, eq:boolean=false) {
    return (target, propertyKey: string, descriptor: TypedPropertyDescriptor<(msg: Message) => Promise<void>>) => {
        let f = descriptor.value;
        descriptor.value = (msg: Message) => {
            if(!msg.content || msg.content.trim() === "") {
                return Promise.resolve<void>(undefined);
            }
            if(!msg.author) {
                return Promise.resolve<void>(undefined);
            }
            if(eq && msg.content !== cmd) {
                return Promise.resolve<void>(undefined);
            } else if(!eq && !msg.content.startsWith(cmd + " ") && msg.content !== cmd) { 
                return Promise.resolve<void>(undefined);
            }
            if(f) {
                return f.call(f.caller, msg);
            } else {
                return Promise.resolve<void>(undefined);
            }
        };
        return descriptor;
    };
};
从“discord.js”导入{Message};
导出函数命令(cmd:string,eq:boolean=false){
return(target,propertyKey:string,descriptor:TypedPropertyDescriptor>)=>{
设f=descriptor.value;
descriptor.value=(消息:消息)=>{
如果(!msg.content | | msg.content.trim()==“”){
返回承诺。解决(未定义);
}
如果(!msg.author){
返回承诺。解决(未定义);
}
if(eq&&msg.content!==cmd){
返回承诺。解决(未定义);
}如果(!eq&&!msg.content.startsWith(cmd+“”)&&msg.content!==cmd){
返回承诺。解决(未定义);
}
如果(f){
返回f.call(f.caller,msg);
}否则{
返回承诺。解决(未定义);
}
};
返回描述符;
};
};
它可以工作,但在实函数(
f
中,这个
不会持久存在,因此无法从中获得任何信息

我做错了什么,以及如何将
返回到异步函数中

@command("!ping", true)
async onMessage(msg:Message) {
    msg.react("change descriptor to be classic function and then you can access scope directly from 
this
. Also if you change descriptor.value to be an async function, you can use await directly in decorator. https://stackblitz.com/edit/typescript-dycwcg

descriptor.value = async function(msg: Message) {
  await f.apply(this, msg);
}
@命令(“!ping”,true)
异步onMessage(消息:Message){

msg.react(“将descriptor更改为经典函数,然后您可以直接从此
访问作用域。此外,如果您将descriptor.value更改为异步函数,则可以在decorator中直接使用wait