glint icon indicating copy to clipboard operation
glint copied to clipboard

Narrowing `@namedArgs` does not work, but narrowing `this.args.namedArgs` does work. (@X named args are not aliased to "this.args.X" internally)

Open NullVoxPopuli opened this issue 1 year ago • 1 comments

This correctly narrows:

function isMulti(x: 'single' | 'multi' | undefined): x is 'multi' {
  return x === 'multi';
}

export class ToggleGroup<Value = any> extends Component<{
  Element: HTMLDivElement;
  Args: SingleSignature<Value>['Args'] | MultiSignature<Value>['Args'];
  Blocks: {
    default: [
      {
        Item: Item;
      },
    ];
  };
}> {
  <template>
    {{#if (isMulti this.args.type)}}
      <MultiToggleGroup @value={{this.args.value}} @onChange={{this.args.onChange}} ...attributes />
    {{else}}
      <SingleToggleGroup @value={{this.args.value}} @onChange={{this.args.onChange}} ...attributes />
    {{/if}}
  </template>
}

This does not:

function isMulti(x: 'single' | 'multi' | undefined): x is 'multi' {
  return x === 'multi';
}

export class ToggleGroup<Value = any> extends Component<{
  Element: HTMLDivElement;
  Args: SingleSignature<Value>['Args'] | MultiSignature<Value>['Args'];
  Blocks: {
    default: [
      {
        Item: Item;
      },
    ];
  };
}> {
  <template>
    {{#if (isMulti @type)}}
      <MultiToggleGroup @value={{@value}} @onChange={{@onChange}} ...attributes />
    {{else}}
      <SingleToggleGroup @value={{@value}} @onChange={{@onChange}} ...attributes />
    {{/if}}
  </template>
}

these should be equiv, but @namedArg syntax should be all that folks use, as it's consistent cross-component authoring format. this.args in templates is discouraged and Glint should not encourage it :sweat_smile:

Here is a TSPlayground showing that what I want to do (and the this.args example) works in plain TS.

NullVoxPopuli avatar Mar 19 '24 15:03 NullVoxPopuli

This triggers a failure for: https://github.com/ember-template-lint/ember-template-lint/blob/master/docs/rule/no-args-paths.md

NullVoxPopuli avatar Mar 19 '24 15:03 NullVoxPopuli