Первая проблема заключается в том, что ваш интерфейс пуст, типизированный текст использует структурную типизацию, поэтому, если ваш универсальный интерфейс не будет использовать свой параметр типа, он не будет иметь большого значения, если он у него есть.Например, это работает:
interface I<T> { }
declare let foo: I<string>
declare let bar: I<number>
// Same structure ({}), assignment works
foo = bar
bar = foo
Событие, если мы добавим поле, Typescript все равно не будет выводить параметр типа R
, он просто не будет пытаться извлечь его из T
.Лучше всего использовать условный тип и извлечь параметр универсального типа там, где он вам нужен:
interface I<T> {
value :T
}
class A implements I<string> {
value! :string
}
type ExtractFromI<T extends I<unknown>> = T extends I<infer U> ? U : never;
function foo<T extends I<unknown>>(bar: T): ExtractFromI<T>{
return bar.value as ExtractFromI<T>; // Generic type with unresolved type parameters, we need a type assertion to convince the compiler this is ok
}
var r = foo(new A()); // string