Skip to content

Commit

Permalink
feat(core): add TS utility to infer extension instance by name
Browse files Browse the repository at this point in the history
  • Loading branch information
ghiscoding committed Nov 13, 2021
1 parent 2f56bd3 commit 3f4f65f
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 3 deletions.
23 changes: 23 additions & 0 deletions packages/common/src/enums/slickPluginList.enum.ts
@@ -1,14 +1,18 @@
import { ExtensionName } from '../enums/index';
import { SlickEditorLock, SlickRowDetailView } from '../interfaces/index';
import {
SlickAutoTooltip,
SlickCellExcelCopyManager,
SlickCellExternalCopyManager,
SlickCellMenu,
SlickCellRangeDecorator,
SlickCellRangeSelector,
SlickCellSelectionModel,
SlickCheckboxSelectColumn,
SlickColumnPicker,
SlickContextMenu,
SlickDraggableGrouping,
SlickGridMenu,
SlickGroupItemMetadataProvider,
SlickHeaderButtons,
SlickHeaderMenu,
Expand All @@ -18,6 +22,7 @@ import {

export type SlickPluginList =
SlickAutoTooltip |
SlickCellExcelCopyManager |
SlickCellExternalCopyManager |
SlickCellMenu |
SlickCellRangeDecorator |
Expand All @@ -33,3 +38,21 @@ export type SlickPluginList =
SlickRowDetailView |
SlickRowMoveManager |
SlickRowSelectionModel;

/* eslint-disable @typescript-eslint/indent */
// disable eslint indent rule until this issue is fixed: https://github.com/typescript-eslint/typescript-eslint/issues/1824
export type InferExtensionByName<T extends ExtensionName> =
T extends ExtensionName.autoTooltip ? SlickAutoTooltip :
T extends ExtensionName.cellExternalCopyManager ? SlickCellExcelCopyManager :
T extends ExtensionName.cellMenu ? SlickCellMenu :
T extends ExtensionName.columnPicker ? SlickColumnPicker :
T extends ExtensionName.contextMenu ? SlickContextMenu :
T extends ExtensionName.draggableGrouping ? SlickDraggableGrouping :
T extends ExtensionName.gridMenu ? SlickGridMenu :
T extends ExtensionName.groupItemMetaProvider ? SlickGroupItemMetadataProvider :
T extends ExtensionName.headerButton ? SlickHeaderButtons :
T extends ExtensionName.headerMenu ? SlickHeaderMenu :
T extends ExtensionName.rowDetailView ? SlickRowDetailView :
T extends ExtensionName.rowMoveManager ? SlickRowMoveManager :
T extends ExtensionName.rowSelection ? SlickRowSelectionModel : any;
/* eslint-enable @typescript-eslint/indent */
6 changes: 3 additions & 3 deletions packages/common/src/services/extension.service.ts
@@ -1,5 +1,5 @@
import { Column, Extension, ExtensionModel, GridOption, SlickRowDetailView, } from '../interfaces/index';
import { ColumnReorderFunction, ExtensionList, ExtensionName, SlickControlList, SlickPluginList } from '../enums/index';
import { ColumnReorderFunction, ExtensionList, ExtensionName, InferExtensionByName, SlickControlList, SlickPluginList } from '../enums/index';
import { SharedService } from './shared.service';
import { TranslaterService } from './translater.service';
import {
Expand Down Expand Up @@ -126,8 +126,8 @@ export class ExtensionService {
}

/** Get Extension Instance by its name */
getExtensionInstanceByName(name: ExtensionName): SlickControlList | SlickPluginList | undefined {
return this.getExtensionByName(name)?.instance;
getExtensionInstanceByName<T extends ExtensionName>(name: T): InferExtensionByName<T> {
return this.getExtensionByName(name)?.instance as InferExtensionByName<T>;
}

/**
Expand Down

0 comments on commit 3f4f65f

Please sign in to comment.