Helper and Modifier Signatures

Like components, helpers and modifiers can also have their behavior in templates described by a Signature type.

Helpers

A helper signature has two keys: Args and Return. The Args key is further broken down into Named and Positional elements, representing respectively the expected types of the named and positional arguments your helper expects to receive.

import Helper from '@ember/component/helper';

type Positional = Array<number>;
type Named = { andThenMultiplyBy?: number };

export interface AddSignature {
  Args: {
    Positional: Positional;
    Named: Named;
  };
  Return: number;
}

export default class AddHelper extends Helper<AddSignature> {
  public compute(values: Positional, named: Named): number {
    let total = values.reduce((sum, next) => sum + next, 0);
    if (typeof named.andThenMultiplyBy === 'number') {
      total *= named.andThenMultiplyBy;
    }
    return total;
  }
}

Modifiers

A modifier's Args are split into Named and Positional as with helpers, but unlike helpers they have no Return, since modifiers don't return a value. Their signtures can, however, specify the type of DOM Element they are compatible with.

import Modifier from 'ember-modifier';
import { renderToCanvas, VertexArray, RenderOptions } from 'neat-webgl-library';

type Positional = [model: VertexArray];

export interface Render3DModelSignature {
  Element: HTMLCanvasElement;
  Args: {
    Positional: Positional;
    Named: RenderOptions;
  };
}

export default class Render3DModel extends Modifier<Render3DModelSignature> {
  modify(element: HTMLCanvasElement, [model]: Positional, named: RenderOptions) {
    renderToCanvas(element, model, options);
  }
}

Last updated