Я пытаюсь вывести тип возвращаемого значения метода из универсального переданного аргумента. Однако аргумент является реализацией из универсального интерфейса, поэтому я предполагаю, что вывод машинописного текста определил бы тип из базы аргумента.
Пример кода:
interface ICommand<T> {}
class GetSomethingByIdCommand implements ICommand<string> {
constructor(public readonly id: string) {}
}
class CommandBus implements ICommandBus {
execute<T>(command: ICommand<T>): T {
return null as any // ignore this, this will be called through an interface eitherway
}
}
const bus = new CommandBus()
// badResult is {}
let badResult = bus.execute(new GetSomethingByIdCommand('1'))
// goodResult is string
let goodResult = bus.execute<string>(new GetSomethingByIdCommand('1'))
Я бы хотел сделать первый execute
вызов и сделать так, чтобы машинописный текст вынул правильное возвращаемое значение, которое в данном случае равно string
в зависимости от того, из чего GetSomethingByIdCommand
было реализовано.
Я пробовал играть с условными типами но не уверен, что это решение или как его применить.
ICommand<T>
интерфейса нет ограничений в отношении того, какT
используется. Из-за этого вашGetSomethingByIdCommand
класс также неявно реализуетICommand<number>
(например). Действительно, кажется, что класс является реализациейICommand<T>
для любого типаT
. Учитывая это, как TypeScript выбирать, какой тип выводить? - person CRice   schedule 22.03.2019GetSomethingByIdCommand
неявно реализуетICommand<number>
, если явно реализуетICommand<string>
? Вы можете уточнить? - person Jake Holzinger   schedule 22.03.2019