swimlane / ngx-charts

:bar_chart: Declarative Charting Framework for Angular

Home Page:https://swimlane.github.io/ngx-charts/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

`LegendPosition` enum break template type checks

kschaefe opened this issue · comments

Describe the bug
Angular's fullTemplateTypeCheck wants the passed type of LegendPosition to be a value from the enum. Passing in the string that represents that value causes the compiler to reject the string. You have the

To Reproduce
Manually set the LegendPosition to a string, such as right or below and compile with fullTemplateTypeCheck. You'll get an error like

Building Angular Package

------------------------------------------------------------------------------
Building entry point 'livelab'
------------------------------------------------------------------------------
✖ Compiling with Angular sources in Ivy partial compilation mode.
projects/livelab/src/lib/student-details/livelab-student-details.component.html:127:49 - error TS2322: Type '"below"' is not assignable to type 'LegendPosition'.

127             [legend]="true" [legendTitle]="''" [legendPosition]="'below'" [yScaleMax]="yScaleMax" [yScaleMin]="0"
                                                    ~~~~~~~~~~~~~~

  projects/livelab/src/lib/student-details/livelab-student-details.component.ts:33:16
    33   templateUrl: "./livelab-student-details.component.html",
                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Error occurs in the template of component LivelabStudentDetailsComponent.

Expected behavior
Unfortunately, this is the expected behavior because enums are bad. You want, per your documentation, that value to be a string, but it's not. The source code should be:

export type LegendPosition = 'right' | 'below';

ngx-charts version
Present on any version that uses LegendPosition enum. Experienced on 20.5.0.

Additional context
You can work around this issue using Angular's $any(), but then why enable strict type checking?

Ideally, you'd similarly convert any other enums to a union of string literals, which is almost always better anyway. I, however, only attempted to use this enum.