From bb2db3d6c37a9ea9fc81f53e15e86fb22bf751a5 Mon Sep 17 00:00:00 2001 From: psychedelicious <4822129+psychedelicious@users.noreply.github.com> Date: Wed, 11 Sep 2024 19:25:10 +1000 Subject: [PATCH] feat(ui): improve typing on CanvasEntityAdapterBase Use a generic to narrow the `type` field from `string` to a literal. Now you can do e.g. `adapter.type === 'control_layer_adapter'` and TS narrows the type. --- .../konva/CanvasEntity/CanvasEntityAdapterBase.ts | 7 ++++--- .../CanvasEntity/CanvasEntityAdapterControlLayer.ts | 9 +++++---- .../konva/CanvasEntity/CanvasEntityAdapterInpaintMask.ts | 9 +++++---- .../konva/CanvasEntity/CanvasEntityAdapterRasterLayer.ts | 9 +++++---- .../CanvasEntity/CanvasEntityAdapterRegionalGuidance.ts | 9 +++++---- 5 files changed, 24 insertions(+), 19 deletions(-) diff --git a/invokeai/frontend/web/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterBase.ts b/invokeai/frontend/web/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterBase.ts index 5eb369fd97..38a407ad7d 100644 --- a/invokeai/frontend/web/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterBase.ts +++ b/invokeai/frontend/web/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterBase.ts @@ -15,9 +15,10 @@ import stableHash from 'stable-hash'; import { assert } from 'tsafe'; export abstract class CanvasEntityAdapterBase< - T extends CanvasRenderableEntityState = CanvasRenderableEntityState, + T extends CanvasRenderableEntityState, + U extends string, > extends CanvasModuleBase { - readonly type: string; + readonly type: U; readonly id: string; readonly path: string[]; readonly manager: CanvasManager; @@ -91,7 +92,7 @@ export abstract class CanvasEntityAdapterBase< */ subscriptions = new Set<() => void>(); - constructor(entityIdentifier: CanvasEntityIdentifier, manager: CanvasManager, adapterType: string) { + constructor(entityIdentifier: CanvasEntityIdentifier, manager: CanvasManager, adapterType: U) { super(); this.type = adapterType; this.id = entityIdentifier.id; diff --git a/invokeai/frontend/web/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterControlLayer.ts b/invokeai/frontend/web/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterControlLayer.ts index 9b3b0da891..82e5466cb5 100644 --- a/invokeai/frontend/web/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterControlLayer.ts +++ b/invokeai/frontend/web/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterControlLayer.ts @@ -9,16 +9,17 @@ import type { CanvasControlLayerState, CanvasEntityIdentifier, Rect } from 'feat import type { GroupConfig } from 'konva/lib/Group'; import { omit } from 'lodash-es'; -export class CanvasEntityAdapterControlLayer extends CanvasEntityAdapterBase { - static TYPE = 'control_layer_adapter'; - +export class CanvasEntityAdapterControlLayer extends CanvasEntityAdapterBase< + CanvasControlLayerState, + 'control_layer_adapter' +> { renderer: CanvasEntityObjectRenderer; bufferRenderer: CanvasEntityBufferObjectRenderer; transformer: CanvasEntityTransformer; filterer: CanvasEntityFilterer; constructor(entityIdentifier: CanvasEntityIdentifier<'control_layer'>, manager: CanvasManager) { - super(entityIdentifier, manager, CanvasEntityAdapterControlLayer.TYPE); + super(entityIdentifier, manager, 'control_layer_adapter'); this.renderer = new CanvasEntityObjectRenderer(this); this.bufferRenderer = new CanvasEntityBufferObjectRenderer(this); diff --git a/invokeai/frontend/web/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterInpaintMask.ts b/invokeai/frontend/web/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterInpaintMask.ts index 5736186aec..ec4c737bec 100644 --- a/invokeai/frontend/web/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterInpaintMask.ts +++ b/invokeai/frontend/web/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterInpaintMask.ts @@ -8,16 +8,17 @@ import type { CanvasEntityIdentifier, CanvasInpaintMaskState, Rect } from 'featu import type { GroupConfig } from 'konva/lib/Group'; import { omit } from 'lodash-es'; -export class CanvasEntityAdapterInpaintMask extends CanvasEntityAdapterBase { - static TYPE = 'inpaint_mask_adapter'; - +export class CanvasEntityAdapterInpaintMask extends CanvasEntityAdapterBase< + CanvasInpaintMaskState, + 'inpaint_mask_adapter' +> { renderer: CanvasEntityObjectRenderer; bufferRenderer: CanvasEntityBufferObjectRenderer; transformer: CanvasEntityTransformer; filterer = undefined; constructor(entityIdentifier: CanvasEntityIdentifier<'inpaint_mask'>, manager: CanvasManager) { - super(entityIdentifier, manager, CanvasEntityAdapterInpaintMask.TYPE); + super(entityIdentifier, manager, 'inpaint_mask_adapter'); this.renderer = new CanvasEntityObjectRenderer(this); this.bufferRenderer = new CanvasEntityBufferObjectRenderer(this); diff --git a/invokeai/frontend/web/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterRasterLayer.ts b/invokeai/frontend/web/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterRasterLayer.ts index 71d7914489..888dbb31f4 100644 --- a/invokeai/frontend/web/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterRasterLayer.ts +++ b/invokeai/frontend/web/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterRasterLayer.ts @@ -9,16 +9,17 @@ import type { CanvasEntityIdentifier, CanvasRasterLayerState, Rect } from 'featu import type { GroupConfig } from 'konva/lib/Group'; import { omit } from 'lodash-es'; -export class CanvasEntityAdapterRasterLayer extends CanvasEntityAdapterBase { - static TYPE = 'raster_layer_adapter'; - +export class CanvasEntityAdapterRasterLayer extends CanvasEntityAdapterBase< + CanvasRasterLayerState, + 'raster_layer_adapter' +> { renderer: CanvasEntityObjectRenderer; bufferRenderer: CanvasEntityBufferObjectRenderer; transformer: CanvasEntityTransformer; filterer: CanvasEntityFilterer; constructor(entityIdentifier: CanvasEntityIdentifier<'raster_layer'>, manager: CanvasManager) { - super(entityIdentifier, manager, CanvasEntityAdapterRasterLayer.TYPE); + super(entityIdentifier, manager, 'raster_layer_adapter'); this.renderer = new CanvasEntityObjectRenderer(this); this.bufferRenderer = new CanvasEntityBufferObjectRenderer(this); diff --git a/invokeai/frontend/web/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterRegionalGuidance.ts b/invokeai/frontend/web/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterRegionalGuidance.ts index 00a4eaa26e..188146b829 100644 --- a/invokeai/frontend/web/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterRegionalGuidance.ts +++ b/invokeai/frontend/web/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterRegionalGuidance.ts @@ -8,16 +8,17 @@ import type { CanvasEntityIdentifier, CanvasRegionalGuidanceState, Rect } from ' import type { GroupConfig } from 'konva/lib/Group'; import { omit } from 'lodash-es'; -export class CanvasEntityAdapterRegionalGuidance extends CanvasEntityAdapterBase { - static TYPE = 'regional_guidance_adapter'; - +export class CanvasEntityAdapterRegionalGuidance extends CanvasEntityAdapterBase< + CanvasRegionalGuidanceState, + 'regional_guidance_adapter' +> { renderer: CanvasEntityObjectRenderer; bufferRenderer: CanvasEntityBufferObjectRenderer; transformer: CanvasEntityTransformer; filterer = undefined; constructor(entityIdentifier: CanvasEntityIdentifier<'regional_guidance'>, manager: CanvasManager) { - super(entityIdentifier, manager, CanvasEntityAdapterRegionalGuidance.TYPE); + super(entityIdentifier, manager, 'regional_guidance_adapter'); this.renderer = new CanvasEntityObjectRenderer(this); this.bufferRenderer = new CanvasEntityBufferObjectRenderer(this);