簡體   English   中英

在 typescript 中擴展泛型 T 的接口

[英]Extends interface of generic type T in typescript

您好,我正在嘗試擴展接口消息。 我在代碼中遇到錯誤,如下所示,有人可以解釋如何處理數據嗎:T

我收到以下錯誤

 component.ts:102:8 - error TS2554: Expected 2-3 arguments, but got 1.
    
    102       .subscribe(({ studentId,courseNumber }) => {

 

    node_modules/rxjs/internal/Observable.d.ts:51:39
        51     subscribe(next: null | undefined, error: (error: any) => void, complete?: () => void): Subscription;
                                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~
    An argument for 'error' was not provided.

在我的 MessageService.ts 中,我有以下內容


interface Message<T> {
  data :T;
  type: MessageActionType;
}

type Messages = {
  [MessageActionType.TeacherRequest]: Subject<TeacherMessageData>;
  [MessageActionType.StudentRequest]: Subject<StudentMessageData>;
};

type MessageData = TeacherMessageData & PersonProcessWebSocketMessageData ;

private messages: Messages = this.getMessages();

private getMessages(): Messages {
    return Object.values(MessageActionType).reduce(
      (accumulator: Messages, nextValue: MessageActionType) => ({
        ...accumulator,
        [nextValue]: new Subject<object>(),
      }),
      {} as Messages
    );
  }

private messageHandler = ({ data, type }:Message<MessageData>): void => {
    this.messages[type].next(data);
  };


  public save<T extends keyof Messages>(actionType: T): Messages[T] {
    if (!this.messages.hasOwnProperty(actionType)) {
      throw new NonFatalError(
        `cannot save type ${
          actionType as string
        } because it is not a valid ActionType in MessageService`,
        'MessageService.save'
      );
    }

    return this.messages[actionType];
  }

在我的組件中,我調用服務消息服務,我在其中調用方法保存

 private destroy$ = new Subject<boolean>();
  this.messagesService
      .save(actionType)
      .pipe(takeUntil(this.destroy$))
      .subscribe(({ studentId, courseNumber }) => {
        if (studentId && courseNumber )
        ) {
          console.log("registered student")
        }
      });

在我的 reference.ts 中,根據操作類型需要的數據

export interface TeacherMessageData{
  teacherId?: number;
  moduleNumber: string;
}

export interface StudentMessageData{
  courseNumber: string;
  studentId?: number;
}

您收到錯誤是因為 TS 使用了不正確的(已棄用的) subscribe重載,它至少需要 2 個參數(根據錯誤消息):

subscribe(next: null | undefined, error: (error: any) => void, complete?: () => void): Subscription;

而您想使用其中所有參數都是可選的參數:

subscribe(next?: (value: T) => void, error?: (error: any) => void, complete?: () => void): Subscription;

我能看到的唯一可能導致這種情況的是你在if (studentId && courseNumber ) )之后有一個額外的 ) 這可能會使編譯器感到困惑 - 但我很驚訝它完全可以編譯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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