Я не понимаю, почему Typescript не может правильно вывести типы в следующем случае, который включает вывод из параметров типа.(Этот вопрос похож на Проблема вывода типа TypeScript , но это несколько другой случай. Однако ответ может быть таким же, что мне просто не повезло!)
// A base class for a dialog taking parameter of type P
// and returning result of type R.
class BaseDialog<P, R> { p: P; r: R; }
class ValueDialog extends BaseDialog<string, number> {}
// A function that shows the dialog
show<T extends BaseDialog<P, R>, P, R>(dlg: Type<T>, param: P): Promise<R> {}
Примечание: Чтобы упростить сигнатуру метода, я использую Angular Type
:
export interface Type<T> extends Function {
new (...args: any[]): T;
}
Теперь, когда я вызываю метод show
, как показано ниже, тип R
не выводится правильно:
show(ValueDialog, "name").then(r => console.log(r));
Компилятор выводит:
T = ValueDialog
P = string
R = {}
Поскольку T
правильно выведен, вы можете подумать, что компилятор может вывести P
и R
из ValueDialog
Это определение, но оно не так.
Конечно, я могу это исправить, указав типы вручную, но это довольно уродливо.Я также могу исправить это, сделав P
и R
одинаковыми, но это не та функциональность, которую я хочу.
Как я могу определить show()
, чтобы она правильно выводила R
?