我正在尝试创建一个通用函数,该函数将基于枚举参数返回一个确切的接口,但是任何尝试都会失败。
也许我错过了某件事或做错了吗?
如果我将结果输入该界面,一切都可以,但实际上对我来说毫无用处。
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);
答案 0 :(得分:1)
有两种解决方案:
GenericRequest
函数中将BaseRequest
替换为sendRequest
,删除GenericRequest
类型。createRequest
通用:
const createRequest = <TCommand extends Commands>(command: TCommand) => ({
command,
timestamp: new Date().getTime(),
});
因此,command
属性的类型将使您可以传入command
参数。解释是createRequest
返回具有整个类型command
的{{1}}属性的对象,而不管传递的类型如何。 Commands
中的GenericRequest
类型定义了sendRequest
属性应该是command
还是InfoRequest
类型-它不知道所有的{{1 }}枚举值。