Skip to content

Commit 9ab770d

Browse files
Improve typing (plotly#354)
- turn on strictPropertyInitialization - turn on strictBindCallApply
1 parent 030d86b commit 9ab770d

File tree

11 files changed

+45
-55
lines changed

11 files changed

+45
-55
lines changed

packages/dash-table/src/core/Logger/index.ts

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,14 @@ __highlightPrefix = __isChrome;
2525
__highlightPrefix = false;
2626
/*#endif*/
2727

28-
function logFn(level: LogLevel | DebugLevel, currentLevel: LogLevel | DebugLevel): (...args: any[]) => void {
28+
type LoggerFn = (...args: any[]) => void;
29+
30+
function logFn(level: LogLevel | DebugLevel, currentLevel: LogLevel | DebugLevel): LoggerFn {
2931
if (level < currentLevel) {
3032
return () => { };
3133
}
3234

33-
let fn: any;
35+
let fn: LoggerFn;
3436
let fnStyle: string = '';
3537

3638
switch (level) {
@@ -49,6 +51,8 @@ function logFn(level: LogLevel | DebugLevel, currentLevel: LogLevel | DebugLevel
4951
fn = window.console.error;
5052
fnStyle = 'color: white; background-color: #FF0000;';
5153
break;
54+
default:
55+
throw new Error(`Unknown log ${level}`);
5256
}
5357

5458
let prefix = `${fnStyle && __highlightPrefix ? '%c' : ''}[${LogString[level].toUpperCase()}]`;
@@ -60,12 +64,12 @@ function logFn(level: LogLevel | DebugLevel, currentLevel: LogLevel | DebugLevel
6064
}
6165

6266
interface ILogger {
63-
trace: (...args: any[]) => void;
64-
info: (...args: any[]) => void;
65-
warning: (...args: any[]) => void;
66-
error: (...args: any[]) => void;
67-
fatal: (...args: any[]) => void;
68-
debug: (...args: any[]) => void;
67+
trace: LoggerFn;
68+
info: LoggerFn;
69+
warning: LoggerFn;
70+
error: LoggerFn;
71+
fatal: LoggerFn;
72+
debug: LoggerFn;
6973

7074
setDebugLevel(level: DebugLevel): void;
7175
setLogLevel(level: LogLevel): void;

packages/dash-table/src/core/Stylesheet.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class StylesheetFacade {
3838
{ rule: rules[index], index };
3939
}
4040

41-
private __stylesheet: HTMLStyleElement;
41+
private __stylesheet: HTMLStyleElement | undefined;
4242

4343
private get sheet() {
4444
return (this.__stylesheet = this.__stylesheet || (() => {

packages/dash-table/src/core/cache/memoizer.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ export default <TKey extends CacheKeyFragment[]>() => {
55
return <TEntryFn extends (...a: any[]) => any>(fn: TEntryFn) => {
66
const cache = new Map<CacheKeyFragment, any>();
77

8-
function get(...key: TKey) {
8+
function get(...key: TKey): TEntryFn {
99
const lastKey = key.slice(-1)[0];
1010

1111
const nestedCache = getCache(cache, ...key);

packages/dash-table/src/core/cache/value.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ export default <TKey extends CacheKeyFragment[]>() =>
44
<TEntry>(fn: (...a: TKey) => TEntry) => {
55
const cache = new Map<CacheKeyFragment, any>();
66

7-
function get(...key: TKey) {
7+
function get(...key: TKey): TEntry {
88
const lastKey = key.slice(-1)[0];
99

1010
const nestedCache = getCache(cache, ...key);

packages/dash-table/src/dash-table/components/ControlledTable/index.tsx

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ const DEFAULT_STYLE = {
3333
};
3434

3535
export default class ControlledTable extends PureComponent<ControlledTableProps> {
36-
private readonly stylesheet: Stylesheet;
37-
private readonly tableFn: () => JSX.Element[][];
36+
private readonly stylesheet: Stylesheet = new Stylesheet(`#${this.props.id}`);
37+
private readonly tableFn = derivedTable(() => this.props);
3838
private readonly tableStyle = derivedTableStyle();
3939

4040
private calculateTableStyle = memoizeOne((style: Partial<IStyle>) => R.mergeAll(
@@ -44,8 +44,6 @@ export default class ControlledTable extends PureComponent<ControlledTableProps>
4444
constructor(props: ControlledTableProps) {
4545
super(props);
4646

47-
this.stylesheet = new Stylesheet(`#${props.id}`);
48-
this.tableFn = derivedTable(() => this.props);
4947
this.updateStylesheet();
5048
}
5149

packages/dash-table/src/dash-table/components/Table/index.tsx

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,6 @@ import Logger from 'core/Logger';
3232
const DERIVED_REGEX = /^derived_/;
3333

3434
export default class Table extends Component<PropsWithDefaultsAndDerived, StandaloneState> {
35-
private controlled: ControlledTableProps;
36-
3735
constructor(props: PropsWithDefaultsAndDerived) {
3836
super(props);
3937

@@ -54,10 +52,10 @@ export default class Table extends Component<PropsWithDefaultsAndDerived, Standa
5452
}
5553

5654
render() {
57-
this.controlled = this.getControlledProps();
58-
this.updateDerivedProps();
55+
let controlled = this.getControlledProps();
56+
this.updateDerivedProps(controlled);
5957

60-
return (<ControlledTable {...this.controlled} />);
58+
return (<ControlledTable {...controlled} />);
6159
}
6260

6361
private getControlledProps(): ControlledTableProps {
@@ -143,7 +141,7 @@ export default class Table extends Component<PropsWithDefaultsAndDerived, Standa
143141
]);
144142
}
145143

146-
private updateDerivedProps() {
144+
private updateDerivedProps(controlled: ControlledTableProps) {
147145
const {
148146
filtering,
149147
filtering_settings,
@@ -155,7 +153,7 @@ export default class Table extends Component<PropsWithDefaultsAndDerived, Standa
155153
viewport_selected_rows,
156154
virtual,
157155
virtual_selected_rows
158-
} = this.controlled;
156+
} = controlled;
159157

160158
const viewportCached = this.viewportCache(viewport).cached;
161159
const virtualCached = this.virtualCache(virtual).cached;

packages/dash-table/src/dash-table/derived/cell/eventHandler.ts

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ import valueCache from 'core/cache/value';
33
import { ICellFactoryProps } from 'dash-table/components/Table/props';
44
import { handleChange, handleClick, handleDoubleClick, handleOnMouseUp, handlePaste } from 'dash-table/handlers/cellEvents';
55

6-
type CacheArgs = [Handler, number, number];
7-
86
export enum Handler {
97
Change = 'change',
108
Click = 'click',
@@ -13,32 +11,32 @@ export enum Handler {
1311
Paste = 'paste'
1412
}
1513

16-
export type CacheFn = (...args: CacheArgs) => Function;
17-
export type HandlerFn = (...args: any[]) => any;
18-
1914
export default (propsFn: () => ICellFactoryProps) => new EventHandler(propsFn).get;
2015

2116
class EventHandler {
2217
constructor(private readonly propsFn: () => ICellFactoryProps) {
2318

2419
}
2520

26-
private readonly handlers = new Map<Handler, HandlerFn>([
27-
[Handler.Change, handleChange.bind(undefined, this.propsFn)],
28-
[Handler.Click, handleClick.bind(undefined, this.propsFn)],
29-
[Handler.DoubleClick, handleDoubleClick.bind(undefined, this.propsFn)],
30-
[Handler.MouseUp, handleOnMouseUp.bind(undefined, this.propsFn)],
31-
[Handler.Paste, handlePaste.bind(undefined, this.propsFn)]
32-
]);
33-
3421
private readonly cache = valueCache<[Handler, number, number]>()((
3522
handler: Handler,
3623
columnIndex: number,
3724
rowIndex: number
3825
) => {
39-
let handlerFn = this.handlers.get(handler);
40-
41-
return handlerFn && handlerFn.bind(undefined, rowIndex, columnIndex);
26+
switch (handler) {
27+
case Handler.Change:
28+
return handleChange.bind(undefined, this.propsFn, rowIndex, columnIndex);
29+
case Handler.Click:
30+
return handleClick.bind(undefined, this.propsFn, rowIndex, columnIndex);
31+
case Handler.DoubleClick:
32+
return handleDoubleClick.bind(undefined, this.propsFn, rowIndex, columnIndex);
33+
case Handler.MouseUp:
34+
return handleOnMouseUp.bind(undefined, this.propsFn, rowIndex, columnIndex);
35+
case Handler.Paste:
36+
return handlePaste.bind(undefined, this.propsFn, rowIndex, columnIndex);
37+
default:
38+
throw new Error(`unexpected handler ${handler}`);
39+
}
4240
});
4341

4442
get = (

packages/dash-table/src/dash-table/derived/cell/eventHandlerProps.ts

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
import {
32
ChangeEvent,
43
ClipboardEvent,
@@ -9,33 +8,25 @@ import { memoizeOneFactory } from 'core/memoizer';
98
import { ICellFactoryProps } from 'dash-table/components/Table/props';
109
import cellEventHandler, { Handler } from 'dash-table/derived/cell/eventHandler';
1110

12-
type CacheArgs = [number, number];
13-
14-
export type CacheFn = (...args: CacheArgs) => {
11+
interface IFunctionCache {
1512
onChange: (e: ChangeEvent) => void;
1613
onClick: (e: MouseEvent) => void;
1714
onDoubleClick: (e: MouseEvent) => void;
1815
onMouseUp: (e: MouseEvent) => void;
1916
onPaste: (e: ClipboardEvent<Element>) => void;
20-
};
21-
export type HandlerFn = (...args: any[]) => any;
17+
}
2218

23-
const getter = (propsFn: () => ICellFactoryProps): CacheFn => {
19+
const getter = (propsFn: () => ICellFactoryProps) => {
2420
const derivedHandlers = cellEventHandler(propsFn);
2521

26-
return (...args: CacheArgs) => {
27-
const [
28-
rowIndex,
29-
columnIndex
30-
] = args;
31-
22+
return (rowIndex: number, columnIndex: number): IFunctionCache => {
3223
return {
3324
onChange: derivedHandlers(Handler.Change, columnIndex, rowIndex),
3425
onClick: derivedHandlers(Handler.Click, columnIndex, rowIndex),
3526
onDoubleClick: derivedHandlers(Handler.DoubleClick, columnIndex, rowIndex),
3627
onMouseUp: derivedHandlers(Handler.MouseUp, columnIndex, rowIndex),
3728
onPaste: derivedHandlers(Handler.Paste, columnIndex, rowIndex)
38-
} as any;
29+
};
3930
};
4031
};
4132

packages/dash-table/src/dash-table/derived/table/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ function getter(
5858
return cells;
5959
}
6060

61-
export default (propsFn: () => ControlledTableProps): (() => JSX.Element[][]) => {
61+
export default (propsFn: () => ControlledTableProps) => {
6262
const cellFactory = new CellFactory(propsFn);
6363
const filterFactory = new FilterFactory(() => filterPropsFn(propsFn));
6464
const headerFactory = new HeaderFactory(propsFn);

packages/dash-table/src/dash-table/handlers/cellEvents.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,6 @@ export const handleOnMouseUp = (propsFn: () => ICellFactoryProps, idx: number, i
133133
}
134134
};
135135

136-
export const handlePaste = (_propsFn: () => ICellFactoryProps, _idx: number, _i: number, e: ClipboardEvent) => {
136+
export const handlePaste = (_propsFn: () => ICellFactoryProps, _idx: number, _i: number, e: any) => {
137137
e.preventDefault();
138138
};

packages/dash-table/tsconfig.base.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,9 @@
1313
"noUnusedParameters": true,
1414
"sourceMap": false,
1515
"strict": true,
16+
"strictBindCallApply": true,
1617
"strictNullChecks": true,
17-
"strictPropertyInitialization": false,
18+
"strictPropertyInitialization": true,
1819
"target": "esnext",
1920
"traceResolution": false
2021
}

0 commit comments

Comments
 (0)