#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
то же имя класса.