Typescript: расширение интерфейса Generics

#javascript #typescript #extends

#javascript #typescript #расширяет

Вопрос:

Возможно ли расширить такой способ?

 export interface IClass<T extends ISubject> {
  subject : T;
  course : ICourse<T>;
}

export interface ICourse<T> extends T { }

export interface ISubject { }
  

Где класс может реализовать iCLASS, который преподает математику, английский. Тем не менее, курс должен иметь отношение к предмету. Таким образом, математика будет иметь следующие курсы: MAT101, MAT205 и т.д., а английский имеет ENG232, ENG302 и т.д..

Таким образом, они тесно связаны с соответствующим интерфейсом. Т. Е. вы не должны быть в состоянии передать subject as Math and course as ENG232

В настоящее время он жалуется extends T на интерфейс ICourse как: An interface can only extend an object type or intersection of object types with statically known members.

Ответ №1:

Вы не можете расширять общий тип, поэтому это утверждение неверно

 export interface ICourse<T> extends T { }
  

Я бы разделил предметный код (MATH, ENG) и номер (205, 232) в курсе.

 export enum Subject {
  Math = "MAT",
  English = "ENG"
}

export interface Course {
  subjectCode: SubjectCode,
  courseId: number,
}
  

Тогда у вас может быть курс, подобный:

 const math101: Course = { subjectCode: Subject.Math, courseId: 205 };
const english232: Course = { subjectCode: Subject.English, courseId: 232 };
  

Также следует отметить, что вы не должны думать об общем типе как о том, как вы объединяете интерфейс вместе. Его следует использовать в случае, когда у вас нет типа вашего интерфейса / класса и вы хотите, чтобы пользователь этого универсального интерфейса / типа объявил его.

Например, вы не знаете courseId строку или число is . Вы можете создать Course интерфейс, подобный этому.

 export interface Course<T> {
  subjectCode: SubjectCode,
  courseId: T,
}
  

И тогда использование:

 const math101: Course<string> = { subjectCode: Subject.Math, courseId: "205" };
const english232: Course<number> = { subjectCode: Subject.English, courseId: 232 };
  

Комментарии:

1. Спасибо за ответ. Просто примечание: я только что использовал Course и Subject в качестве примера, мне нужно будет использовать их в качестве интерфейса только потому, что они будут реализованы гораздо более сложным классом. Также вы предполагаете, что MAT205 существует, а ENG205 нет, верно? Как бы вы решили для этого случая? Также, пожалуйста, не перечисляйте или не вводите типы только потому, что дочерние элементы этой реализации очень сложны, и я просто хочу сказать, что реализовать этот интерфейс, и разработчик также Course должен использовать Subject то же имя класса.