[英]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.