我有以下代码作为简化示例:
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
的实例。
谢谢!
答案 0 :(得分:1)
您需要进一步将通用类型参数T
约束为具有teacherId
属性的类型。现在,任何类型都可以作为T
传递,这意味着您不能假设T
具有teacherId
。
要限制类型,请尝试将class BaseValidator<T>
更改为class BaseValidator<T extends QueryArgs>
。这会将T
限制为扩展QueryArgs
的类型,这样可以保证T
具有teacherId
属性。
在本文中提到使用extends
:https://www.typescriptlang.org/docs/handbook/generics.html