Skip to content

Commit 9502211

Browse files
committed
feat: use ReadonlyArray in props
1 parent 4cf7ec0 commit 9502211

15 files changed

+39
-40
lines changed

src/Body/BodyRow.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@ export interface BodyRowProps<RecordType> {
2424
childrenColumnName: string;
2525
}
2626

27-
function BodyRow<RecordType extends { children?: RecordType[] }>(props: BodyRowProps<RecordType>) {
27+
function BodyRow<RecordType extends { children?: readonly RecordType[] }>(
28+
props: BodyRowProps<RecordType>,
29+
) {
2830
const {
2931
className,
3032
style,

src/Body/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import ResizeContext from '../context/ResizeContext';
99
import MeasureCell from './MeasureCell';
1010

1111
export interface BodyProps<RecordType> {
12-
data: RecordType[];
12+
data: readonly RecordType[];
1313
getRowKey: GetRowKey<RecordType>;
1414
measureColumnWidth: boolean;
1515
expandedKeys: Set<Key>;

src/ColGroup.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ import { ColumnType } from './interface';
33
import { INTERNAL_COL_DEFINE } from './utils/legacyUtil';
44

55
export interface ColGroupProps<RecordType> {
6-
colWidths: (number | string)[];
7-
columns?: ColumnType<RecordType>[];
6+
colWidths: readonly (number | string)[];
7+
columns?: readonly ColumnType<RecordType>[];
88
columCount?: number;
99
}
1010

src/Header/FixedHeader.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import ColGroup from '../ColGroup';
77
import { ColumnsType, ColumnType } from '../interface';
88
import TableContext from '../context/TableContext';
99

10-
function useColumnWidth(colWidths: number[], columCount: number) {
10+
function useColumnWidth(colWidths: readonly number[], columCount: number) {
1111
return useMemo(() => {
1212
const cloneColumns: number[] = [];
1313
for (let i = 0; i < columCount; i += 1) {
@@ -24,7 +24,7 @@ function useColumnWidth(colWidths: number[], columCount: number) {
2424

2525
export interface FixedHeaderProps<RecordType> extends HeaderProps<RecordType> {
2626
noData: boolean;
27-
colWidths: number[];
27+
colWidths: readonly number[];
2828
columCount: number;
2929
direction: 'ltr' | 'rtl';
3030
fixHeader: boolean;
@@ -92,7 +92,7 @@ const FixedHeader = React.forwardRef<HTMLDivElement, FixedHeaderProps<unknown>>(
9292
[combinationScrollBarSize, columns],
9393
);
9494

95-
const flattenColumnsWithScrollbar = useMemo<ColumnType<unknown>[]>(
95+
const flattenColumnsWithScrollbar = useMemo(
9696
() => (combinationScrollBarSize ? [...flattenColumns, ScrollBarColumn] : flattenColumns),
9797
[combinationScrollBarSize, flattenColumns],
9898
);

src/Header/Header.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,9 @@ function parseHeaderRows<RecordType>(
8383

8484
export interface HeaderProps<RecordType> {
8585
columns: ColumnsType<RecordType>;
86-
flattenColumns: ColumnType<RecordType>[];
86+
flattenColumns: readonly ColumnType<RecordType>[];
8787
stickyOffsets: StickyOffsets;
88-
onHeaderRow: GetComponentProps<ColumnType<RecordType>[]>;
88+
onHeaderRow: GetComponentProps<readonly ColumnType<RecordType>[]>;
8989
}
9090

9191
function Header<RecordType>({

src/Header/HeaderRow.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@ import { getCellFixedInfo } from '../utils/fixUtil';
1212
import { getColumnsKey } from '../utils/valueUtil';
1313

1414
export interface RowProps<RecordType> {
15-
cells: CellType<RecordType>[];
15+
cells: readonly CellType<RecordType>[];
1616
stickyOffsets: StickyOffsets;
17-
flattenColumns: ColumnType<RecordType>[];
17+
flattenColumns: readonly ColumnType<RecordType>[];
1818
rowComponent: CustomizeComponent;
1919
cellComponent: CustomizeComponent;
20-
onHeaderRow: GetComponentProps<ColumnType<RecordType>[]>;
20+
onHeaderRow: GetComponentProps<readonly ColumnType<RecordType>[]>;
2121
index: number;
2222
}
2323

src/Table.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ export interface TableProps<RecordType = unknown> extends LegacyExpandableProps<
106106
className?: string;
107107
style?: React.CSSProperties;
108108
children?: React.ReactNode;
109-
data?: RecordType[];
109+
data?: readonly RecordType[];
110110
columns?: ColumnsType<RecordType>;
111111
rowKey?: string | GetRowKey<RecordType>;
112112
tableLayout?: TableLayout;
@@ -123,14 +123,14 @@ export interface TableProps<RecordType = unknown> extends LegacyExpandableProps<
123123
// Additional Part
124124
title?: PanelRender<RecordType>;
125125
footer?: PanelRender<RecordType>;
126-
summary?: (data: RecordType[]) => React.ReactNode;
126+
summary?: (data: readonly RecordType[]) => React.ReactNode;
127127

128128
// Customize
129129
id?: string;
130130
showHeader?: boolean;
131131
components?: TableComponents<RecordType>;
132132
onRow?: GetComponentProps<RecordType>;
133-
onHeaderRow?: GetComponentProps<ColumnType<RecordType>[]>;
133+
onHeaderRow?: GetComponentProps<readonly ColumnType<RecordType>[]>;
134134
emptyText?: React.ReactNode | (() => React.ReactNode);
135135

136136
direction?: 'ltr' | 'rtl';
@@ -303,7 +303,7 @@ function Table<RecordType extends DefaultRecordType>(props: TableProps<RecordTyp
303303
return false;
304304
}, [!!expandedRowRender, mergedData]);
305305

306-
const [innerExpandedKeys, setInnerExpandedKeys] = React.useState<Key[]>(() => {
306+
const [innerExpandedKeys, setInnerExpandedKeys] = React.useState(() => {
307307
if (defaultExpandedRowKeys) {
308308
return defaultExpandedRowKeys;
309309
}

src/context/BodyContext.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ export interface BodyContextProps<RecordType = DefaultRecordType> {
1616
expandedRowClassName: RowClassName<RecordType>;
1717

1818
columns: ColumnsType<RecordType>;
19-
flattenColumns: ColumnType<RecordType>[];
19+
flattenColumns: readonly ColumnType<RecordType>[];
2020

2121
componentWidth: number;
2222
tableLayout: TableLayout;

src/context/TableContext.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export interface TableContextProps {
1212

1313
direction: 'ltr' | 'rtl';
1414

15-
fixedInfoList: FixedInfo[];
15+
fixedInfoList: readonly FixedInfo[];
1616

1717
isSticky: boolean;
1818
}

src/hooks/useColumns.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ function flatColumns<RecordType>(columns: ColumnsType<RecordType>): ColumnType<R
6060
}, []);
6161
}
6262

63-
function warningFixed(flattenColumns: { fixed?: FixedType }[]) {
63+
function warningFixed(flattenColumns: readonly { fixed?: FixedType }[]) {
6464
let allFixLeft = true;
6565
for (let i = 0; i < flattenColumns.length; i += 1) {
6666
const col = flattenColumns[i];
@@ -136,7 +136,7 @@ function useColumns<RecordType>(
136136
columnWidth?: number | string;
137137
},
138138
transformColumns: (columns: ColumnsType<RecordType>) => ColumnsType<RecordType>,
139-
): [ColumnsType<RecordType>, ColumnType<RecordType>[]] {
139+
): [ColumnsType<RecordType>, readonly ColumnType<RecordType>[]] {
140140
const baseColumns = React.useMemo<ColumnsType<RecordType>>(
141141
() => columns || convertChildrenToColumns(children),
142142
[columns, children],

src/interface.ts

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ export interface RenderedCell<RecordType> {
5353
children?: React.ReactNode;
5454
}
5555

56-
export type DataIndex = string | number | (string | number)[];
56+
export type DataIndex = string | number | readonly (string | number)[];
5757

5858
export type CellEllipsisType = { showTitle?: boolean } | boolean;
5959

@@ -89,17 +89,14 @@ export interface ColumnType<RecordType> extends ColumnSharedType<RecordType> {
8989
onCellClick?: (record: RecordType, e: React.MouseEvent<HTMLElement>) => void;
9090
}
9191

92-
export type ColumnsType<RecordType = unknown> = (
93-
| ColumnGroupType<RecordType>
94-
| ColumnType<RecordType>
95-
)[];
92+
export type ColumnsType<RecordType = unknown> = readonly (ColumnGroupType<RecordType> | ColumnType<RecordType>)[];
9693

9794
export type GetRowKey<RecordType> = (record: RecordType, index?: number) => Key;
9895

9996
// ================= Fix Column =================
10097
export interface StickyOffsets {
101-
left: number[];
102-
right: number[];
98+
left: readonly number[];
99+
right: readonly number[];
103100
isSticky?: boolean;
104101
}
105102

@@ -118,7 +115,7 @@ type Component<P> =
118115
export type CustomizeComponent = Component<any>;
119116

120117
export type CustomizeScrollBody<RecordType> = (
121-
data: RecordType[],
118+
data: readonly RecordType[],
122119
info: {
123120
scrollbarSize: number;
124121
ref: React.Ref<{ scrollLeft: number }>;
@@ -143,7 +140,7 @@ export interface TableComponents<RecordType> {
143140
}
144141

145142
export type GetComponent = (
146-
path: string[],
143+
path: readonly string[],
147144
defaultComponent?: CustomizeComponent,
148145
) => CustomizeComponent;
149146

@@ -197,13 +194,13 @@ export type RenderExpandIcon<RecordType> = (
197194
) => React.ReactNode;
198195

199196
export interface ExpandableConfig<RecordType> {
200-
expandedRowKeys?: Key[];
201-
defaultExpandedRowKeys?: Key[];
197+
expandedRowKeys?: readonly Key[];
198+
defaultExpandedRowKeys?: readonly Key[];
202199
expandedRowRender?: ExpandedRowRender<RecordType>;
203200
expandRowByClick?: boolean;
204201
expandIcon?: RenderExpandIcon<RecordType>;
205202
onExpand?: (expanded: boolean, record: RecordType) => void;
206-
onExpandedRowsChange?: (expandedKeys: Key[]) => void;
203+
onExpandedRowsChange?: (expandedKeys: readonly Key[]) => void;
207204
defaultExpandAllRows?: boolean;
208205
indentSize?: number;
209206
expandIconColumnIndex?: number;
@@ -214,7 +211,7 @@ export interface ExpandableConfig<RecordType> {
214211
}
215212

216213
// =================== Render ===================
217-
export type PanelRender<RecordType> = (data: RecordType[]) => React.ReactNode;
214+
export type PanelRender<RecordType> = (data: readonly RecordType[]) => React.ReactNode;
218215

219216
// =================== Events ===================
220217
export type TriggerEventHandler<RecordType> = (

src/sugar/ColumnGroup.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { ColumnType } from '../interface';
55
export interface ColumnGroupProps<RecordType> extends Omit<ColumnType<RecordType>, 'children'> {
66
children:
77
| React.ReactElement<ColumnProps<RecordType>>
8-
| React.ReactElement<ColumnProps<RecordType>>[];
8+
| readonly React.ReactElement<ColumnProps<RecordType>>[];
99
}
1010

1111
/* istanbul ignore next */

src/utils/expandUtil.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,13 @@ export function renderExpandIcon<RecordType>({
3232
}
3333

3434
export function findAllChildrenKeys<RecordType>(
35-
data: RecordType[],
35+
data: readonly RecordType[],
3636
getRowKey: GetRowKey<RecordType>,
3737
childrenColumnName: string,
3838
): Key[] {
3939
const keys: Key[] = [];
4040

41-
function dig(list: RecordType[]) {
41+
function dig(list: readonly RecordType[]) {
4242
(list || []).forEach((item, index) => {
4343
keys.push(getRowKey(item, index));
4444

src/utils/fixUtil.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ export interface FixedInfo {
1616
export function getCellFixedInfo(
1717
colStart: number,
1818
colEnd: number,
19-
columns: { fixed?: FixedType }[],
19+
columns: readonly { fixed?: FixedType }[],
2020
stickyOffsets: StickyOffsets,
2121
direction: 'ltr' | 'rtl',
2222
): FixedInfo {

src/utils/valueUtil.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ import { Key, DataIndex } from '../interface';
22

33
const INTERNAL_KEY_PREFIX = 'RC_TABLE_KEY';
44

5-
function toArray<T>(arr: T | T[]): T[] {
5+
function toArray<T>(arr: T | readonly T[]): T[] {
66
if (arr === undefined || arr === null) {
77
return [];
88
}
9-
9+
// @ts-expect-error
1010
return Array.isArray(arr) ? arr : [arr];
1111
}
1212

@@ -40,7 +40,7 @@ interface GetColumnKeyColumn {
4040
dataIndex?: DataIndex;
4141
}
4242

43-
export function getColumnsKey(columns: GetColumnKeyColumn[]) {
43+
export function getColumnsKey(columns: readonly GetColumnKeyColumn[]) {
4444
const columnKeys: React.Key[] = [];
4545
const keys: Record<React.Key, boolean> = {};
4646

0 commit comments

Comments
 (0)