Handlebars.js: Typescript-Typen: `knownHelpers` lässt keine benutzerdefinierten Helfer zu

Erstellt am 28. Aug. 2019  ·  4Kommentare  ·  Quelle: handlebars-lang/handlebars.js

Bevor Sie Probleme einreichen, überprüfen Sie bitte zuerst die folgenden Punkte:

Dies wird Ihnen wahrscheinlich helfen, schneller eine Lösung zu finden.
Für Bugs wäre es toll, eine PR mit einem fehlgeschlagenen Testfall zu haben.


Derzeit erlaubt die Typescript-Definition von Handlebar keine benutzerdefinierten Helfer für die Option knownHelper anzugeben.

Um also die Option knownHelpersOnly mit benutzerdefinierten Helfern zu verwenden, müssen Sie knownHelpers umwandeln, um Typoskriptprüfungen zu umgehen;

function given(...args: any[]): string {
  const options = args.pop();

  if (options.fn) {
    let complete = true;
    const proxy = new Proxy(this, {
      get(context, prop: string): object {
        if (!(prop in context)) {
          complete = false;
        }

        return context[prop];
      },
    });

    const text = options.fn(proxy);

    return complete ? text : '';
  }

  return args.some((a: string): boolean => !a) ? '' : args.join(' ');
}

const templateOptions = {
  helpers: {
    first,
  },
};
const compilerOptions = {
  knownHelpers: { first: true } as unknown, // Without this `unknown` compilation fails
  knownHelpersOnly: true,
};

Hanblebars.compile('My nice template {{first "text"}}', compilerOptions)({}, templateOptions);

Der erzeugte Fehler (ohne Verwendung des unknown Casts) ist der folgende:

TypeScript diagnostics (customize using `[jest-config].globals.ts-jest.diagnostics` option):
    src/index.test.ts:93:41 - error TS2345: Argument of type '{ knownHelpers: { first: boolean; }; knownHelpersOnly: boolean; }' is not assignable to parameter of type 'CompileOptions'.
      Types of property 'knownHelpers' are incompatible.
        Type '{ first: boolean; }' has no properties in common with type '{ helperMissing?: boolean; blockHelperMissing?: boolean; each?: boolean; if?: boolean; unless?: boolean; with?: boolean; log?: boolean; lookup?: boolean; }'.

Sollte CompilerOptions nicht die folgende Definition haben?:

interface CompileOptions {
  data?: boolean;
  compat?: boolean;
  knownHelpers?: { [name: string]: boolean };
  knownHelpersOnly?: boolean;
  noEscape?: boolean;
  strict?: boolean;
  assumeObjects?: boolean;
  preventIndent?: boolean;
  ignoreStandalone?: boolean;
  explicitPartialContext?: boolean;
}

(Bekomme ich etwas nicht?. Ich bin bereit, die PR zu senden, wenn dies die richtige Lösung ist)

Alle 4 Kommentare

Danke für das Angebot. Ich habe eine etwas andere Lösung geschoben. Ich denke, um eine korrekte Auto-Vervollständigung für die eingebauten Helfer in IDEs zu erhalten, ist es besser, die eingebauten Namen beizubehalten, aber immer noch jeden anderen Namen zuzulassen.

Danke für die schnelle Lösung! In welcher Version wird es erscheinen?

Nächste Patch-Version. Ich überlege, was ein guter Zeitpunkt dafür wäre. Ich plane Dienstag für die nächste Veröffentlichung.

Veröffentlicht in 4.2.0

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

rizen picture rizen  ·  6Kommentare

nknapp picture nknapp  ·  3Kommentare

LengYXin picture LengYXin  ·  3Kommentare

snimavat picture snimavat  ·  5Kommentare

morgondag picture morgondag  ·  5Kommentare