build: Enable TypeScript type checking#7680
Conversation
| var constants = require('./constants'); | ||
| var overrideAll = require('../../plot_api/edit_types').overrideAll; | ||
| var sortObjectKeys = require('../../lib/sort_object_keys'); | ||
| var sortObjectKeys = require('../../lib/sort_object_keys').default; |
There was a problem hiding this comment.
@camdecoster Is it worth considering moving away from default exports entirely as part of this transition?
There was a problem hiding this comment.
It only matters when one mixes CJS and ESM. That said, I don't think that we can avoid that for a long time. I suppose we could make just pick a direction to go and standardize. I could go either way, but the esbuild docs make it clear that they don't like default exports.
| fillcolor?: string; | ||
| line?: Partial<Line>; | ||
| marker?: Partial<Marker>; | ||
| mode?: 'lines' | 'markers' | 'lines+markers' | 'none' | 'text' | 'lines+text' | 'markers+text' | 'lines+markers+text'; |
There was a problem hiding this comment.
Does TypeScript have any support for 'flag list'-type string values such as this, where the string may consist of any number of a fixed set of values joined by a delimiter? I suppose not as it's fairly custom.
Otherwise could we use a custom type or a custom function to generate these lists of allowed values based on the flags?
There was a problem hiding this comment.
Yes, it's called a union type. What's shown on 133 is an example of that (though it's only used on that line). If we needed that type elsewhere, we could define it separately and reference it within the ScatterTrace type like this:
type Mode = 'lines' | 'markers' | 'lines+markers' | 'none' | 'text' | 'lines+text' | 'markers+text' | 'lines+markers+text';
export interface ScatterTrace extends TraceBase {
...,
mode: Mode;
...,
}There was a problem hiding this comment.
Yeah I guess I'm imagining something like a helper function which looks like flagList(flaglistVals, otherVals) such that
flaglistVals(['lines', 'markers', 'text'], ['none'])
returns
'lines' | 'markers' | 'lines+markers' | 'none' | 'text' | 'lines+text' | 'markers+text' | 'lines+markers+text';`
| * Use specific trace types when available | ||
| */ | ||
| export interface GenericTrace extends TraceBase { | ||
| x?: any[]; |
There was a problem hiding this comment.
I'm not sure there are any traces where x/y/z are allowed to be a type other than number[] | string[] but I could be wrong about that.
There was a problem hiding this comment.
That's why it's permissive here. Once we become sure, we can change this as you suggest.
There was a problem hiding this comment.
In this case maybe it would be easier to start stricter and loosen if needed?
|
@camdecoster Can you add a type-check step to the CI? |
| yaxis?: Partial<LayoutAxis>; | ||
|
|
||
| // Multiple axes support (xaxis2, yaxis3, etc.) | ||
| [key: string]: any; |
There was a problem hiding this comment.
Can we tighten this layout spec here to match the plot schema?
|
@camdecoster Some initial thoughts on organization of the types: For types corresponding directly to the schema:
|
codeCraft-Ritik
left a comment
There was a problem hiding this comment.
Great work! The implementation is clean and easy to understand
2439dad to
de168ca
Compare
| If the hand-written type was richer than the schema (e.g. used a narrowed | ||
| union where the schema says `string`), document the gap in a comment or | ||
| file an issue. Do not silently lose ergonomics — either improve the schema | ||
| (add `values: [...]`) or layer a hand-written refinement on top. |
There was a problem hiding this comment.
or layer a hand-written refinement on top
I'm not sure there's really a clean way to do this using the proposed architecture
There was a problem hiding this comment.
You could extend the generated type with the additional information without too much trouble. The clunky part would be the naming. For ModeBar, you could generate ModeBarGenerated then extend it as ModeBar. Not ideal, but it would work.
There was a problem hiding this comment.
@camdecoster As far as I can tell, the attributes defined in src/plots/attributes.js are additionally added to every trace type, so that probably needs to be accounted for in the type gen. (Unless it doesn't matter if some attributes are missing, I'm not sure what the consequences of that are)
…escript-type-checking
Description
Enable TypeScript type checking.
Closes #7678.
Changes
attributes filesschemaTesting
npm run buildlocally to check that everything is bundled properly by esbuildnpm run schemato recreate the generated typesnpm run typecheckto perform a type check on the source code. There should be no errors:Notes
npm run typecheck. VS Code will also provide feedback as you're editing files.TS is not emitting files/types right now. esbuild handles converting the TS so the TS compiler won't need to do that. It would be valuable to have the compiler write the type definition files in the future.