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.
This commit is contained in:
psychedelicious
2024-09-11 19:25:10 +10:00
committed by Kent Keirsey
parent ff94146ee8
commit bb2db3d6c3
5 changed files with 24 additions and 19 deletions

View File

@@ -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<T['type']>, manager: CanvasManager, adapterType: string) {
constructor(entityIdentifier: CanvasEntityIdentifier<T['type']>, manager: CanvasManager, adapterType: U) {
super();
this.type = adapterType;
this.id = entityIdentifier.id;

View File

@@ -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<CanvasControlLayerState> {
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);

View File

@@ -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<CanvasInpaintMaskState> {
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);

View File

@@ -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<CanvasRasterLayerState> {
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);

View File

@@ -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<CanvasRegionalGuidanceState> {
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);