如何在 zod 中为文件类型 `Record<string, File>` 创建类型
How to create a type for file type `Record<string, File>` in zod
我使用输入 type="file"
而不是在 FileData
中保存数据,我只使用普通对象并为其创建了一个类型:Record<string, File>
。它运行良好,但是当我尝试使用 zod
创建验证器时 – 我不知道如何为它创建相同的类型。
用法:
import { object as zodObject, string, number } from 'zod';
import { useValidators } from '../some';
const useValidation = () => {
const { createResolver } = useValidators();
return {
resolver: createResolver(
zodObject({
name: string(),
price: number(),
files: ???,
})
),
};
};
文档太过分了,但我找不到适合我的案例的示例:https://github.com/colinhacks/zod
输入的用法:
const App = () => {
const [files, setFiles] = useState<Record<string, File>>({});
return (
<input
type="file"
onChange={event => {
const files = event.target.files;
const newFiles: Record<string, File> = {};
const keys = Object.keys(files);
for(let i = 0; i < keys.length; i++) {
const file = newFiles[key];
newFiles[file.name] = file;
}
setFiles(newFiles);
}}
/>
)
}
我的同事找到了解决方案:
// useValidation file
import { object as zodObject, string, number, record, any } from 'zod';
import { useValidators } from '../some';
const useValidation = () => {
const { createResolver } = useValidators();
return {
resolver: createResolver(
zodObject({
name: string(),
price: number(),
files: record(any()).nullable(),
})
),
};
};
在使用带有文件数据的对象的文件中,我们这样使用:
// fileInput on `onRemove` action return `fileName: string` and my file object looks like this: { fileName: File }
const [files, setFiles] = useState<Record<string, File> | null>(null);
<FileInput
onChange={(fileName) => {
const updatedFiles = { ...files as Record<string, File> };
delete updatedFiles[fileName];
setFiles(updatedFiles);
}}
/>
zod架构:
file:
typeof window === "undefined"
? z.string()
: record(any()).nullable(),
初始值:
file: "undefined",
也许z.instanceof
可以解决?
如果您想验证文件类型...
z.instanceof (File)
或者,对于 FileList 类型...
z.instanceof (FileList)
我使用输入 type="file"
而不是在 FileData
中保存数据,我只使用普通对象并为其创建了一个类型:Record<string, File>
。它运行良好,但是当我尝试使用 zod
创建验证器时 – 我不知道如何为它创建相同的类型。
用法:
import { object as zodObject, string, number } from 'zod';
import { useValidators } from '../some';
const useValidation = () => {
const { createResolver } = useValidators();
return {
resolver: createResolver(
zodObject({
name: string(),
price: number(),
files: ???,
})
),
};
};
文档太过分了,但我找不到适合我的案例的示例:https://github.com/colinhacks/zod
输入的用法:
const App = () => {
const [files, setFiles] = useState<Record<string, File>>({});
return (
<input
type="file"
onChange={event => {
const files = event.target.files;
const newFiles: Record<string, File> = {};
const keys = Object.keys(files);
for(let i = 0; i < keys.length; i++) {
const file = newFiles[key];
newFiles[file.name] = file;
}
setFiles(newFiles);
}}
/>
)
}
我的同事找到了解决方案:
// useValidation file
import { object as zodObject, string, number, record, any } from 'zod';
import { useValidators } from '../some';
const useValidation = () => {
const { createResolver } = useValidators();
return {
resolver: createResolver(
zodObject({
name: string(),
price: number(),
files: record(any()).nullable(),
})
),
};
};
在使用带有文件数据的对象的文件中,我们这样使用:
// fileInput on `onRemove` action return `fileName: string` and my file object looks like this: { fileName: File }
const [files, setFiles] = useState<Record<string, File> | null>(null);
<FileInput
onChange={(fileName) => {
const updatedFiles = { ...files as Record<string, File> };
delete updatedFiles[fileName];
setFiles(updatedFiles);
}}
/>
zod架构:
file:
typeof window === "undefined"
? z.string()
: record(any()).nullable(),
初始值:
file: "undefined",
也许z.instanceof
可以解决?
如果您想验证文件类型...
z.instanceof (File)
或者,对于 FileList 类型...
z.instanceof (FileList)