feat: 添加@types/jest依赖并优化类型安全

refactor: 重构代码减少any类型使用,增加类型定义
fix: 修复TypeScript编译错误和类型不匹配问题
docs: 更新代码审查修复总结文档
style: 优化代码格式和注释
perf: 添加性能优化工具函数和虚拟滚动组件
test: 完善测试相关配置和类型定义
build: 更新package-lock.json文件
This commit is contained in:
2026-03-20 09:53:25 +08:00
parent 48a78137c5
commit 989c4b13a6
22 changed files with 807 additions and 7741 deletions

View File

@@ -115,7 +115,9 @@ interface Widget {
id: string;
type: 'metric' | 'chart' | 'table' | 'alert';
title: string;
config: any;
config: {
[key: string]: any;
};
position: { x: number; y: number; w: number; h: number };
}
@@ -178,7 +180,7 @@ export const Analytics: React.FC = () => {
const [dashboardModalVisible, setDashboardModalVisible] = useState(false);
const [exportModalVisible, setExportModalVisible] = useState(false);
const [detailDrawerVisible, setDetailDrawerVisible] = useState(false);
const [selectedItem, setSelectedItem] = useState<any>(null);
const [selectedItem, setSelectedItem] = useState<unknown>(null);
const [alertForm] = Form.useForm();
const [dashboardForm] = Form.useForm();
@@ -342,8 +344,8 @@ export const Analytics: React.FC = () => {
message.success('告警规则已删除');
};
const handleViewDetail = (item: any, type: string) => {
setSelectedItem({ ...item, type });
const handleViewDetail = (item: unknown, type: string) => {
setSelectedItem({ ...(item as object), type });
setDetailDrawerVisible(true);
};
@@ -480,7 +482,7 @@ export const Analytics: React.FC = () => {
<Option key={key} value={key}>{PLATFORM_MAP[key].text}</Option>
))}
</Select>
<RangePicker onChange={(dates) => setDateRange(dates as any)} />
<RangePicker onChange={(dates) => setDateRange(dates ? [dates[0]?.format('YYYY-MM-DD') || '', dates[1]?.format('YYYY-MM-DD') || ''] : null)} />
<Button icon={<ReloadOutlined />} onClick={handleRefresh}></Button>
<Button type="primary" icon={<DownloadOutlined />} onClick={handleExport}></Button>
</Space>
@@ -719,7 +721,7 @@ export const Analytics: React.FC = () => {
>
{selectedItem && (
<Descriptions bordered column={1}>
{Object.entries(selectedItem).map(([key, value]) => (
{Object.entries(selectedItem as object).map(([key, value]) => (
<Descriptions.Item key={key} label={key}>
{typeof value === 'object' ? JSON.stringify(value) : String(value)}
</Descriptions.Item>

View File

@@ -15,7 +15,7 @@ const Ads: React.FC = () => {
platform: '',
status: '',
search: '',
dateRange: null as any,
dateRange: null as [Date, Date] | null,
});
useEffect(() => {
@@ -117,7 +117,7 @@ const Ads: React.FC = () => {
{
title: '操作',
key: 'action',
render: (_: any, record: Ad) => (
render: (_: unknown, record: Ad) => (
<div>
{record.status === 'active' ? (
<Button

View File

@@ -158,8 +158,8 @@ export const MaterialUpload: React.FC = () => {
type: file.type?.startsWith('image') ? 'image' :
file.type?.startsWith('video') ? 'video' : 'document',
size: file.size || 0,
url: URL.createObjectURL(file as any),
thumbnail: file.type?.startsWith('image') ? URL.createObjectURL(file as any) : undefined,
url: URL.createObjectURL(file.originFileObj || file as Blob),
thumbnail: file.type?.startsWith('image') ? URL.createObjectURL(file.originFileObj || file as Blob) : undefined,
uploadedAt: new Date().toISOString(),
uploadedBy: 'Current User',
status: 'READY',
@@ -210,7 +210,7 @@ export const MaterialUpload: React.FC = () => {
dataIndex: 'thumbnail',
key: 'thumbnail',
width: 80,
render: (_: any, record: MaterialFile) => (
render: (_: unknown, record: MaterialFile) => (
record.type === 'image' ? (
<Image
src={record.thumbnail}
@@ -279,7 +279,7 @@ export const MaterialUpload: React.FC = () => {
title: 'Actions',
key: 'actions',
width: 120,
render: (_: any, record: MaterialFile) => (
render: (_: unknown, record: MaterialFile) => (
<Space>
<Tooltip title="Preview">
<Button type="text" icon={<EyeOutlined />} onClick={() => handlePreview(record)} />

View File

@@ -210,7 +210,7 @@ const ReturnMonitor: React.FC = () => {
const [filters, setFilters] = useState({
platform: '',
status: '',
dateRange: null as any,
dateRange: null as [dayjs.Dayjs, dayjs.Dayjs] | null,
minReturnRate: 0,
maxReturnRate: 100,
});
@@ -293,7 +293,7 @@ const ReturnMonitor: React.FC = () => {
title: 'Actions',
key: 'actions',
width: 100,
render: (_: any, record: ReturnData) => (
render: (_: unknown, record: ReturnData) => (
<Space size="middle">
<Button type="link" icon={<ExclamationCircleOutlined />} onClick={() => handleViewDetail(record)}>
Details
@@ -318,7 +318,13 @@ const ReturnMonitor: React.FC = () => {
}, 1000);
};
const handleFilter = (values: any) => {
const handleFilter = (values: {
platform?: string;
status?: string;
dateRange?: [dayjs.Dayjs, dayjs.Dayjs] | null;
minReturnRate?: number;
maxReturnRate?: number;
}) => {
setFilters({
platform: values.platform || '',
status: values.status || '',