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