Skip to content

Commit f20e878

Browse files
author
zhanglin
committed
chore: fix type errors
1 parent b0107ed commit f20e878

File tree

19 files changed

+484
-215
lines changed

19 files changed

+484
-215
lines changed

src/sheet/ReactSheet.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { Toolbar } from './components/Toolbar/Toolbar';
1111
import { cssPrefix } from './configs';
1212
import { useKeyboardShortcuts } from './hooks/useKeyboardShortcuts';
1313
import { useSheetStore } from './store/useSheetStore';
14+
import type { SheetDataInput } from './types';
1415
import './sheet.less';
1516
import svg from './assets/sprite.svg';
1617
import type { Options } from './index';
@@ -146,7 +147,7 @@ export default ReactSheet;
146147
export const createSheet = (_container: HTMLElement, _options?: Options) => {
147148
// TODO: 实现 React 渲染到容器
148149
return {
149-
loadData: (data: unknown) => useSheetStore.getState().loadData(data),
150+
loadData: (data: unknown) => useSheetStore.getState().loadData(data as SheetDataInput | SheetDataInput[]),
150151
getData: () => useSheetStore.getState().getData(),
151152
on: (event: string, callback: (data: unknown) => void) => {
152153
if (event === 'change') {

src/sheet/canvas/cellRenderer.ts

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
* 从 component/table.ts 迁移而来
44
*/
55

6+
import type { FormatMap, FormulaMap } from '../types';
67
import { cellRender } from '../core/cell';
78
import type DataProxy from '../core/dataProxy';
89
import { getFontSizePxByPt } from '../core/font';
@@ -48,7 +49,7 @@ export function renderCell(
4849

4950
let nrindex = rindex;
5051
if (sortedRowMap.has(rindex)) {
51-
nrindex = sortedRowMap.get(rindex);
52+
nrindex = sortedRowMap.get(rindex) || rindex;
5253
}
5354

5455
const cell = data.getCell(nrindex, cindex);
@@ -61,7 +62,7 @@ export function renderCell(
6162

6263
const style = data.getCellStyleOrDefault(nrindex, cindex);
6364
const dbox = getDrawBox(data, rindex, cindex, xoffset, yoffset);
64-
dbox.bgcolor = style.bgcolor;
65+
dbox.bgcolor = style.bgcolor || '#ffffff';
6566

6667
if (style.border !== undefined) {
6768
dbox.setBorders(style.border);
@@ -71,33 +72,34 @@ export function renderCell(
7172
draw.rect(dbox, () => {
7273
// render text
7374
let cellText = '';
74-
if (!data.settings.evalPaused) {
75-
cellText = cellRender(cell.text || '', formulam, (y, x) =>
75+
const settings = data.settings as typeof data.settings & { evalPaused?: boolean };
76+
if (!settings.evalPaused) {
77+
cellText = String(cellRender(cell.text || '', formulam as FormulaMap, (y: number, x: number) =>
7678
data.getCellTextOrDefault(x, y),
77-
);
79+
));
7880
} else {
7981
cellText = cell.text || '';
8082
}
8183

82-
if (style.format) {
83-
cellText = formatm[style.format].render(cellText);
84+
if (style.format && (formatm as FormatMap)[style.format]) {
85+
cellText = (formatm as FormatMap)[style.format].render(cellText);
8486
}
8587

86-
const font = Object.assign({}, style.font);
87-
font.size = getFontSizePxByPt(font.size);
88+
const font = Object.assign({ name: 'Arial', size: 10, bold: false, italic: false }, style.font);
89+
font.size = getFontSizePxByPt(font.size || 10);
8890

8991
draw.text(
9092
cellText,
9193
dbox,
9294
{
93-
align: style.align,
94-
valign: style.valign,
95+
align: style.align || 'left',
96+
valign: style.valign || 'middle',
9597
font,
96-
color: style.color,
97-
strike: style.strike,
98-
underline: style.underline,
98+
color: style.color || '#000000',
99+
strike: style.strike || false,
100+
underline: style.underline || false,
99101
},
100-
style.textwrap,
102+
style.textwrap || false,
101103
);
102104

103105
// error

src/sheet/canvas/draw.ts

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -99,31 +99,31 @@ export class DrawBox {
9999
return y;
100100
}
101101

102-
topxys() {
102+
topxys(): [number, number][] {
103103
const { x, y, width } = this;
104104
return [
105105
[x, y],
106106
[x + width, y],
107107
];
108108
}
109109

110-
rightxys() {
110+
rightxys(): [number, number][] {
111111
const { x, y, width, height } = this;
112112
return [
113113
[x + width, y],
114114
[x + width, y + height],
115115
];
116116
}
117117

118-
bottomxys() {
118+
bottomxys(): [number, number][] {
119119
const { x, y, width, height } = this;
120120
return [
121121
[x, y + height],
122122
[x + width, y + height],
123123
];
124124
}
125125

126-
leftxys() {
126+
leftxys(): [number, number][] {
127127
const { x, y, height } = this;
128128
return [
129129
[x, y],
@@ -182,7 +182,8 @@ export class Draw {
182182
}
183183
this.ctx = context;
184184
this.resize(width, height);
185-
this.ctx.scale(dpr(), dpr());
185+
const currentDpr = dpr();
186+
this.ctx.scale(currentDpr, currentDpr);
186187
}
187188

188189
resize(width: number, height: number) {
@@ -286,8 +287,8 @@ export class Draw {
286287
ctx.save();
287288
ctx.beginPath();
288289
this.attr({
289-
textAlign: align,
290-
textBaseline: valign,
290+
textAlign: align as CanvasTextAlign,
291+
textBaseline: valign as CanvasTextBaseline,
291292
font: `${font.italic ? 'italic' : ''} ${font.bold ? 'bold' : ''} ${npx(font.size)}px ${font.name}`,
292293
fillStyle: color,
293294
strokeStyle: color,
@@ -391,19 +392,23 @@ export class Draw {
391392
if (borderTop) {
392393
this.border(borderTop[0], borderTop[1]);
393394
// console.log('box.topxys:', box.topxys());
394-
this.line(...box.topxys());
395+
const topPoints = box.topxys();
396+
this.line(...(topPoints as [number, number][]));
395397
}
396398
if (borderRight) {
397399
this.border(borderRight[0], borderRight[1]);
398-
this.line(...box.rightxys());
400+
const rightPoints = box.rightxys();
401+
this.line(...(rightPoints as [number, number][]));
399402
}
400403
if (borderBottom) {
401404
this.border(borderBottom[0], borderBottom[1]);
402-
this.line(...box.bottomxys());
405+
const bottomPoints = box.bottomxys();
406+
this.line(...(bottomPoints as [number, number][]));
403407
}
404408
if (borderLeft) {
405409
this.border(borderLeft[0], borderLeft[1]);
406-
this.line(...box.leftxys());
410+
const leftPoints = box.leftxys();
411+
this.line(...(leftPoints as [number, number][]));
407412
}
408413
ctx.restore();
409414
}

src/sheet/components/BottomBar/Bottombar.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ export const Bottombar: React.FC = () => {
136136
onKeyDown={(e) => {
137137
if (e.key === 'Enter' || e.key === ' ') {
138138
e.preventDefault();
139-
handleDeleteSheet(index, e);
139+
handleDeleteSheet(index, e as unknown as React.MouseEvent<Element, MouseEvent>);
140140
}
141141
}}
142142
role="button"

src/sheet/components/Toolbar/Toolbar.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ export const Toolbar: React.FC = () => {
2626

2727
// 获取当前选中单元格的样式
2828
const cellStyle = useMemo(() => {
29-
if (!data) return null;
29+
if (!data) return { font: { bold: false, italic: false, size: 10 } };
3030
return data.getSelectedCellStyle();
3131
}, [data]);
3232

@@ -156,7 +156,7 @@ export const Toolbar: React.FC = () => {
156156
</div>
157157
</Dropdown>
158158

159-
<Dropdown title={cellStyle?.font?.size || '10'} width={80}>
159+
<Dropdown title={String(cellStyle?.font?.size || '10')} width={80}>
160160
{[8, 9, 10, 11, 12, 14, 16, 18, 20, 24, 28, 32].map((size) => (
161161
<div
162162
key={size}
@@ -214,7 +214,7 @@ export const Toolbar: React.FC = () => {
214214
<div style={{ padding: '10px' }}>
215215
<input
216216
type="color"
217-
value={cellStyle?.color || '#000000'}
217+
value={String(cellStyle?.color || '#000000')}
218218
onChange={(e) => setCellStyle('color', e.target.value)}
219219
style={{ width: '100%', height: '30px' }}
220220
/>
@@ -236,7 +236,7 @@ export const Toolbar: React.FC = () => {
236236
<div style={{ padding: '10px' }}>
237237
<input
238238
type="color"
239-
value={cellStyle?.bgcolor || '#ffffff'}
239+
value={String(cellStyle?.bgcolor || '#ffffff')}
240240
onChange={(e) => setCellStyle('bgcolor', e.target.value)}
241241
style={{ width: '100%', height: '30px' }}
242242
/>

src/sheet/core/cell.ts

Lines changed: 42 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1+
import type { CellRenderFn, FormulaMap } from '../types';
12
import { expr2xy, xy2expr } from './alphabet';
23
import { numberCalc } from './helper';
34

45
// Converting infix expression to a suffix expression
56
// src: AVERAGE(SUM(A1,A2), B1) + 50 + B20
67
// return: [A1, A2], SUM[, B1],AVERAGE,50,+,B20,+
7-
export const infixExprToSuffixExpr = (src) => {
8+
export const infixExprToSuffixExpr = (src: string): (string | [string, number])[] => {
89
const operatorStack = [];
910
const stack = [];
1011
let subStrs = []; // SUM, A1, B2, 50 ...
@@ -47,20 +48,24 @@ export const infixExprToSuffixExpr = (src) => {
4748
const [sx, sy] = expr2xy(stack.pop());
4849
// console.log('::', sx, sy, ex, ey);
4950
let rangelen = 0;
50-
for (let x = sx; x <= ex; x += 1) {
51-
for (let y = sy; y <= ey; y += 1) {
52-
stack.push(xy2expr(x, y));
53-
rangelen += 1;
54-
}
51+
for (let x = sx; x <= ex; x += 1) {
52+
for (let y = sy; y <= ey; y += 1) {
53+
stack.push(xy2expr(x, y));
54+
rangelen += 1;
5555
}
56+
}
57+
if (typeof c1 === 'string') {
5658
stack.push([c1, rangelen]);
59+
}
5760
} catch {
5861
// console.log(e);
5962
}
6063
} else if (fnArgType === 1 || fnArgType === 3) {
6164
if (fnArgType === 3) stack.push(fnArgOperator);
6265
// fn argument => A1,A2,B5
63-
stack.push([c1, fnArgsLen]);
66+
if (typeof c1 === 'string') {
67+
stack.push([c1, fnArgsLen]);
68+
}
6469
fnArgsLen = 1;
6570
} else {
6671
// console.log('c1:', c1, fnArgType, stack, operatorStack);
@@ -123,7 +128,7 @@ export const infixExprToSuffixExpr = (src) => {
123128
return stack;
124129
};
125130

126-
const evalSubExpr = (subExpr, cellRender) => {
131+
const evalSubExpr = (subExpr: string, cellRender: CellRenderFn): string | number => {
127132
const [fl] = subExpr;
128133
let expr = subExpr;
129134
if (fl === '"') {
@@ -137,16 +142,25 @@ const evalSubExpr = (subExpr, cellRender) => {
137142
if (expr[0] >= '0' && expr[0] <= '9') {
138143
return ret * Number(expr);
139144
}
140-
const [x, y] = expr2xy(expr);
141-
return ret * cellRender(x, y);
145+
try {
146+
const [x, y] = expr2xy(expr);
147+
return ret * Number(cellRender(x, y));
148+
} catch {
149+
return 0;
150+
}
142151
};
143152

144153
// evaluate the suffix expression
145154
// srcStack: <= infixExprToSufixExpr
146155
// formulaMap: {'SUM': {}, ...}
147156
// cellRender: (x, y) => {}
148-
const evalSuffixExpr = (srcStack, formulaMap, cellRender, cellList) => {
149-
const stack = [];
157+
const evalSuffixExpr = (
158+
srcStack: (string | [string, number])[],
159+
formulaMap: FormulaMap,
160+
cellRender: CellRenderFn,
161+
cellList: string[],
162+
): unknown => {
163+
const stack: unknown[] = [];
150164
// console.log(':::::formulaMap:', formulaMap);
151165
for (let i = 0; i < srcStack.length; i += 1) {
152166
// console.log(':::>>>', srcStack[i]);
@@ -172,18 +186,19 @@ const evalSuffixExpr = (srcStack, formulaMap, cellRender, cellList) => {
172186
let top = stack.pop();
173187
if (!Number.isNaN(top)) top = Number(top);
174188
let left = stack.pop();
175-
if (!Number.isNaN(left)) left = Number(left);
189+
if (typeof left === 'number' && !Number.isNaN(left)) left = Number(left);
190+
if (typeof top === 'number' && !Number.isNaN(top)) top = Number(top);
176191
let ret = false;
177192
if (fc === '=') {
178193
ret = left === top;
179194
} else if (expr === '>') {
180-
ret = left > top;
195+
ret = (left as number) > (top as number);
181196
} else if (expr === '>=') {
182-
ret = left >= top;
197+
ret = (left as number) >= (top as number);
183198
} else if (expr === '<') {
184-
ret = left < top;
199+
ret = (left as number) < (top as number);
185200
} else if (expr === '<=') {
186-
ret = left <= top;
201+
ret = (left as number) <= (top as number);
187202
}
188203
stack.push(ret);
189204
} else if (Array.isArray(expr)) {
@@ -208,15 +223,22 @@ const evalSuffixExpr = (srcStack, formulaMap, cellRender, cellList) => {
208223
return stack[0];
209224
};
210225

211-
export const cellRender = (src, formulaMap, getCellText, cellList = []) => {
226+
export const cellRender = (
227+
src: string,
228+
formulaMap: FormulaMap,
229+
getCellText: CellRenderFn,
230+
cellList: string[] = [],
231+
): unknown => {
212232
if (src[0] === '=') {
213233
const stack = infixExprToSuffixExpr(src.substring(1));
214234
if (stack.length <= 0) return src;
215235
return evalSuffixExpr(
216236
stack,
217237
formulaMap,
218-
(x, y) =>
219-
cellRender(getCellText(x, y), formulaMap, getCellText, cellList),
238+
(x: number, y: number): string | number => {
239+
const text = getCellText(x, y);
240+
return cellRender(String(text), formulaMap, getCellText, cellList) as string | number;
241+
},
220242
cellList,
221243
);
222244
}

0 commit comments

Comments
 (0)