打字稿:基类的通用类型

时间:2019-01-30 03:47:04

标签: typescript typescript-generics

我有以下代码作为简化示例:

CONNECT

我遇到的问题是class QueryArgs { studentId?: string; teacherId?: string; } class BaseValidator<T> { protected args: T; constructor(args: T) { this.args = args; } protected requireTeacher(): void { if (!this.args.teacherId) { throw new Error("teacherId required"); } } } class QueryValidator extends BaseValidator<QueryArgs> { public validateAdmin(): QueryArgs { this.requireTeacher(); return this.args; } } // Recreated implementation from a third party library const args: QueryArgs = new QueryArgs(); args.studentId = "XXXX-XXX-XXX"; // Not the actual implementation just for illustration const validator = new QueryValidator(args); const validArgs = validator.validateAdmin(); 方法BaseValidator的{​​{1}}类中的错误requireTeacher

我不确定Typescript的泛型部分中缺少什么。

理想情况下,TS会在this.args.teacherId中知道Property 'teacherId' does not exist on type 'T'BaseValidator的实例。

谢谢!

1 个答案:

答案 0 :(得分:1)

您需要进一步将通用类型参数T约束为具有teacherId属性的类型。现在,任何类型都可以作为T传递,这意味着您不能假设T具有teacherId

要限制类型,请尝试将class BaseValidator<T>更改为class BaseValidator<T extends QueryArgs>。这会将T限制为扩展QueryArgs的类型,这样可以保证T具有teacherId属性。

在本文中提到使用extendshttps://www.typescriptlang.org/docs/handbook/generics.html

约束通用参数