From 33b08143234b393de246476fba5e8f92371cdb6a Mon Sep 17 00:00:00 2001 From: GuanMu Date: Thu, 9 Oct 2025 21:36:42 +0800 Subject: [PATCH] refactor(types): remove `any` usages and strengthen typings across web and base (#26677) --- .../share/text-generation/result/index.tsx | 8 ++-- .../workflow/hooks/use-workflow-history.ts | 12 +++--- .../variable/var-reference-picker.tsx | 2 +- .../json-schema-config.tsx | 2 +- .../visual-editor/edit-card/index.tsx | 10 +++-- web/service/base.ts | 39 +++++++++++++------ 6 files changed, 45 insertions(+), 28 deletions(-) diff --git a/web/app/components/share/text-generation/result/index.tsx b/web/app/components/share/text-generation/result/index.tsx index ddc0d772c3..7a4e606636 100644 --- a/web/app/components/share/text-generation/result/index.tsx +++ b/web/app/components/share/text-generation/result/index.tsx @@ -78,15 +78,15 @@ const Result: FC = ({ setRespondingFalse() }, [controlStopResponding]) - const [completionRes, doSetCompletionRes] = useState('') - const completionResRef = useRef() - const setCompletionRes = (res: any) => { + const [completionRes, doSetCompletionRes] = useState('') + const completionResRef = useRef('') + const setCompletionRes = (res: string) => { completionResRef.current = res doSetCompletionRes(res) } const getCompletionRes = () => completionResRef.current const [workflowProcessData, doSetWorkflowProcessData] = useState() - const workflowProcessDataRef = useRef() + const workflowProcessDataRef = useRef(undefined) const setWorkflowProcessData = (data: WorkflowProcess) => { workflowProcessDataRef.current = data doSetWorkflowProcessData(data) diff --git a/web/app/components/workflow/hooks/use-workflow-history.ts b/web/app/components/workflow/hooks/use-workflow-history.ts index a9b2f0f699..58bbe415a8 100644 --- a/web/app/components/workflow/hooks/use-workflow-history.ts +++ b/web/app/components/workflow/hooks/use-workflow-history.ts @@ -41,16 +41,16 @@ export const useWorkflowHistory = () => { const { store: workflowHistoryStore } = useWorkflowHistoryStore() const { t } = useTranslation() - const [undoCallbacks, setUndoCallbacks] = useState([]) - const [redoCallbacks, setRedoCallbacks] = useState([]) + const [undoCallbacks, setUndoCallbacks] = useState<(() => void)[]>([]) + const [redoCallbacks, setRedoCallbacks] = useState<(() => void)[]>([]) - const onUndo = useCallback((callback: unknown) => { - setUndoCallbacks((prev: any) => [...prev, callback]) + const onUndo = useCallback((callback: () => void) => { + setUndoCallbacks(prev => [...prev, callback]) return () => setUndoCallbacks(prev => prev.filter(cb => cb !== callback)) }, []) - const onRedo = useCallback((callback: unknown) => { - setRedoCallbacks((prev: any) => [...prev, callback]) + const onRedo = useCallback((callback: () => void) => { + setRedoCallbacks(prev => [...prev, callback]) return () => setRedoCallbacks(prev => prev.filter(cb => cb !== callback)) }, []) diff --git a/web/app/components/workflow/nodes/_base/components/variable/var-reference-picker.tsx b/web/app/components/workflow/nodes/_base/components/variable/var-reference-picker.tsx index ba27d023e7..4d74e09fde 100644 --- a/web/app/components/workflow/nodes/_base/components/variable/var-reference-picker.tsx +++ b/web/app/components/workflow/nodes/_base/components/variable/var-reference-picker.tsx @@ -127,7 +127,7 @@ const VarReferencePicker: FC = ({ const reactflow = useReactFlow() - const startNode = availableNodes.find((node: any) => { + const startNode = availableNodes.find((node: Node) => { return node.data.type === BlockEnum.Start }) diff --git a/web/app/components/workflow/nodes/llm/components/json-schema-config-modal/json-schema-config.tsx b/web/app/components/workflow/nodes/llm/components/json-schema-config-modal/json-schema-config.tsx index 4adb924190..be80a8aac7 100644 --- a/web/app/components/workflow/nodes/llm/components/json-schema-config-modal/json-schema-config.tsx +++ b/web/app/components/workflow/nodes/llm/components/json-schema-config-modal/json-schema-config.tsx @@ -120,7 +120,7 @@ const JsonSchemaConfig: FC = ({ setJson(JSON.stringify(schema, null, 2)) }, [currentTab]) - const handleSubmit = useCallback((schema: any) => { + const handleSubmit = useCallback((schema: Record) => { const jsonSchema = jsonToSchema(schema) as SchemaRoot if (currentTab === SchemaView.VisualEditor) setJsonSchema(jsonSchema) diff --git a/web/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/edit-card/index.tsx b/web/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/edit-card/index.tsx index 1db31cd470..4aa0f99d3f 100644 --- a/web/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/edit-card/index.tsx +++ b/web/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/edit-card/index.tsx @@ -152,14 +152,16 @@ const EditCard: FC = ({ }, [isAdvancedEditing, emitPropertyOptionsChange, currentFields]) const handleAdvancedOptionsChange = useCallback((options: AdvancedOptionsType) => { - let enumValue: any = options.enum - if (enumValue === '') { + let enumValue: SchemaEnumType | undefined + if (options.enum === '') { enumValue = undefined } else { - enumValue = options.enum.replace(/\s/g, '').split(',') + const stringArray = options.enum.replace(/\s/g, '').split(',') if (currentFields.type === Type.number) - enumValue = (enumValue as SchemaEnumType).map(value => Number(value)).filter(num => !Number.isNaN(num)) + enumValue = stringArray.map(value => Number(value)).filter(num => !Number.isNaN(num)) + else + enumValue = stringArray } setCurrentFields(prev => ({ ...prev, enum: enumValue })) if (isAdvancedEditing) return diff --git a/web/service/base.ts b/web/service/base.ts index 6e189f1481..358f54183b 100644 --- a/web/service/base.ts +++ b/web/service/base.ts @@ -180,7 +180,7 @@ const handleStream = ( let isFirstMessage = true function read() { let hasError = false - reader?.read().then((result: any) => { + reader?.read().then((result: ReadableStreamReadResult) => { if (result.done) { onCompleted?.() return @@ -322,7 +322,21 @@ const handleStream = ( const baseFetch = base -export const upload = async (options: any, isPublicAPI?: boolean, url?: string, searchParams?: string): Promise => { +type UploadOptions = { + xhr: XMLHttpRequest + method: string + url?: string + headers?: Record + data: FormData + onprogress?: (this: XMLHttpRequest, ev: ProgressEvent) => void +} + +type UploadResponse = { + id: string + [key: string]: unknown +} + +export const upload = async (options: UploadOptions, isPublicAPI?: boolean, url?: string, searchParams?: string): Promise => { const urlPrefix = isPublicAPI ? PUBLIC_API_PREFIX : API_PREFIX const token = await getAccessToken(isPublicAPI) const defaultOptions = { @@ -331,18 +345,18 @@ export const upload = async (options: any, isPublicAPI?: boolean, url?: string, headers: { Authorization: `Bearer ${token}`, }, - data: {}, } - options = { + const mergedOptions = { ...defaultOptions, ...options, - headers: { ...defaultOptions.headers, ...options.headers }, + url: options.url || defaultOptions.url, + headers: { ...defaultOptions.headers, ...options.headers } as Record, } return new Promise((resolve, reject) => { - const xhr = options.xhr - xhr.open(options.method, options.url) - for (const key in options.headers) - xhr.setRequestHeader(key, options.headers[key]) + const xhr = mergedOptions.xhr + xhr.open(mergedOptions.method, mergedOptions.url) + for (const key in mergedOptions.headers) + xhr.setRequestHeader(key, mergedOptions.headers[key]) xhr.withCredentials = true xhr.responseType = 'json' @@ -354,8 +368,9 @@ export const upload = async (options: any, isPublicAPI?: boolean, url?: string, reject(xhr) } } - xhr.upload.onprogress = options.onprogress - xhr.send(options.data) + if (mergedOptions.onprogress) + xhr.upload.onprogress = mergedOptions.onprogress + xhr.send(mergedOptions.data) }) } @@ -432,7 +447,7 @@ export const ssePost = async ( if (!/^[23]\d{2}$/.test(String(res.status))) { if (res.status === 401) { if (isPublicAPI) { - res.json().then((data: any) => { + res.json().then((data: { code?: string; message?: string }) => { if (isPublicAPI) { if (data.code === 'web_app_access_denied') requiredWebSSOLogin(data.message, 403)