繁体   English   中英

打字稿:泛型接口扩展

[英]Typescript: Generics interface extension

是否有可能以这种方式扩展?

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等。

通过这种方式,它们与各自的接口紧密耦合。 IE。 你不应该把subject as Math and course as ENG232

目前它抱怨 ICourse 接口的extends T为: An interface can only extend an object type or intersection of object types with statically known members.

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

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 };

还请注意,您不应将 Generic Type 视为将接口组合在一起的方式。 当您没有接口/类的类型并希望该通用接口/类型的用户声明它时,应该使用它。

例如,您不知道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 };

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM