簡體   English   中英

打字稿:基類的通用類型

[英]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中知道argsQueryArgs的實例。

提前致謝!

您需要進一步將通用類型參數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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM