打字稿:泛型接口扩展

时间:2020-10-15 02:57:26

标签: javascript typescript extends

是否可以扩展诸如方式?

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

export interface ICourse<T> extends T { }

export interface ISubject { }

ClassRoom可以在其中实现教数学,英语的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 个答案:

答案 0 :(得分:1)

您不能扩展泛型类型,因此该语句不正确

export interface ICourse<T> extends T { }

我将课程中的主题代码(MAT,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是字符串还是数字。您可以像这样创建一个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 };