Я пытаюсь создать универсальную функцию, которая вернет мне точный интерфейс на основе аргумента enum, но все попытки терпят неудачу.
Может я что-то упустил или неправильно делаю?
Если я привожу результат к этому интерфейсу, все в порядке, но на самом деле это несколько бесполезно для меня.
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);






Есть два решения:
GenericRequest на BaseRequest в функции sendRequest, удалите тип GenericRequest.createRequest общим:
const createRequest = <TCommand extends Commands>(command: TCommand) => ({
command,
timestamp: new Date().getTime(),
});
Таким образом, свойство command будет такого типа, который вы передадите в аргументе command.Объяснение в том, что createRequest возвращает объект со свойством command всего типа Commands независимо от переданного типа. И тип GenericRequest в sendRequest определяет, что свойство command должно быть типа InfoRequest или EchoRequest — оно не знает обо всех значениях перечисления Command.