Handlebars.js: 打字稿类型:`knownHelpers` 不允许自定义助手

创建于 2019-08-28  ·  4评论  ·  资料来源: handlebars-lang/handlebars.js

在提交问题之前,请先检查以下几点:

这可能会帮助您更快地获得解决方案。
对于错误,拥有一个测试用例失败的 PR 会很棒。


目前Handlebar 的打字稿定义不允许在knownHelper选项上指定自定义帮助程序。

因此,要将knownHelpersOnly选项与自定义助手一起使用,您必须强制转换knownHelpers以绕过打字稿检查;

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);

产生的错误(不使用unknown强制转换)如下:

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; }'.

CompilerOptions不应该有以下定义吗?:

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

(我没有得到什么吗?如果这是正确的解决方案,我愿意发送 PR)

所有4条评论

谢谢你的报价。 我推了一个稍微不同的修复。 我认为为了在 IDE 中为内置助手获得正确的自动完成,最好保留内置名称,但仍然允许任何其他名称。

感谢您的快速修复! 会在哪个版本发布?

下一个补丁版本。 我在想什么是做这件事的好时机。 我计划在周二发布下一个版本。

4.2.0 发布

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

asgraf picture asgraf  ·  5评论

jlubean picture jlubean  ·  8评论

rizen picture rizen  ·  6评论

stevenvachon picture stevenvachon  ·  7评论

jasonh-brimar picture jasonh-brimar  ·  6评论