Infer TypeScript универсальный тип класса - PullRequest
0 голосов
/ 28 апреля 2019

B расширяет универсальный класс A. Мне нужно иметь возможность вывести универсальный тип расширенного A из B. См. Код ниже.

Я успешно использовал это в предыдущих версиях Typescript, но для моего текущего проекта, использующего 3.2.4 (также пробовал последнюю версию 3.4.5), выводимый тип, по-видимому, дает {} вместо string.

Есть идеи, что я делаю не так? Это не могло измениться?

class A<T> {

}

class B extends A<string> {

}

type GenericOf<T> = T extends A<infer X> ? X : never;

type t = GenericOf<B>; // results in {}, expected string

Ответы [ 2 ]

0 голосов
/ 28 апреля 2019

В настоящее время класс, имеющий обобщение, которое не используется в классе, в буквальном смысле имеет ту же «структуру», что и {}, следовательно, вывод.Внесенное изменение, которое нарушило вашу функциональность, было исправлением ошибки, и обходной путь заключается в использовании универсального «А» где-то внутри класса, и вывод будет работать снова.

Надеюсь, это поможет.

class A<T> {
    hello: T = "" as any; // note that i have used the generic somewhere in the class body.
}
class B extends A<string> {}
type GenericOf<T> = T extends A<infer X> ? X : never;
type t = GenericOf<B>; // string.
0 голосов
/ 28 апреля 2019

Хорошо, Н.В.М понял это сам после тонны исследований. Кажется, что TypeScript не может различить в этом простом случае, потому что все эти классы пусты и эквивалентны {}. Добавление свойств на самом деле недостаточно, это должны быть свойства, которые на самом деле ссылаются на универсальный T, чтобы TypeScript мог правильно выводить универсальный тип в дальнейшем:



class A<T> {
  constructor(public a: T) {}
}

class B extends A<C> {
  constructor(public b: C) {
    super(b);
  }
}

class C {
  constructor(public c: string) {
  }
}

type GenericOf<T> = T extends A<infer X> ? X : never;

type t = GenericOf<B>;
...