Skip to content

createParameterDecorator

awekrx edited this page May 29, 2026 · 1 revision

createParameterDecorator

Import

import { createParameterDecorator } from '@dev-suite/decorators/createParameterDecorator'

Category

  • core

Use Case

Build reusable parameter decorators that transform/validate one argument.

Replaces

  • Manual parameter-index descriptor surgery
  • Repeated per-parameter plumbing

Example 1

Without decorator

function trimParam() {
  return function (target: object, key: string | symbol, index: number) {
    const descriptor = Object.getOwnPropertyDescriptor(target, key)!;
    const original = descriptor.value as (...args: unknown[]) => unknown;

    descriptor.value = function (...args: unknown[]) {
      if (typeof args[index] === 'string') args[index] = (args[index] as string).trim();
      return original.apply(this, args);
    };

    Object.defineProperty(target, key, descriptor);
  };
}

With decorator

import { createParameterDecorator } from '@dev-suite/decorators/createParameterDecorator';

const trimParam = () =>
  createParameterDecorator({
    wrap: ({ value, invoke }) => {
      const next = typeof value === 'string' ? value.trim() : value;
      return invoke(next);
    },
  });

Why better

  • Centralizes cross-cutting behavior.
  • Method/class/property code stays focused on domain logic.

Example 2

Without decorator

function requiredParam() {
  return function (target: object, key: string | symbol, index: number) {
    const descriptor = Object.getOwnPropertyDescriptor(target, key)!;
    const original = descriptor.value as (...args: unknown[]) => unknown;

    descriptor.value = function (...args: unknown[]) {
      if (args[index] == null) throw new Error('required');
      return original.apply(this, args);
    };

    Object.defineProperty(target, key, descriptor);
  };
}

With decorator

import { createParameterDecorator } from '@dev-suite/decorators/createParameterDecorator';

const requiredParam = () =>
  createParameterDecorator({
    before: ({ value }) => {
      if (value == null) throw new Error('required');
    },
  });

Why better

  • Second scenario reuses same policy without duplication.
  • Behavior is more consistent and easier to audit.

Clone this wiki locally