Types: `scale.title` does not exist when a `legend` `onClick` handler is specified
- Dominant language
- JavaScript
- Stars
- 67.7k
- Forks
- 11.9k
- Avg merge
- 7h 39m
- Merged PRs (30d)
- 5
Description
### Expected behavior
After creating a `Chart`, I want to update its colors dynamically. I understand that I can't directly say `chart.options.scales.x.title.color` because the properties starting with `scales` are optional. However, I expect to be able to test `chart.options.scales?.x?.title?.color === undefined`, and if that's `false`, TypeScript should allow me to assign a new color to `chart.options.scales.x.title.color`.
### Current behavior
Under certain conditions, TypeScript 4.7.4 emits an error when I try to access `title`:
```
Property 'title' does not exist on type '_DeepPartialObject<{ type: "linear"; } & CartesianScaleOptions & { beginAtZero: boolean; suggestedMin?: number | undefined; suggestedMax?: number | undefined; grace?: string | number | undefined; ticks: { ...; }; }> | ... 4 more ... | _DeepPartialObject<...>'.
Property 'title' does not exist on type '_DeepPartialObject<{ type: "radialLinear"; } & CoreScaleOptions & { animate: boolean; startAngle: number; angleLines: { display: boolean; color: Scriptable; lineWidth: Scriptable<...>; borderDash: Scriptable<...>; borderDashOffset: Scriptable<...>; }; ... 7 more ...; ticks: RadialTickO...'.
```
The conditions appear to be:
* A `legend` `onClick` handler is specified.
* The error goes away if I change the handler's third parameter from `LegendElement` to `any`.
* The error goes away if I omit the handler entirely.
* The error never happens with `ticks`, only with `title`. I am not sure why `title` is special.
### Reproducible sample
https://www.typescriptlang.org/play?#code/JYWwDg9gTgLgBAbzgYQBYENYBoUdgUQDcBTAOxhzUxgBUBPMYnAGWIHMyATfAG2JDIU4rDqU4BJGPxxR2wAM5So6AEZ95cAL5wAZlAgg4AcgDGeGADoAVvKMBuALAAoKrAuy2CpQAoLfj17EymrE8gCUjk7OOgCupCYwwBCkcHyinAD6JjzAJgDWGRhifFDeGcQk5ABcuNREgjgZaVwZwFIgNSJcktJwTexcnQNivPyCADyutAzEAHxhiJrOzibJinCK6DAx8lnmcAC8cKTEAO61sN5Gm9vyU0Y4CM5wL3AwMzVGOScPz6+cW3QNSeTleYLgAJg6HkxBg8hqAG0-uDwSCUej-oDEciMbikAAPGoARgADDg6DUACxaLA43Hogk1ABMZLgFLgAE4aXT6ai4IS4ABmVnsokANm5oN5YIAurSpdKXjxVMQeJ8TFtbPLpZptei5TjdTiIGBEmtgTyXmAeDFPKR4YhLeDmmILQrFclkDl8jUXZlsrkCkVOCU9fSje6wRGMfINeo3dKBWjFS93oxPt9iJgjHBoXBVvaKE6MYkYHwEynwaseNBPgBiQWNpu-SOVzgKa3odkwKAxJjF3lSfEwT4CCCnFuVyVTxL5B3Jqcvau14wNpuNyeV6O87f09kIXfgw8RzQRZZOAvrWPoPiHDZQ257agWE1m+0Wa-qAD8FnxkWcwA6HA3ifsQhwHEccScMQOjACcnBwAAPohGxxsQFilreEGQWIMFwcQCHIahN7obOeQaNhcBQXh8ELAubyoPo5wnOc+BQPopRGAA6gA8jxABiRhnk4SxRE4oEYW0fAWMuUB3kYdb8fxJIqSS9jOBJZHyDJEA1nJRwKapJJKepYk3DsT5uDEYCQsQ3jCUAA
### Optional extra steps/info to reproduce
Here's a CodePen (with TypeScript types commented out), showing that this works at runtime: https://codepen.io/StephanTLavavej/pen/GRxKJgz
TypeScript examples:
* [original repro with error](https://www.typescriptlang.org/play?#code/JYWwDg9gTgLgBAbzgYQBYENYBoUdgUQDcBTAOxhzUxgBUBPMYnAGWIHMyATfAG2JDIU4rDqU4BJGPxxR2wAM5So6AEZ95cAL5wAZlAgg4AcgDGeGADoAVvKMBuALAAoKrAuy2CpQAoLfj17EymrE8gCUjk7OOgCupCYwwBCkcHyinAD6JjzAJgDWGRhifFDeGcQk5ABcuNREgjgZaVwZwFIgNSJcktJwTexcnQNivPyCADyutAzEAHxhiJrOzibJinCK6DAx8lnmcAC8cKTEAO61sN5Gm9vyU0Y4CM5wL3AwMzVGOScPz6+cW3QNSeTleYLgAJg6HkxBg8hqAG0-uDwSCUej-oDEciMbikAAPGoARgADDg6DUACxaLA43Hogk1ABMZLgFLgAE4aXT6ai4IS4ABmVnsokANm5oN5YIAurSpdKXjxVMQeJ8TFtbPLpZptei5TjdTiIGBEmtgTyXmAeDFPKR4YhLeDmmILQrFclkDl8jUXZlsrkCkVOCU9fSje6wRGMfINeo3dKBWjFS93oxPt9iJgjHBoXBVvaKE6MYkYHwEynwaseNBPgBiQWNpu-SOVzgKa3odkwKAxJjF3lSfEwT4CCCnFuVyVTxL5B3Jqcvau14wNpuNyeV6O87f09kIXfgw8RzQRZZOAvrWPoPiHDZQ257agWE1m+0Wa-qAD8FnxkWcwA6HA3ifsQhwHEccScMQOjACcnBwAAPohGxxsQFilreEGQWIMFwcQCHIahN7obOeQaNhcBQXh8ELAubyoPo5wnOc+BQPopRGAA6gA8jxABiRhnk4SxRE4oEYW0fAWMuUB3kYdb8fxJIqSS9jOBJZHyDJEA1nJRwKapJJKepYk3DsT5uDEYCQsQ3jCUAA)
* [error vanishes if handler's third parameter is `any`](https://www.typescriptlang.org/play?#code/JYWwDg9gTgLgBAbzgYQBYENYBoUdgUQDcBTAOxhwHoAqNTGAFQE8xicAZYgczIBN8ANsRBkK1SnE49SvAJIxhOKN2ABnBVHQAjIargBfOADMoEEHADkAYzwwAdACtVFgNwBYAFB1Yd5VzUaABR2IX4BxJo6xKoAlO4enkYArqRWMMAQpHBC0rwA+lYCwFYA1nkYMkJQgXnEJOQAXLj0RKI4eTl8ecAKIE1SfPKKcB3cfE3opExwNMgAEgCCAHIA4vgAIuIxiPqenlaZ6nDq6DBJqgW2cAC8cKTEAO7NsIEWJ2eq3jAWOAiecAC4DAWMQmhYivcfv9AbxTugmn8PIDkXBYTB0KpiDBVE0ANrQlEoxGEkkwuF4gmkqlIAAeTQAjAAGHBMJoAFgMWEpVJJtKaACZmXBWXAAJyc7k8olwOlwADMQpF9IAbBKkVLkQBdLnqjUAgTaYgCMFWU7OHUa-QWknaylWykQMDpQ4IyUAsACJL+Ug4xBulGdGSu3V6zLIIqlJqB-KFYplCq8KrWnn2kPI1Ok1Sm3TBjWy4l6gHA1hgiHETAWOAYuAHH0Uf2k9IwIS5wsog4CaBggDEcr7-ahabbvDUHvQIpgUCSbAbUoUNJgYJEEAeg7bavX6VKvoL64BHa7ll7-b7a7bGalF55IoQV5Rd9T+jiew8taOWfQQhux3RH0u9DsR1nR9OwP10AB+OwaXiTxgCMOBAjA4gbmuW4Ul4YgjGAe5eDgAAfPDjmzYg7CbL9ULQmRMOw4hcIIojPxIrcSj0Ci4HQ6icO2XcgVQUwnnuJ58CgUxqgsAB1AB5SSADELGfDxdgSDwkNInohDsA8oG-CxuxkmTGUMxlXE8VTmNUTSIE7bTbl0ozGX0kzlPec5-x8JIwDRYhAgUoA)
* [error vanishes if handler is removed entirely](https://www.typescriptlang.org/play?#code/JYWwDg9gTgLgBAbzgYQBYENYBo4HoBUamMAogG4CmAdjDkbACoCeYFOAMhQObUAmJAGwohqtOJx5VeASRjCs+XHCjdgAZzlR0AIyFq4AXzgAzKBBBwA5AGMMsAHQArNZYDcAWABQ9GPZVd1TQAKe1D-QIotXQo1AEoPTy9cJQAlEgBZAHkANRIAETghSV4AfWsBYGsAaxKMKSEoLy9rCCoNOA10GABXNTK7eABeOCoKAHcUAaDLTp61H0scBC84VbgYFgoALisK0cWVtd4u9B3lzzXLuGOYdDUKGDUdgG1Dq6vz96+jk5e374BSAAHjsAIwABhwTB2ABZDFh-gCvsCdgAmSFwaFwACc8MRSI+cBBcAAzBisaCAGx4i4Ey4AXQRtLpqwEOgoAh2Ni6LiZdIMfK+jP+Av+EDAMGArSeiHxqzAAm6ATaZzlVyKfFVzJZyTgrWQFWqOw1UjKhpqdV4DUFSNF2sudu+ams6D0WrpxM+LNWG1YXL2FEwljgdzgLTatDV30lMCE7u9VxaAmgXIAxCSM5mDvaE7x1Ar0FiYFBumwowS5ECYFyRBAxtmEzTG5LqjKvY3VkmU1Z05mMw2E46CUOkViECOrhO7QZ4k1POH2s7XRQ4MNZr1+sR7OLJdL7Eu9AB+exAhJeYDGOBBA8rwZ3uDdKQUYzAUa8OAAHw-HRdQnsMaEVd70fXhn1fCh3y-H9l3-Soqn0O9hhAsC31iWVtRgVAzAmUYJhIKAzCgaYAHVMkyAAxSxZ08Aw5xvWDYwoewuygVce3I8jwS48E3C8eiW3g5iIGTVjhksVNuPBDjeMSTx1z6Wwt26MAbgoIJqKAA)
### Possible solution
_No response_
### Context
I'm implementing dark mode for the microsoft/STL Status Chart at https://microsoft.github.io/STL/ . I converted it to use TypeScript a couple of months ago, but haven't tried to change colors dynamically until now.
### chart.js version
v3.8.0
### Browser name and version
Chrome 103.0.5060.53
### Link to your project
_No response_
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.