有没有一种方法可以满足基于枚举字段的某些接口?

时间:2019-04-06 10:27:39

标签: typescript typescript3.0

我正在尝试创建一个通用函数,该函数将基于枚举参数返回一个确切的接口,但是任何尝试都会失败。

也许我错过了某件事或做错了吗?

如果我将结果输入该界面,一切都可以,但实际上对我来说毫无用处。

enum Commands {
    Info = "info",
    Echo = "echo",
}

interface BaseRequest {
    command: Commands;
    timestamp: number;
}

interface InfoRequest extends BaseRequest {
    command: Commands.Info;
}

interface EchoRequest extends BaseRequest {
    command: Commands.Echo;
}

type GenericRequest = InfoRequest | EchoRequest;

const createRequest = (command: Commands) => ({
    command,
    timestamp: new Date().getTime(),
});

const sendRequest = (request: GenericRequest) => {};

const request = createRequest(Commands.Info);
sendRequest(request);

1 个答案:

答案 0 :(得分:1)

有两种解决方案:

  1. GenericRequest函数中将BaseRequest替换为sendRequest,删除GenericRequest类型。
  2. 使createRequest通用:
    const createRequest = <TCommand extends Commands>(command: TCommand) => ({
        command,
        timestamp: new Date().getTime(),
    });
    
    因此,command属性的类型将使您可以传入command参数。

解释是createRequest返回具有整个类型command的{​​{1}}属性的对象,而不管传递的类型如何。 Commands中的GenericRequest类型定义了sendRequest属性应该是command还是InfoRequest类型-它不知道所有的{{1 }}枚举值。