[英]Typescript: Generic type in base class
我有以下代碼作為簡化示例:
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();
我遇到的問題是requireTeacher
方法中的BaseValidator
類中this.args.teacherId
具有錯誤Property 'teacherId' does not exist on type 'T'
。
我不確定Typescript的泛型部分中缺少什么。
理想情況下,TS在BaseValidator
中知道args
是QueryArgs
的實例。
提前致謝!
您需要進一步將通用類型參數T
約束為具有teacherId
屬性的類型。 現在,任何類型都可以作為T
傳遞,這意味着您不能假定T
具有teacherId
。
要約束類型,請嘗試將class BaseValidator<T>
class BaseValidator<T extends QueryArgs>
更改為class BaseValidator<T>
class BaseValidator<T extends QueryArgs>
。 這將T
限制為擴展QueryArgs
類型,以便確保T
具有teacherId
屬性。
查閱本文,其中提到使用extends
約束通用參數: https : //www.typescriptlang.org/docs/handbook/generics.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.