Repository: arco-design/arco-design (ts)

Issue:
TableProps.rowKey 类型定义为函数时不支持返回 number
建议改成 `rowKey?: string | ((record: T) => React.Key);`

https://github.com/arco-design/arco-design/blob/0b98658af4841967a6bfebb9060a7c84bcf6dffe/components/Table/interface.tsx#L33

Pull request:
ts: TableProps rowKey
<!--
  Thanks so much for your PR and contribution.

  Before submitting, please make sure to follow the Pull Request Guidelines: https://github.com/arco-design/arco-design/blob/main/CONTRIBUTING.md
-->

<!-- Put an `x` in "[ ]" to check a box) -->

## Types of changes

<!-- What types of changes does this PR introduce -->
<!-- Only support choose one type, if there are multiple types, you can add the `Type` column in the Changelog. -->

- [ ] New feature
- [ ] Bug fix
- [ ] Enhancement
- [ ] Documentation change
- [ ] Coding style change
- [ ] Component style change
- [ ] Refactoring
- [ ] Test cases
- [ ] Continuous integration
- [x] Typescript definition change
- [ ] Breaking change
- [ ] Others 

## Background and context

<!-- Explain what problem does the PR solve -->
<!-- Link to related open issues if applicable -->

## Solution

<!-- Describe how the problem is fixed in detail -->

## How is the change tested?

<!-- Unit tests should be added/updated for bug fixes and new features, if applicable -->
<!-- Please describe how you tested the change. E.g. Creating/updating unit tests or attaching a screenshot of how it works with your change -->

## Changelog

| Component | Changelog(CN) | Changelog(EN) | Related issues |
| --------- | ------------- | ------------- | -------------- |
|     Table      |    修改 `Table` 组件 `rowKey` 的 `TS` 定义为 `React.Key \| ((record: T) => React.Key)`。          |      Modify the `TS` of the `Table` component `rowKey` to be `React.Key \| ((record: T) => React.Key)`.       |  close #751               | 

<!-- If there are multiple types, you can add the `Type` column in the Changelog, the value of the column is the same as `Types of changes` -->
## Checklist:

- [ ] Test suite passes (`npm run test`)
- [ ] Provide changelog for relevant changes (e.g. bug fixes and new features) if applicable.
- [ ] Changes are submitted to the appropriate branch (e.g. features should be submitted to `feature` branch and others should be submitted to `main` branch)

## Other information

<!-- Please describe what other information that should be taken care of. E.g. describe the impact if introduce a breaking change -->


Patch:
diff --git a/components/Calendar/README.en-US.md b/components/Calendar/README.en-US.md
index 649a98f9..6ec4ddd9 100644
--- a/components/Calendar/README.en-US.md
+++ b/components/Calendar/README.en-US.md
@@ -25,7 +25,7 @@ Container for displaying data in calendar form.
 |dayStartOfWeek|The first day of the week starts on the day of the week, `0`-Sunday, `1`-Monday.|`0 \| 1`|`0`|
 |defaultMode|The default display mode of the calendar|`'day' \| 'week' \| 'month' \| 'year'`|`month`|
 |mode|The display mode of the calendar|`'day' \| 'week' \| 'month' \| 'year'`|`-`|
-|disabledDate|Function that specifies the dates that cannot be selected|`(current?: Dayjs) => boolean`|`-`|
+|disabledDate|Function that specifies the dates that cannot be selected|`(current: Dayjs) => boolean`|`-`|
 |onChange|Callback when date change.|`(date: Dayjs) => void`|`-`|
 |onPanelChange|Callback when the panel date changes.|`(date: Dayjs) => void`|`-`|
 |dateRender|Customize the date display, which will completely cover the date cell.|`(currentDate: Dayjs) => ReactNode`|`-`|
diff --git a/components/Calendar/README.zh-CN.md b/components/Calendar/README.zh-CN.md
index 948d498b..e4002cd0 100644
--- a/components/Calendar/README.zh-CN.md
+++ b/components/Calendar/README.zh-CN.md
@@ -25,7 +25,7 @@
 |dayStartOfWeek|每周的第一天开始于周几，0 - 周日，1 - 周一。|`0 \| 1`|`0`|
 |defaultMode|选择日期的月日历和选择月份的年日历。|`'day' \| 'week' \| 'month' \| 'year'`|`month`|
 |mode|选择日期的月日历和选择月份的年日历，受控模式。|`'day' \| 'week' \| 'month' \| 'year'`|`-`|
-|disabledDate|不可选取的时间|`(current?: Dayjs) => boolean`|`-`|
+|disabledDate|不可选取的时间|`(current: Dayjs) => boolean`|`-`|
 |onChange|日期变化触发的回调。|`(date: Dayjs) => void`|`-`|
 |onPanelChange|面板日期发生改变触发的回调。|`(date: Dayjs) => void`|`-`|
 |dateRender|定制日期显示，会完全覆盖日期单元格。|`(currentDate: Dayjs) => ReactNode`|`-`|
diff --git a/components/Cascader/README.en-US.md b/components/Cascader/README.en-US.md
index f9272a97..ac37fce6 100644
--- a/components/Cascader/README.en-US.md
+++ b/components/Cascader/README.en-US.md
@@ -41,23 +41,23 @@ Display options in a multi-level cascading dropdown component.
 |onClear|Callback when click clear icon.|`(visible: boolean) => void`|`-`|-|
 |animation|Whether to add animation for internal label changes|`boolean`|`true`|2.15.0|
 |renderTag|Custom tag rendering, `props` is the current tag attribute, `index` is the order of the current tag, `values` is the value of all tags|`(props: {value: any;label: ReactNode;closable: boolean;onClose: (event) => void;},index: number,values: ObjectValueType[]) => React.ReactNode`|`-`|index、values added in 2.15.0|
-|style|Additional style|`CSSProperties`|`-`|-|
 |className|Additional css class|`string \| string[]`|`-`|-|
 |placeholder|Placeholder of element|`string`|`-`|-|
-|bordered|Whether to render border|`boolean`|`true`|-|
-|showSearch|Whether single mode Select is searchable. `{ retainInputValue: true }` to retain the existing content when the search box is focused,`{ retainInputValueWhileSelect: true }` to retain the existing content when multiple selection is selected.|`boolean \| { retainInputValue?: boolean; retainInputValueWhileSelect?: boolean }`|`-`|-|
+|style|Additional style|`CSSProperties`|`-`|-|
+|prefix|Customize select suffix|`ReactNode`|`-`|2.11.0|
+|onClick|Callback when the mouse clicks on the drop-down box|`(e) => void`|`-`|-|
 |size|Height of element, `24px` `28px` `32px` `36px`|`'mini' \| 'small' \| 'default' \| 'large'`|`-`|-|
 |disabled|Whether is disabled|`boolean`|`-`|-|
-|error|Error Style|`boolean`|`-`|-|
 |loading|Whether is in loading|`boolean`|`-`|-|
+|bordered|Whether to render border|`boolean`|`true`|-|
+|showSearch|Whether single mode Select is searchable. `{ retainInputValue: true }` to retain the existing content when the search box is focused,`{ retainInputValueWhileSelect: true }` to retain the existing content when multiple selection is selected.|`boolean \| { retainInputValue?: boolean; retainInputValueWhileSelect?: boolean }`|`-`|-|
+|error|Error Style|`boolean`|`-`|-|
 |allowClear|Whether allow to clear selected options|`boolean`|`-`|-|
 |maxTagCount|The maximum number of `tags` is displayed, only valid in `multiple` and `label` mode.|`number`|`-`|-|
-|prefix|Customize select suffix|`ReactNode`|`-`|2.11.0|
 |suffixIcon|Customize select suffix icon|`ReactNode`|`-`|-|
 |arrowIcon|Customize select arrow icon.|`ReactNode \| null`|`-`|-|
 |removeIcon|Customize the delete icon of tags selected in `multiple` and `label` mode.|`ReactNode \| null`|`-`|-|
 |clearIcon|Configure the icon of the clear button when `allowClear`.|`ReactNode`|`-`|2.26.0|
-|onClick|Callback when the mouse clicks on the drop-down box|`(e) => void`|`-`|-|
 
 ## Methods
 
diff --git a/components/Cascader/README.zh-CN.md b/components/Cascader/README.zh-CN.md
index a08665de..889c7c63 100644
--- a/components/Cascader/README.zh-CN.md
+++ b/components/Cascader/README.zh-CN.md
@@ -41,23 +41,23 @@
 |onClear|点击清除时触发，参数是当前下拉框的展开状态。|`(visible: boolean) => void`|`-`|-|
 |animation|是否为内部标签变化添加动画。|`boolean`|`true`|2.15.0|
 |renderTag|自定义标签渲染，`props` 为当前标签属性，`index` 为当前标签的顺序，`values` 为所有标签的值.|`(props: {value: any;label: ReactNode;closable: boolean;onClose: (event) => void;},index: number,values: ObjectValueType[]) => React.ReactNode`|`-`|index、values added in 2.15.0|
-|style|节点样式|`CSSProperties`|`-`|-|
 |className|节点类名|`string \| string[]`|`-`|-|
 |placeholder|选择框默认文字。|`string`|`-`|-|
-|bordered|是否需要边框|`boolean`|`true`|-|
-|showSearch|使单选模式可搜索，传入 `{ retainInputValue: true }` 在搜索框聚焦时保留现有内容传入 `{ retainInputValueWhileSelect: true }` 在多选选择时保留输入框内容。|`boolean \| { retainInputValue?: boolean; retainInputValueWhileSelect?: boolean }`|`-`|-|
+|style|节点样式|`CSSProperties`|`-`|-|
+|prefix|前缀。|`ReactNode`|`-`|2.11.0|
+|onClick|鼠标点击下拉框时的回调|`(e) => void`|`-`|-|
 |size|分别不同尺寸的选择器。对应 `24px`, `28px`, `32px`, `36px`|`'mini' \| 'small' \| 'default' \| 'large'`|`-`|-|
 |disabled|是否为禁用状态。|`boolean`|`-`|-|
-|error|是否为错误状态。|`boolean`|`-`|-|
 |loading|是否为加载状态。|`boolean`|`-`|-|
+|bordered|是否需要边框|`boolean`|`true`|-|
+|showSearch|使单选模式可搜索，传入 `{ retainInputValue: true }` 在搜索框聚焦时保留现有内容传入 `{ retainInputValueWhileSelect: true }` 在多选选择时保留输入框内容。|`boolean \| { retainInputValue?: boolean; retainInputValueWhileSelect?: boolean }`|`-`|-|
+|error|是否为错误状态。|`boolean`|`-`|-|
 |allowClear|允许清除值。|`boolean`|`-`|-|
 |maxTagCount|最多显示多少个 `tag`，仅在多选或标签模式有效。|`number`|`-`|-|
-|prefix|前缀。|`ReactNode`|`-`|2.11.0|
 |suffixIcon|自定义选择框后缀图标。|`ReactNode`|`-`|-|
 |arrowIcon|自定义箭头图标，设置为 `null` 不显示箭头图标。|`ReactNode \| null`|`-`|-|
 |removeIcon|多选时配置选中项的删除图标。当传入`null`，不显示删除图标。|`ReactNode \| null`|`-`|-|
 |clearIcon|`allowClear` 时配置清除按钮的图标。|`ReactNode`|`-`|2.26.0|
-|onClick|鼠标点击下拉框时的回调|`(e) => void`|`-`|-|
 
 
 ## 方法
diff --git a/components/Image/README.en-US.md b/components/Image/README.en-US.md
index d978c493..602a985a 100644
--- a/components/Image/README.en-US.md
+++ b/components/Image/README.en-US.md
@@ -14,23 +14,24 @@ Show and preview pictures.
 
 ### Image
 
-|Property|Description|Type|DefaultValue|
-|---|---|---|---|
-|style|Additional style|`CSSProperties`|`-`|
-|className|Additional css class|`string \| string[]`|`-`|
-|src|Image path|`string`|`-`|
-|width|Image width|`string \| number`|`-`|
-|height|Image height|`string \| number`|`-`|
-|title|Image title|`string`|`-`|
-|description|Image description|`string`|`-`|
-|actions|Extra operations|`ReactNode[]`|`-`|
-|footerPosition|The position of footer|`'inner' \| 'outer'`|`inner`|
-|simple|Whether to enable simple mode|`boolean`|`-`|
-|loader|Load transition effect, set `true` to show the default loading effect|`boolean \| ReactNode`|`-`|
-|loaderClassName|The style of the loader, will override the default transition effect|`string \| string[]`|`-`|
-|error|Content displayed in error state|`ReactNode`|`-`|
-|preview|Whether to enable preview|`boolean`|`true`|
-|previewProps|Preview options (all options are optional) [ImagePreviewProps](#imagepreview)|`PartialImagePreviewProps`|`-`|
+|Property|Description|Type|DefaultValue|Version|
+|---|---|---|---|---|
+|style|Additional style|`CSSProperties`|`-`|-|
+|className|Additional css class|`string \| string[]`|`-`|-|
+|src|Image path|`string`|`-`|-|
+|width|Image width|`string \| number`|`-`|-|
+|height|Image height|`string \| number`|`-`|-|
+|title|Image title|`string`|`-`|-|
+|description|Image description|`string`|`-`|-|
+|actions|Extra operations|`ReactNode[]`|`-`|-|
+|footerPosition|The position of footer|`'inner' \| 'outer'`|`inner`|-|
+|simple|Whether to enable simple mode|`boolean`|`-`|-|
+|loader|Load transition effect, set `true` to show the default loading effect|`boolean \| ReactNode`|`-`|-|
+|loaderClassName|The style of the loader, will override the default transition effect|`string \| string[]`|`-`|-|
+|error|Content displayed in error state|`ReactNode`|`-`|-|
+|preview|Whether to enable preview|`boolean`|`true`|-|
+|previewProps|Preview options (all options are optional) [ImagePreviewProps](#imagepreview)|`PartialImagePreviewProps`|`-`|-|
+|index|Use `Image.PreviewGroup` to wrap the preview index. Generally, you don't need to specify it. When there is a problem with the preview order of multiple images, you can manually specify the preview order of the current `image`|`number`|`-`|2.23.0|
 
 ### Image.Preview
 
@@ -46,6 +47,7 @@ Show and preview pictures.
 |closable|Whether display close button|`boolean`|`true`|2.16.0|
 |actions|Extra operations, [ImagePreviewActionProps](#imagepreviewactionprops)|`ImagePreviewActionProps[]`|`-`|-|
 |actionsLayout|The layout of the control bar|`string[]`|`['fullScreen', 'rotateRight', 'rotateLeft', 'zoomIn', 'zoomOut', 'originalSize', 'extra']`|-|
+|scales|The zoom percentage in the current array is used when previewing zooms. If `100%` is not included, the `100%` scale will be automatically added in the most adjacent position.|`number[]`|`[25, 33, 50, 67, 75, 80, 90, 100, 110, 125, 150, 175, 200, 250, 300, 400, 500];`|2.30.0|
 |onVisibleChange|Callback when visibility changes|`(visible: boolean, preVisible: boolean) => void`|`-`|-|
 |getPopupContainer|Get popup's parent node|`() => HTMLElement`|`() => document.body`|2.16.0|
 |escToExit|Whether to enable pressing `ESC` to close the preview.|`boolean`|`true`|2.24.0|
@@ -72,6 +74,7 @@ Start from `v2.14.0`
 |closable|Whether display close button|`boolean`|`true`|2.16.0|
 |actions|Extra operations, [ImagePreviewActionProps](#imagepreviewactionprops)|`ImagePreviewActionProps[]`|`-`|-|
 |actionsLayout|The layout of the control bar|`string[]`|`['fullScreen', 'rotateRight', 'rotateLeft', 'zoomIn', 'zoomOut', 'originalSize', 'extra']`|-|
+|scales|The zoom percentage in the current array is used when previewing zooms. If `100%` is not included, the `100%` scale will be automatically added in the most adjacent position.|`number[]`|`[25, 33, 50, 67, 75, 80, 90, 100, 110, 125, 150, 175, 200, 250, 300, 400, 500];`|2.30.0|
 |escToExit|Whether to enable pressing `ESC` to close the preview.|`boolean`|`true`|2.24.0|
 
 ### ImagePreviewActionProps
diff --git a/components/Image/README.zh-CN.md b/components/Image/README.zh-CN.md
index a4885262..5bab0081 100644
--- a/components/Image/README.zh-CN.md
+++ b/components/Image/README.zh-CN.md
@@ -14,23 +14,24 @@
 
 ### Image
 
-|参数名|描述|类型|默认值|
-|---|---|---|---|
-|style|节点样式|`CSSProperties`|`-`|
-|className|节点类名|`string \| string[]`|`-`|
-|src|图片获取地址|`string`|`-`|
-|width|图片显示宽度|`string \| number`|`-`|
-|height|图片显示高度|`string \| number`|`-`|
-|title|标题|`string`|`-`|
-|description|描述|`string`|`-`|
-|actions|额外操作|`ReactNode[]`|`-`|
-|footerPosition|底部显示的位置|`'inner' \| 'outer'`|`inner`|
-|simple|是否开启简洁模式|`boolean`|`-`|
-|loader|加载过渡效果，为 true 显示默认加载效果|`boolean \| ReactNode`|`-`|
-|loaderClassName|loader 的样式，将覆盖默认过渡效果|`string \| string[]`|`-`|
-|error|error 状态下显示的内容|`ReactNode`|`-`|
-|preview|是否开启预览|`boolean`|`true`|
-|previewProps|预览的配置项 （所有选项都是可选的）[ImagePreviewProps](#imagepreview)|`PartialImagePreviewProps`|`-`|
+|参数名|描述|类型|默认值|版本|
+|---|---|---|---|---|
+|style|节点样式|`CSSProperties`|`-`|-|
+|className|节点类名|`string \| string[]`|`-`|-|
+|src|图片获取地址|`string`|`-`|-|
+|width|图片显示宽度|`string \| number`|`-`|-|
+|height|图片显示高度|`string \| number`|`-`|-|
+|title|标题|`string`|`-`|-|
+|description|描述|`string`|`-`|-|
+|actions|额外操作|`ReactNode[]`|`-`|-|
+|footerPosition|底部显示的位置|`'inner' \| 'outer'`|`inner`|-|
+|simple|是否开启简洁模式|`boolean`|`-`|-|
+|loader|加载过渡效果，为 true 显示默认加载效果|`boolean \| ReactNode`|`-`|-|
+|loaderClassName|loader 的样式，将覆盖默认过渡效果|`string \| string[]`|`-`|-|
+|error|error 状态下显示的内容|`ReactNode`|`-`|-|
+|preview|是否开启预览|`boolean`|`true`|-|
+|previewProps|预览的配置项 （所有选项都是可选的）[ImagePreviewProps](#imagepreview)|`PartialImagePreviewProps`|`-`|-|
+|index|使用 `Image.PreviewGroup`包裹时的预览索引，一般不用指定，当多图预览顺序出现问题时，可手动指定当前 `image` 的预览顺序|`number`|`-`|2.23.0|
 
 ### Image.Preview
 
@@ -46,6 +47,7 @@
 |closable|是否显示关闭按钮|`boolean`|`true`|2.16.0|
 |actions|额外操作，[ImagePreviewActionProps](#imagepreviewactionprops)|`ImagePreviewActionProps[]`|`-`|-|
 |actionsLayout|控制条的布局|`string[]`|`['fullScreen', 'rotateRight', 'rotateLeft', 'zoomIn', 'zoomOut', 'originalSize', 'extra']`|-|
+|scales|在预览缩放时会使用当前数组中的缩放百分比。若不包含 `100%`，则会自动添加在最相邻的位置。|`number[]`|`[25, 33, 50, 67, 75, 80, 90, 100, 110, 125, 150, 175, 200, 250, 300, 400, 500];`|2.30.0|
 |onVisibleChange|切换可见状态触发的事件|`(visible: boolean, preVisible: boolean) => void`|`-`|-|
 |getPopupContainer|弹出层挂载的节点|`() => HTMLElement`|`() => document.body`|2.16.0|
 |escToExit|按 `ESC` 键关闭预览|`boolean`|`true`|2.24.0|
@@ -72,6 +74,7 @@
 |closable|是否显示关闭按钮|`boolean`|`true`|2.16.0|
 |actions|额外操作，[ImagePreviewActionProps](#imagepreviewactionprops)|`ImagePreviewActionProps[]`|`-`|-|
 |actionsLayout|控制条的布局|`string[]`|`['fullScreen', 'rotateRight', 'rotateLeft', 'zoomIn', 'zoomOut', 'originalSize', 'extra']`|-|
+|scales|在预览缩放时会使用当前数组中的缩放百分比。若不包含 `100%`，则会自动添加在最相邻的位置。|`number[]`|`[25, 33, 50, 67, 75, 80, 90, 100, 110, 125, 150, 175, 200, 250, 300, 400, 500];`|2.30.0|
 |escToExit|按 `ESC` 键关闭预览|`boolean`|`true`|2.24.0|
 
 ### ImagePreviewActionProps
diff --git a/components/InputNumber/index.tsx b/components/InputNumber/index.tsx
index 78aa302f..1293196e 100644
--- a/components/InputNumber/index.tsx
+++ b/components/InputNumber/index.tsx
@@ -20,6 +20,7 @@ import { RefInputType } from '../Input/interface';
 import { InputNumberProps } from './interface';
 import useMergeProps from '../_util/hooks/useMergeProps';
 import omit from '../_util/omit';
+import { toFixed } from './utils';
 
 NP.enableBoundaryChecking(false);
 
@@ -140,7 +141,7 @@ function InputNumber(baseProps: InputNumberProps, ref) {
 
       return isNumber(finalValue)
         ? isNumber(mergedPrecision)
-          ? Number(finalValue.toFixed(mergedPrecision))
+          ? Number(toFixed(finalValue, mergedPrecision))
           : finalValue
         : undefined;
     },
@@ -200,7 +201,7 @@ function InputNumber(baseProps: InputNumberProps, ref) {
     if (isUserInputting) {
       _value = inputValue;
     } else if (isNumber(value) && isNumber(mergedPrecision)) {
-      _value = value.toFixed(mergedPrecision);
+      _value = toFixed(value, mergedPrecision);
     } else if (value == null) {
       _value = '';
     } else {
diff --git a/components/InputNumber/utils.ts b/components/InputNumber/utils.ts
new file mode 100644
index 00000000..9ddd91ec
--- /dev/null
+++ b/components/InputNumber/utils.ts
@@ -0,0 +1,5 @@
+// Replace number.toFixed with Math.round
+export function toFixed(number: number, precision: number): string {
+  const pow = 10 ** precision;
+  return (Math.round(number * pow) / pow).toFixed(precision);
+}
diff --git a/components/Mentions/index.tsx b/components/Mentions/index.tsx
index 47a3a6f9..902add5b 100644
--- a/components/Mentions/index.tsx
+++ b/components/Mentions/index.tsx
@@ -4,7 +4,7 @@ import { ConfigContext } from '../ConfigProvider';
 import Input from '../Input';
 import Select from '../Select';
 import { MentionsProps } from './interface';
-import { Esc, Enter, ArrowUp, ArrowDown } from '../_util/keycode';
+import { ArrowDown, ArrowUp, Enter, Esc } from '../_util/keycode';
 import { getBeforeSelectionText, getLastMeasureIndex, isValidSearch } from './utils';
 import useMergeValue from '../_util/hooks/useMergeValue';
 import useMergeProps from '../_util/hooks/useMergeProps';
@@ -37,6 +37,7 @@ function Mentions(baseProps: MentionsProps, ref) {
     getPopupContainer,
     onChange,
     onSearch,
+    notFoundContent,
     ...rest
   } = props;
 
@@ -161,7 +162,7 @@ function Mentions(baseProps: MentionsProps, ref) {
             ref={refSelect}
             options={options}
             inputValue={measureInfo.text}
-            notFoundContent={null}
+            notFoundContent={notFoundContent}
             triggerElement={
               <span className={`${prefixCls}-measure-trigger`}>{measureInfo.prefix}</span>
             }
diff --git a/components/Pagination/README.zh-CN.md b/components/Pagination/README.zh-CN.md
index 42162412..74500e79 100644
--- a/components/Pagination/README.zh-CN.md
+++ b/components/Pagination/README.zh-CN.md
@@ -30,6 +30,7 @@
 |showTotal|是否显示数据总数|`boolean \| ((total: number, range: number[]) => ReactNode)`|`-`|-|
 |sizeCanChange|是否可以改变每页条数|`boolean`|`true`|-|
 |sizeOptions|每页可以显示数据条数|`number[]`|`-`|-|
+|bufferSize|`current` 页与 `...` 之间的页码个数|`number`|`2`|2.32.0|
 |onChange|变化时的回调|`(pageNumber: number, pageSize: number) => void`|`-`|-|
 |onPageSizeChange|pageSize 变化时的回调|`(size: number, current: number) => void`|`-`|-|
 |pageSizeChangeResetCurrent|`pageSize` 改变的时候重置当前页码为 `1`|`boolean`|`true`|-|
diff --git a/components/Pagination/page-item.tsx b/components/Pagination/page-item.tsx
index 997fe444..21df9a2e 100644
--- a/components/Pagination/page-item.tsx
+++ b/components/Pagination/page-item.tsx
@@ -97,7 +97,7 @@ function Pager(props: PagerProps) {
       style={style}
       className={classnames}
       onClick={onClick}
-      aria-label={locale.Pagination.currentPage.replace('{0}', pageNum)}
+      aria-label={locale.Pagination.currentPage?.replace('{0}', pageNum)}
       {...ariaCurrentProps}
     >
       {itemRender ? itemRender(pageNum, 'page', pageNum) : pageNum}
@@ -141,8 +141,8 @@ export const JumpPager = (props: JumpPagerProps) => {
 
   const ariaLabel =
     jumpPage > 0
-      ? locale.Pagination.nextSomePages.replace('{0}', jumpPage)
-      : locale.Pagination.prevSomePages.replace('{0}', -jumpPage);
+      ? locale.Pagination.nextSomePages?.replace('{0}', jumpPage)
+      : locale.Pagination.prevSomePages?.replace('{0}', -jumpPage);
 
   return (
     <li style={pageItemStyle} className={cls} onClick={onClick} aria-label={ariaLabel}>
diff --git a/components/Pagination/pagination.tsx b/components/Pagination/pagination.tsx
index 0cea8c58..601b11f1 100644
--- a/components/Pagination/pagination.tsx
+++ b/components/Pagination/pagination.tsx
@@ -290,7 +290,7 @@ function Pagination(baseProps: PaginationProps, ref) {
   if (typeof showTotal === 'boolean' && showTotal) {
     totalElement = (
       <div className={`${prefixCls}-total-text`}>
-        {locale.Pagination.total.replace('{0}', total)}
+        {locale.Pagination.total?.replace('{0}', total)}
       </div>
     );
   }
diff --git a/components/Radio/interface.ts b/components/Radio/interface.ts
index 093c55b0..dbaa1579 100644
--- a/components/Radio/interface.ts
+++ b/components/Radio/interface.ts
@@ -86,9 +86,6 @@ export interface RadioGroupProps {
   options?: (string | number | { label: ReactNode; value: any; disabled?: boolean })[];
 }
 
-/**
- * @title RadioGroupContext
- */
 export interface RadioGroupContextProps {
   type: 'radio' | 'button';
   value?: any;
diff --git a/components/Slider/README.en-US.md b/components/Slider/README.en-US.md
index 59340b44..01236410 100644
--- a/components/Slider/README.en-US.md
+++ b/components/Slider/README.en-US.md
@@ -30,7 +30,7 @@ A Slider component for displaying current value and intervals in range.
 |defaultValue|To set default value|`number \| number[]`|`-`|-|
 |value|To set value|`number \| number[]`|`-`|-|
 |vertical|Whether to display the slider in the vertical direction|`boolean`|`-`|-|
-|showInput|Whether to display the input box. If `onlyMarkValue` is `true`, the input box will always be hidden.|`boolean`|`-`|-|
+|showInput|Whether to display the input box. If `onlyMarkValue` is `true`, the input box will always be hidden. Accepts `props` for `InputNumber`.|`boolean \| InputNumberProps \| InputNumberProps[]`|`-`|`InputNumberProps` in `2.32.0`|
 |getTooltipContainer|The parent node which the `tooltip` will be rendered to|`() => Element`|`-`|-|
 |formatTooltip|Format the content of `tooltip`|`(value: number) => string \| ReactNode`|`-`|-|
 |reverse|Reverse axis|`boolean`|`-`|-|
diff --git a/components/Slider/README.zh-CN.md b/components/Slider/README.zh-CN.md
index 9eeddc0a..8a9fb536 100644
--- a/components/Slider/README.zh-CN.md
+++ b/components/Slider/README.zh-CN.md
@@ -30,7 +30,7 @@
 |defaultValue|默认值|`number \| number[]`|`-`|-|
 |value|值|`number \| number[]`|`-`|-|
 |vertical|是否竖直方向|`boolean`|`-`|-|
-|showInput|是否展示输入框。`onlyMarkValue` 为 `true` 时输入框始终隐藏|`boolean`|`-`|-|
+|showInput|是否展示输入框，`onlyMarkValue` 为 `true` 时输入框始终隐藏。可接受 `InputNumber` 的 `props`。|`boolean \| InputNumberProps \| InputNumberProps[]`|`-`|`InputNumberProps` in `2.32.0`|
 |getTooltipContainer|设置 `tooltip` 所插入的父元素|`() => Element`|`-`|-|
 |formatTooltip|格式化 `tooltip` 内容|`(value: number) => string \| ReactNode`|`-`|-|
 |reverse|反向坐标轴|`boolean`|`-`|-|
diff --git a/components/Table/README.en-US.md b/components/Table/README.en-US.md
index 9bc78ecc..82cae7f7 100644
--- a/components/Table/README.en-US.md
+++ b/components/Table/README.en-US.md
@@ -17,7 +17,7 @@ Used for data collection, display, analysis, and processing.
 |style|Additional style|`CSSProperties`|`-`|-|
 |className|Additional css class|`string \| string[]`|`-`|-|
 |tableLayoutFixed|The table's `table-layout` property is set to `fixed`. After set to `fixed`, the width of the table will not be stretched by the content beyond 100%.|`boolean`|`-`|-|
-|rowKey|Table row key|`string \| ((record: T) => string)`|`key`|-|
+|rowKey|Table row key|`React.Key \| ((record: T) => React.Key)`|`key`|-|
 |columns|An array of column objects|`ColumnProps<T>[]`|`-`|-|
 |components|Override native table tag|`ComponentsProps`|`-`|-|
 |data|Data record array to be displayed|`T[]`|`-`|-|
diff --git a/components/Table/README.zh-CN.md b/components/Table/README.zh-CN.md
index c20531d7..40bcba12 100644
--- a/components/Table/README.zh-CN.md
+++ b/components/Table/README.zh-CN.md
@@ -17,7 +17,7 @@
 |style|节点样式|`CSSProperties`|`-`|-|
 |className|节点类名|`string \| string[]`|`-`|-|
 |tableLayoutFixed|表格的 `table-layout` 属性设置为 `fixed`，设置为 `fixed` 后，表格的宽度不会被内容撑开超出 100%。|`boolean`|`-`|-|
-|rowKey|表格行 key 的取值字段|`string \| ((record: T) => string)`|`key`|-|
+|rowKey|表格行 key 的取值字段|`React.Key \| ((record: T) => React.Key)`|`key`|-|
 |columns|列描述数据对象的数组|`ColumnProps<T>[]`|`-`|-|
 |components|覆盖原生表格标签|`ComponentsProps`|`-`|-|
 |data|表格数据|`T[]`|`-`|-|
diff --git a/components/Table/interface.tsx b/components/Table/interface.tsx
index c3f1a20b..b12f2803 100644
--- a/components/Table/interface.tsx
+++ b/components/Table/interface.tsx
@@ -30,7 +30,7 @@ export interface TableProps<T = any> {
    * @en Table row key
    * @defaultValue key
    */
-  rowKey?: string | ((record: T) => string);
+  rowKey?: React.Key | ((record: T) => React.Key);
   /**
    * @zh 列描述数据对象的数组
    * @en An array of column objects
@@ -593,7 +593,7 @@ export interface TheadProps<T = any> {
   rowSelection?: RowSelectionProps;
   columnTitle?: string | ReactNode;
   currentFilters?: Partial<Record<keyof T, string[]>>;
-  rowKey?: string | ((record: T) => string);
+  rowKey?: TableProps['rowKey'];
   components?: ComponentsProps;
   expandProps?: ExpandProps<T>;
   allSelectedRowKeys?: (string | number)[];
diff --git a/components/Timeline/README.en-US.md b/components/Timeline/README.en-US.md
index 43006e78..7aff192c 100644
--- a/components/Timeline/README.en-US.md
+++ b/components/Timeline/README.en-US.md
@@ -20,7 +20,7 @@ Display information content in chronological or reverse order.
 |className|Additional css class|`string \| string[]`|`-`|
 |reverse|Whether Reverse order|`boolean`|`-`|
 |direction|Timeline direction|`'horizontal' \| 'vertical'`|`vertical`|
-|mode|The display mode of Timeline|`'left' \| 'right' \| 'alternate'`|`left`|
+|mode|The display mode of Timeline|`'left' \| 'right' \| 'top' \| 'bottom' \| 'alternate'`|`left(vertical) \| top(horizontal)`|
 |pending|Whether to display ghost nodes. When set to true, only ghost nodes are displayed. When passed to ReactNode, it will be displayed as node content|`boolean \| ReactNode`|`-`|
 |pendingDot|You can pass in ReactNode to customize the ghost node|`ReactNode`|`<Spin size={12} />`|
 |labelPosition|Position of label text|`'relative' \| 'same'`|`same`|
diff --git a/components/Timeline/README.zh-CN.md b/components/Timeline/README.zh-CN.md
index ae03b526..451c3e20 100644
--- a/components/Timeline/README.zh-CN.md
+++ b/components/Timeline/README.zh-CN.md
@@ -20,7 +20,7 @@
 |className|节点类名|`string \| string[]`|`-`|
 |reverse|是否倒序|`boolean`|`-`|
 |direction|时间轴方向|`'horizontal' \| 'vertical'`|`vertical`|
-|mode|时间轴的展示类型：时间轴在左侧，时间轴在右侧, 交替出现。|`'left' \| 'right' \| 'alternate'`|`left`|
+|mode|时间轴的展示类型：时间轴在左侧/右侧(垂直方向)、上方/下方（水平方向），或交替出现。|`'left' \| 'right' \| 'top' \| 'bottom' \| 'alternate'`|`left(vertical) \| top(horizontal)`|
 |pending|是否展示幽灵节点，设置为 true 时候只展示幽灵节点。传入ReactNode时，会作为节点内容展示。|`boolean \| ReactNode`|`-`|
 |pendingDot|可以传入 ReactNode 定制幽灵节点|`ReactNode`|`<Spin size={12} />`|
 |labelPosition|设置标签文本的位置|`'relative' \| 'same'`|`same`|
diff --git a/components/Tree/README.zh-CN.md b/components/Tree/README.zh-CN.md
index 0c5d3fce..7bfbde08 100644
--- a/components/Tree/README.zh-CN.md
+++ b/components/Tree/README.zh-CN.md
@@ -22,7 +22,7 @@
 |multiple|是否支持多选|`boolean`|`-`|-|
 |checkable|是否在节点前添加选框|`boolean`|`-`|-|
 |draggable|是否可拖拽|`boolean`|`-`|-|
-|allowDrop|是否允许拖拽时放置在该节点.(`dragNode` in `2.23.0`)|`AllowDrop`|`() => true`|2.7.0|
+|allowDrop|是否允许拖拽时放置在该节点。 (`dragNode` in `2.23.0`)|`AllowDrop`|`() => true`|2.7.0|
 |selectable|是否可以选择|`boolean`|`true`|-|
 |checkStrictly|是否取消父子节点关联|`boolean`|`-`|-|
 |checkedStrategy|定制回填方式 <br/> all: 返回所有选中的节点<br/> parent: 父子节点都选中时只返回父节点 <br/> child: 只返回子节点|`SHOW_ALL \| SHOW_PARENT \| SHOW_CHILD`|`all`|-|
diff --git a/components/Typography/README.zh-CN.md b/components/Typography/README.zh-CN.md
index 25af7a87..58dd3fb2 100644
--- a/components/Typography/README.zh-CN.md
+++ b/components/Typography/README.zh-CN.md
@@ -50,7 +50,8 @@
 |underline|下划线样式|`boolean`|`-`|-|
 |delete|删除线样式|`boolean`|`-`|-|
 |code|代码块样式|`boolean`|`-`|-|
-|editable|开启可编辑功能|`\| boolean\| {editing?: boolean;onStart?:
+|editable|开启可编辑功能|`\| boolean\| {editing?: boolean;onStart?: (text, e) => void;onChange?: (text) => void;onEnd?: (text) => void;}`|`-`|`onStart` params `e` in `2.31.0`|
+|copyable|开启复制功能|`\| boolean\| {text?: string;onCopy?: (text: string, e) => void;icon?: ReactNode;tooltips?: [ReactNode, ReactNode];}`|`-`|`onCopy` params `e` in `2.31.0`|
 |ellipsis|自动溢出省略（只支持字符串），具体参数配置看 [EllipsisConfig](#ellipsisconfig)|`boolean \| EllipsisConfig`|`-`|-|
 
 ### Typography.Text
diff --git a/components/_class/notification.tsx b/components/_class/notification.tsx
index 8eacd0cc..9e56dc5f 100644
--- a/components/_class/notification.tsx
+++ b/components/_class/notification.tsx
@@ -5,7 +5,7 @@ function getId(noticeProps) {
   if (noticeProps.id) {
     return noticeProps.id;
   }
-  return `arco_notice_id_${Date.now()}`;
+  return `arco_notice_id_${Math.random().toFixed(10).slice(2)}`;
 }
 
 interface BaseNoticeState {
@@ -25,20 +25,24 @@ class BaseNotice extends Component<any, BaseNoticeState> {
   }
 
   add = (noticeProps) => {
-    const oldNotices = this.state.notices;
-    // update notice
-    if (noticeProps.id && ~oldNotices.findIndex((notice) => notice.id === noticeProps.id)) {
-      this.update(noticeProps);
-      return noticeProps.id;
-    }
     const id: string = getId(noticeProps);
-    const newNotices = oldNotices.concat({
-      ...noticeProps,
-      id,
-    });
-    this.setState({
-      notices: newNotices,
-      position: noticeProps.position,
+
+    this.setState((prevState) => {
+      const oldNotices = prevState.notices;
+
+      // update notice
+      if (noticeProps.id && ~oldNotices.findIndex((notice) => notice.id === noticeProps.id)) {
+        this.update(noticeProps);
+        return prevState;
+      }
+
+      return {
+        notices: oldNotices.concat({
+          ...noticeProps,
+          id,
+        }),
+        position: noticeProps.position,
+      };
     });
     return id;
   };


Test patch:
diff --git a/components/InputNumber/__test__/index.test.tsx b/components/InputNumber/__test__/index.test.tsx
index 4d677eb4..a765c578 100644
--- a/components/InputNumber/__test__/index.test.tsx
+++ b/components/InputNumber/__test__/index.test.tsx
@@ -130,10 +130,14 @@ describe('InputNumber ', () => {
   });
 
   it('props precision correctly', () => {
-    const wrapper = mountInputNumber(
-      <InputNumber defaultValue={6} min={0} max={15} step={0.01} precision={3} />
-    );
-    expect(+wrapper.find('input').prop('value')).toBe(6);
+    let wrapper = mountInputNumber(<InputNumber defaultValue={6} step={0.01} precision={3} />);
+    expect(wrapper.find('input').prop('value')).toBe('6.000');
+
+    wrapper = mountInputNumber(<InputNumber defaultValue={6.1234} precision={3} />);
+    expect(wrapper.find('input').prop('value')).toBe('6.123');
+
+    wrapper = mountInputNumber(<InputNumber defaultValue={6.1235} precision={3} />);
+    expect(wrapper.find('input').prop('value')).toBe('6.124');
   });
 
   describe('formatter', () => {