Skip to content

TypeScript Examples

Ghislain B. edited this page Aug 8, 2024 · 6 revisions

Basic Example

Below is a very basic example when using TypeScript

1. Let's first create a div element that will hold our grid

For the grid to work, it has to have a defined height OR you could also use the autoHeight grid option

note: be aware that the autoHeight disables the Virtual Scroll which can be a problem with large dataset, you typically want to use this option with small dataset only

 <div id="myGrid" class="slick-container alpine-theme" style="width:100%; height:500px;"></div>
2. Second, let's create and initialize the grid

Create the grid and reference the div (#myGrid in our use case) and again make sure that your grid has a defined height (by either a height on your div OR use the autoHeight grid option)

// example.ts (TypeScript file)
import { Column, GridOption, SlickDataView, SlickGrid } from 'slickgrid';

let data: any[] = [];
let columns: Column[] = [{ id: 'firstName', name: 'First Name', field: 'firstName' }, /* ... */ ];
let options: GridOption = { enableCellNavigation: true, /* ... */ };

let grid = new SlickGrid('#myGrid', data, columns, options);

// or similarly for DataView
let dataView = new SlickDataView({ inlineFilter: true });
let grid = new SlickGrid('#myGrid', dataView, columns, options);

Basic Example with data interface

You could also make it better by providing data types via TypeScript Generics on the SlickGrid class, so that any SlickGrid/SlickDataView will now be typed when retrieving any data context, i.e. grid.getDataItem(0) will be inferred as a User type

// example.ts (TypeScript file)
import { Column, GridOption, SlickDataView, SlickGrid } from 'slickgrid';

interface User {
  id: string;
  firstName: string;
  lastName: string;
  age?: number;
}
let data: User[] = [];
let columns: Column[] = [{ id: 'firstName', name: 'First Name', field: 'firstName' }, /* ... */ ];
let options: GridOption = { enableCellNavigation: true, /* ... */ };

let grid = new SlickGrid<User>('#myGrid', data, columns, options);
const item = grid.getDataItem(0); // inferred as a User type

// or similarly when using a DataView
let dataView = new SlickDataView<User>({ inlineFilter: true });
let grid = new SlickGrid<User>('#myGrid', dataView, columns, options);
const item = dataView.getItemByIdx(0); // inferred as a User type

Most exports start with the Slick prefix with some exceptions

All core, controls and plugins files are exported with the Slick prefix (i.e. SlickGrid, SlickDataView, SlickColumnPicker, ...) with some exceptions (Aggregators, Editors, Formatters and all enums like ColAutosizeMode, RowSelectionMode, ...)

For example

import {
  // all Grouping stuffs are without the `Slick` prefix
  Aggregators,
  Editors,
  Formatters,

  // all enums/types are also without the `Slick` prefix
  ColAutosizeMode, 
  RowSelectionMode,
  Utils,

  // everything else... that is all core, controls & plugins starts with `Slick` prefix
  SlickGlobalEditorLock,
  SlickRowSelectionModel,
  SlickColumnPicker,
  SlickDataView,
  SlickGridPager,
  SlickGrid,
} from 'slickgrid';

TypeScript Extendable

Since we now use TypeScript, we can also get extra features for free, because we now have Types (interfaces, enums, types, ...), Generics and it's even easily extendable as shown below.

SlickGrid & SlickDataView Generics

We added optional TS Generics to provide item data context interface on the SlickGrid and/or SlickDataView so that you can call any methods from them and automatically get the associated item interface types for them.

import { SlickGrid, SlickDataView } from 'slickgrid';

interface User {
  firstName: string;
  lastName: string;
  age: number;
}
// Generics on SlickGrid
const grid = new SlickGrid<User>('#myGrid', data, columns, options);
const item = grid.getDataItem(0); // item will be User TS type

// or Generics on SlickDataView
const dataView = new SlickDataView<User>();
const grid = new SlickGrid('#myGrid', dataView, columns, options);
const item = dataView.getItemByIdx(0); // item will be User TS type

The SlickGrid class actually has 3 optional Generics, but you will rarely use the last 2. The 1st Generic is the item type (as shown above), the 2nd is if you want to extend the Column interface and finally the 3rd and last Generic is if you want to extend the GridOption interface (these extra Generics were mainly added for Slickgrid-Universal since that library also has extra Column & GridOption properties)

Class extends

Since we opted to use protected (instead of private) across all our TypeScript code, it makes it easy to extends any of these TS classes whenever you wish to customize or add extra methods on any of the SlickGrid classes (not just core files but also Controls and Plugins as well).

// for example let's extend Slick DataView
import { SlickDataView } from 'slickgrid';

class CustomSlickDataView  extends SlickDataView {
  // for example let's add a custom event on the destroy method
  onDestroy = new SlickEvent();

  constructor() {
    super();
  }

  destroy() {
    super.destroy();
    this.onDestroy.notify();
  }
}

// use our new extended DataView
const dv = new CustomSlickDataView();
dv.onDestroy.subscribe(() => console.log('DataView was destroyed'));
Clone this wiki locally