I've started using TypeScript recently and I wanted to interact with FlotCharts. I had two questions on my mind:
- How does non TypeScript library interact with TypeScript app?
- How do I use FlotCharts now? Has the interface completely changed?
Step 1:
Get the FlotChart Type definition file. You can do this via NuGet by invoking this command:
Install-Package flot.TypeScript.DefinitelyTyped.
Type definition file is just an interface that is used to interact with the native JavaScript code.
Step 2:
Get the actual FlotCharts library. You can do this via NuGet by invoking this command:
Install-Package flot
Step 3:
Check your "Scripts" folder structure, it should look something like this:
Step 4:
Take a look at the query.flot interfaces, they can be found here: Scripts/Typings/flot/jquery.flot.d.
Step 5 - Implementation:
Explicit Approach
If you are a strong type purist you can go all the way and actually implement the defined interfaces like so:
class DataSeries implements jquery.flot.dataSeries { label: string; data: Array<Array<number>> = new Array<Array<number>>(); constructor(label: string, data: Array<Array<number>>) { this.label = label; this.data = data; } } class PlotOptions implements jquery.flot.plotOptions { grid: jquery.flot.gridOptions; constructor(grid: jquery.flot.gridOptions) { this.grid = grid; } } class GridOptions implements jquery.flot.gridOptions { show: boolean; constructor(show: boolean) { this.show = show; } }
Once you have implemented your classes, you can interact with the FlotChart library like this:
let dataSeriesA: DataSeries = new DataSeries("A", [[0, 10], [1, 20], [2, 30]]); let dataSeriesB: DataSeries = new DataSeries("B", [[0, 5], [1, 3], [2, 50]]); let plotElement: JQuery = jQuery("#plot"); jQuery.plot(plotElement, [dataSeriesA, dataSeriesB], new PlotOptions(new GridOptions(false)));
Implicit Approach
If you don't want to implement classes and just want to provide objects you can interact with the FlotChart library like this instead:
$.plot( $("#plot"), [ { label: "A", data: [[0, 10], [1, 20], [2, 30]] }, { label: "B", data: [[0, 5], [1, 3], [2, 50]] } ], { grid: { show : false } } );
Sample code
App.ts:
class DataSeries implements jquery.flot.dataSeries { label: string; data: Array<Array<number>> = new Array<Array<number>>(); constructor(label: string, data: Array<Array<number>>) { this.label = label; this.data = data; } } class PlotOptions implements jquery.flot.plotOptions { grid: jquery.flot.gridOptions; constructor(grid: jquery.flot.gridOptions) { this.grid = grid; } } class GridOptions implements jquery.flot.gridOptions { show: boolean; constructor(show: boolean) { this.show = show; } } function explicit() { let dataSeriesA: DataSeries = new DataSeries("A", [[0, 10], [1, 20], [2, 30]]); let dataSeriesB: DataSeries = new DataSeries("B", [[0, 5], [1, 3], [2, 50]]); let plotElement: JQuery = jQuery("#plotE"); jQuery.plot(plotElement, [dataSeriesA, dataSeriesB], new PlotOptions(new GridOptions(false))); } function implicit() { $.plot( $("#plotI"), [ { label: "A", data: [[0, 10], [1, 20], [2, 30]] }, { label: "B", data: [[0, 5], [1, 3], [2, 50]] } ], { grid: { show : false } } ); } window.onload = () => { explicit(); implicit(); };
Index.html:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <title>TypeScript With Flot Demo</title> <script src="Scripts/jquery-1.4.1.js"></script> <script src="Scripts/flot/jquery.flot.js"></script> <script src="app.js"></script> </head> <body> <h1>TypeScript with Flot demo</h1> <div class="plot-container"> <div id="plotE" style="width:500px;height:500px;"></div> <div id="plotI" style="width:500px;height:500px;"></div> </div> </body> </html>
Summary:
- TypeScript apps interact with non TypeScript libraries through definition files.
- Library interfaces remain mostly the same.
- You can interface explicitly by actually implementing reusable classes or implicitly by using objects.
Useful links:
*Note: Code in this article is not production ready and is used for prototyping purposes only. If you have suggestions or feedback please do comment.
No comments:
Post a Comment