From 1b7b4d6d4401a4b2b3e8ffe6734ad1d85c2028a4 Mon Sep 17 00:00:00 2001 From: ZHAO Jinxiang Date: Tue, 26 Jan 2021 22:40:36 +0800 Subject: [PATCH] feat: use ReadonlyArray in props --- src/Body/BodyRow.tsx | 4 +++- src/Body/index.tsx | 2 +- src/ColGroup.tsx | 4 ++-- src/Header/FixedHeader.tsx | 6 +++--- src/Header/Header.tsx | 4 ++-- src/Header/HeaderRow.tsx | 6 +++--- src/Table.tsx | 8 ++++---- src/context/BodyContext.tsx | 2 +- src/context/TableContext.tsx | 2 +- src/hooks/useColumns.tsx | 4 ++-- src/interface.ts | 23 ++++++++++------------- src/sugar/ColumnGroup.tsx | 2 +- src/utils/expandUtil.tsx | 4 ++-- src/utils/fixUtil.ts | 2 +- src/utils/valueUtil.tsx | 7 +++---- 15 files changed, 39 insertions(+), 41 deletions(-) diff --git a/src/Body/BodyRow.tsx b/src/Body/BodyRow.tsx index a1753da58..621fcc6d5 100644 --- a/src/Body/BodyRow.tsx +++ b/src/Body/BodyRow.tsx @@ -24,7 +24,9 @@ export interface BodyRowProps { childrenColumnName: string; } -function BodyRow(props: BodyRowProps) { +function BodyRow( + props: BodyRowProps, +) { const { className, style, diff --git a/src/Body/index.tsx b/src/Body/index.tsx index 23401d2d8..e826b9cb4 100644 --- a/src/Body/index.tsx +++ b/src/Body/index.tsx @@ -9,7 +9,7 @@ import ResizeContext from '../context/ResizeContext'; import MeasureCell from './MeasureCell'; export interface BodyProps { - data: RecordType[]; + data: readonly RecordType[]; getRowKey: GetRowKey; measureColumnWidth: boolean; expandedKeys: Set; diff --git a/src/ColGroup.tsx b/src/ColGroup.tsx index 9630d6431..f8f8084e7 100644 --- a/src/ColGroup.tsx +++ b/src/ColGroup.tsx @@ -3,8 +3,8 @@ import { ColumnType } from './interface'; import { INTERNAL_COL_DEFINE } from './utils/legacyUtil'; export interface ColGroupProps { - colWidths: (number | string)[]; - columns?: ColumnType[]; + colWidths: readonly (number | string)[]; + columns?: readonly ColumnType[]; columCount?: number; } diff --git a/src/Header/FixedHeader.tsx b/src/Header/FixedHeader.tsx index 3a04172c5..3055e7e1b 100644 --- a/src/Header/FixedHeader.tsx +++ b/src/Header/FixedHeader.tsx @@ -7,7 +7,7 @@ import ColGroup from '../ColGroup'; import { ColumnsType, ColumnType } from '../interface'; import TableContext from '../context/TableContext'; -function useColumnWidth(colWidths: number[], columCount: number) { +function useColumnWidth(colWidths: readonly number[], columCount: number) { return useMemo(() => { const cloneColumns: number[] = []; for (let i = 0; i < columCount; i += 1) { @@ -24,7 +24,7 @@ function useColumnWidth(colWidths: number[], columCount: number) { export interface FixedHeaderProps extends HeaderProps { noData: boolean; - colWidths: number[]; + colWidths: readonly number[]; columCount: number; direction: 'ltr' | 'rtl'; fixHeader: boolean; @@ -92,7 +92,7 @@ const FixedHeader = React.forwardRef>( [combinationScrollBarSize, columns], ); - const flattenColumnsWithScrollbar = useMemo[]>( + const flattenColumnsWithScrollbar = useMemo( () => (combinationScrollBarSize ? [...flattenColumns, ScrollBarColumn] : flattenColumns), [combinationScrollBarSize, flattenColumns], ); diff --git a/src/Header/Header.tsx b/src/Header/Header.tsx index e3acc74c2..b9bf773e7 100644 --- a/src/Header/Header.tsx +++ b/src/Header/Header.tsx @@ -83,9 +83,9 @@ function parseHeaderRows( export interface HeaderProps { columns: ColumnsType; - flattenColumns: ColumnType[]; + flattenColumns: readonly ColumnType[]; stickyOffsets: StickyOffsets; - onHeaderRow: GetComponentProps[]>; + onHeaderRow: GetComponentProps[]>; } function Header({ diff --git a/src/Header/HeaderRow.tsx b/src/Header/HeaderRow.tsx index 36de20617..6f560f985 100644 --- a/src/Header/HeaderRow.tsx +++ b/src/Header/HeaderRow.tsx @@ -12,12 +12,12 @@ import { getCellFixedInfo } from '../utils/fixUtil'; import { getColumnsKey } from '../utils/valueUtil'; export interface RowProps { - cells: CellType[]; + cells: readonly CellType[]; stickyOffsets: StickyOffsets; - flattenColumns: ColumnType[]; + flattenColumns: readonly ColumnType[]; rowComponent: CustomizeComponent; cellComponent: CustomizeComponent; - onHeaderRow: GetComponentProps[]>; + onHeaderRow: GetComponentProps[]>; index: number; } diff --git a/src/Table.tsx b/src/Table.tsx index de1a41eaa..6019c188d 100644 --- a/src/Table.tsx +++ b/src/Table.tsx @@ -106,7 +106,7 @@ export interface TableProps extends LegacyExpandableProps< className?: string; style?: React.CSSProperties; children?: React.ReactNode; - data?: RecordType[]; + data?: readonly RecordType[]; columns?: ColumnsType; rowKey?: string | GetRowKey; tableLayout?: TableLayout; @@ -123,14 +123,14 @@ export interface TableProps extends LegacyExpandableProps< // Additional Part title?: PanelRender; footer?: PanelRender; - summary?: (data: RecordType[]) => React.ReactNode; + summary?: (data: readonly RecordType[]) => React.ReactNode; // Customize id?: string; showHeader?: boolean; components?: TableComponents; onRow?: GetComponentProps; - onHeaderRow?: GetComponentProps[]>; + onHeaderRow?: GetComponentProps[]>; emptyText?: React.ReactNode | (() => React.ReactNode); direction?: 'ltr' | 'rtl'; @@ -303,7 +303,7 @@ function Table(props: TableProps(() => { + const [innerExpandedKeys, setInnerExpandedKeys] = React.useState(() => { if (defaultExpandedRowKeys) { return defaultExpandedRowKeys; } diff --git a/src/context/BodyContext.tsx b/src/context/BodyContext.tsx index 55c693b97..bba1b2ac5 100644 --- a/src/context/BodyContext.tsx +++ b/src/context/BodyContext.tsx @@ -16,7 +16,7 @@ export interface BodyContextProps { expandedRowClassName: RowClassName; columns: ColumnsType; - flattenColumns: ColumnType[]; + flattenColumns: readonly ColumnType[]; componentWidth: number; tableLayout: TableLayout; diff --git a/src/context/TableContext.tsx b/src/context/TableContext.tsx index f24c84425..51957cfe5 100644 --- a/src/context/TableContext.tsx +++ b/src/context/TableContext.tsx @@ -12,7 +12,7 @@ export interface TableContextProps { direction: 'ltr' | 'rtl'; - fixedInfoList: FixedInfo[]; + fixedInfoList: readonly FixedInfo[]; isSticky: boolean; } diff --git a/src/hooks/useColumns.tsx b/src/hooks/useColumns.tsx index c1f33329a..26a581d29 100644 --- a/src/hooks/useColumns.tsx +++ b/src/hooks/useColumns.tsx @@ -60,7 +60,7 @@ function flatColumns(columns: ColumnsType): ColumnType( columnWidth?: number | string; }, transformColumns: (columns: ColumnsType) => ColumnsType, -): [ColumnsType, ColumnType[]] { +): [ColumnsType, readonly ColumnType[]] { const baseColumns = React.useMemo>( () => columns || convertChildrenToColumns(children), [columns, children], diff --git a/src/interface.ts b/src/interface.ts index c70ba1013..a338955c6 100644 --- a/src/interface.ts +++ b/src/interface.ts @@ -53,7 +53,7 @@ export interface RenderedCell { children?: React.ReactNode; } -export type DataIndex = string | number | (string | number)[]; +export type DataIndex = string | number | readonly (string | number)[]; export type CellEllipsisType = { showTitle?: boolean } | boolean; @@ -89,17 +89,14 @@ export interface ColumnType extends ColumnSharedType { onCellClick?: (record: RecordType, e: React.MouseEvent) => void; } -export type ColumnsType = ( - | ColumnGroupType - | ColumnType -)[]; +export type ColumnsType = readonly (ColumnGroupType | ColumnType)[]; export type GetRowKey = (record: RecordType, index?: number) => Key; // ================= Fix Column ================= export interface StickyOffsets { - left: number[]; - right: number[]; + left: readonly number[]; + right: readonly number[]; isSticky?: boolean; } @@ -118,7 +115,7 @@ type Component

= export type CustomizeComponent = Component; export type CustomizeScrollBody = ( - data: RecordType[], + data: readonly RecordType[], info: { scrollbarSize: number; ref: React.Ref<{ scrollLeft: number }>; @@ -143,7 +140,7 @@ export interface TableComponents { } export type GetComponent = ( - path: string[], + path: readonly string[], defaultComponent?: CustomizeComponent, ) => CustomizeComponent; @@ -197,13 +194,13 @@ export type RenderExpandIcon = ( ) => React.ReactNode; export interface ExpandableConfig { - expandedRowKeys?: Key[]; - defaultExpandedRowKeys?: Key[]; + expandedRowKeys?: readonly Key[]; + defaultExpandedRowKeys?: readonly Key[]; expandedRowRender?: ExpandedRowRender; expandRowByClick?: boolean; expandIcon?: RenderExpandIcon; onExpand?: (expanded: boolean, record: RecordType) => void; - onExpandedRowsChange?: (expandedKeys: Key[]) => void; + onExpandedRowsChange?: (expandedKeys: readonly Key[]) => void; defaultExpandAllRows?: boolean; indentSize?: number; expandIconColumnIndex?: number; @@ -214,7 +211,7 @@ export interface ExpandableConfig { } // =================== Render =================== -export type PanelRender = (data: RecordType[]) => React.ReactNode; +export type PanelRender = (data: readonly RecordType[]) => React.ReactNode; // =================== Events =================== export type TriggerEventHandler = ( diff --git a/src/sugar/ColumnGroup.tsx b/src/sugar/ColumnGroup.tsx index 5bd4c1802..f422da4c6 100644 --- a/src/sugar/ColumnGroup.tsx +++ b/src/sugar/ColumnGroup.tsx @@ -5,7 +5,7 @@ import { ColumnType } from '../interface'; export interface ColumnGroupProps extends Omit, 'children'> { children: | React.ReactElement> - | React.ReactElement>[]; + | readonly React.ReactElement>[]; } /* istanbul ignore next */ diff --git a/src/utils/expandUtil.tsx b/src/utils/expandUtil.tsx index 8a0112b88..9fa1bb2da 100644 --- a/src/utils/expandUtil.tsx +++ b/src/utils/expandUtil.tsx @@ -32,13 +32,13 @@ export function renderExpandIcon({ } export function findAllChildrenKeys( - data: RecordType[], + data: readonly RecordType[], getRowKey: GetRowKey, childrenColumnName: string, ): Key[] { const keys: Key[] = []; - function dig(list: RecordType[]) { + function dig(list: readonly RecordType[]) { (list || []).forEach((item, index) => { keys.push(getRowKey(item, index)); diff --git a/src/utils/fixUtil.ts b/src/utils/fixUtil.ts index 35afb064a..697d31e78 100644 --- a/src/utils/fixUtil.ts +++ b/src/utils/fixUtil.ts @@ -16,7 +16,7 @@ export interface FixedInfo { export function getCellFixedInfo( colStart: number, colEnd: number, - columns: { fixed?: FixedType }[], + columns: readonly { fixed?: FixedType }[], stickyOffsets: StickyOffsets, direction: 'ltr' | 'rtl', ): FixedInfo { diff --git a/src/utils/valueUtil.tsx b/src/utils/valueUtil.tsx index e4f224ec9..8971a7d99 100644 --- a/src/utils/valueUtil.tsx +++ b/src/utils/valueUtil.tsx @@ -2,12 +2,11 @@ import { Key, DataIndex } from '../interface'; const INTERNAL_KEY_PREFIX = 'RC_TABLE_KEY'; -function toArray(arr: T | T[]): T[] { +function toArray(arr: T | readonly T[]): T[] { if (arr === undefined || arr === null) { return []; } - - return Array.isArray(arr) ? arr : [arr]; + return (Array.isArray(arr) ? arr : [arr]) as T[]; } export function getPathValue( @@ -40,7 +39,7 @@ interface GetColumnKeyColumn { dataIndex?: DataIndex; } -export function getColumnsKey(columns: GetColumnKeyColumn[]) { +export function getColumnsKey(columns: readonly GetColumnKeyColumn[]) { const columnKeys: React.Key[] = []; const keys: Record = {};