首页 > 解决方案 > 函数返回类型取决于作为参数的 keyof 接口

问题描述

我有一个函数getThing,它的第一个参数应该是类的小写名称,返回类型是类本身的实例或null. 它还有第二个参数用于“搜索”其中的类(内部代码,这里不重要)。

例如,如果我这样做getThing('user', "the content"),它应该返回我User | null

但是我找不到如何做到这一点,所以现在我对每个可能的输入都有一个重载,但是阅读起来很长而且很复杂,所以我问是否有更好的方法来做到这一点?

现在,我有这样的东西,但它根本不起作用:

interface Type {
    channel: Channel;
    command: Command;
    emote: Emoji;
    guild: Guild;
    member: GuildMember;
    message: Message;
    role: Role;
    user: User;
};

async function getThing<T extends keyof Type>(datatype: T, content: string | Message): Promise<Type[typeof datatype] | null> {
    switch (dataType) {
        case 'channel':
            return new Channel();
        case 'command':
            return new Command();
        case 'emote':
            return new Emoji();
        case 'member':
            return new GuildMember();
        case 'message':
            return new Message();
        case 'role':
            return new Role();
        case 'user':
            return new User();
    }
}

async () => {
    const test = await getThing('command', 'test');
};

当悬停在“测试”上时,它说Channel | null哪个是正确的,但是在函数中所有new Something()都是错误的,因为 TypeScript 正在等待Channel & Command & Emoji & Guild & GuildMember & Message & Role & User,这不是我想要的:/

TS游乐场在这里

标签: typescripttypestypescript-genericsreturn-type

解决方案


推荐阅读