Angular中能否用单个泛型类型简化matDialog.open的多参数声明?
用单个泛型类型简化Angular MatDialog.open调用
MatDialog.open的泛型签名是固定的三个独立参数<Component, Data, Return>,没法直接只传递单个泛型参数替代三个,但可以通过定义复合类型打包关联类型,再结合类型提取或封装方法来简化调用。
实现步骤
定义复合类型打包三个关联类型
先把你的MyDialogType<T>、MyDialogData<T>、MyDialogReturn<T>打包成一个泛型复合类型:// 假设你的基础类型定义 interface Boat { /* Boat类型结构 */ } type MyDialogType<T> = /* 对话框组件类型 */; type MyDialogData<T> = { item: T }; type MyDialogReturn<T> = { success: boolean; data?: T }; // 定义复合类型,打包三个关联类型 type OneType<T> = { Component: MyDialogType<T>; Data: MyDialogData<T>; Return: MyDialogReturn<T>; };直接调用时提取类型参数
不需要额外封装的话,可以直接从复合类型中提取三个参数传递给MatDialog.open:// 生成Boat对应的复合类型 type BoatDialogType = OneType<Boat>; // 调用MatDialog.open,提取复合类型中的三个子类型 this.matDialog.open< BoatDialogType['Component'], BoatDialogType['Data'], BoatDialogType['Return'] >(YourBoatDialogComponent, { data: { item: myBoatInstance } });封装方法实现更简洁的调用
如果想要更精简的调用方式,可以封装一个自定义服务方法,内部处理类型解析:import { Injectable } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; @Injectable({ providedIn: 'root' }) export class DialogService { constructor(private matDialog: MatDialog) {} // 对外暴露单个泛型参数的调用方式 open<T>(component: MyDialogType<T>, data: MyDialogData<T>) { return this.matDialog.open< MyDialogType<T>, MyDialogData<T>, MyDialogReturn<T> >(component, { data }); } }调用时就不需要重复写三个泛型参数:
this.dialogService.open<Boat>(YourBoatDialogComponent, { item: myBoatInstance });
补充说明
如果想用元组类型打包也可以,写法类似:
type OneType<T> = [MyDialogType<T>, MyDialogData<T>, MyDialogReturn<T>]; type BoatDialogTuple = OneType<Boat>; this.matDialog.open<BoatDialogTuple[0], BoatDialogTuple[1], BoatDialogTuple[2]>(...);
内容的提问来源于stack exchange,提问作者user3623300
相关产品推荐
相关产品推荐

