实际上,出于某种奇怪的原因,我在本地遇到一个错误(使用zod v3.22.4),而在使用 v3.22.4 的 stackblitz 上遇到另一个错误,所以不确定,也许这两个错误都需要修复。
stackblitz 示例与我本地的代码相同,是这样的:
import { z } from 'zod';
type BuildCommandToDecompressWithUnarchiver = {
overwrite?: boolean;
password?: string;
output: {
directory: {
path: string;
};
};
input: {
file: {
path: string;
};
};
};
const BuildCommandToDecompressWithUnarchiverModel: z.ZodType<BuildCommandToDecompressWithUnarchiver> =
z.object({
overwrite: z.optional(z.boolean()).default(false),
password: z.optional(z.string()),
output: z.object({
directory: z.object({
path: z.string(),
}),
}),
input: z.object({
file: z.object({
path: z.string(),
}),
}),
});
export function buildCommandToDecompressWithUnarchiver(source) {
const input = BuildCommandToDecompressWithUnarchiverModel.parse(source);
const cmd = [
`unar`,
`${input.input.file.path}`,
`-o`,
`${input.output.directory.path}`,
];
cmd.push('--quiet');
if (input.overwrite) {
cmd.push(`-f`);
}
if (input.password) {
cmd.push(`-p`, input.password);
}
return cmd;
}
console.log(
BuildCommandToDecompressWithUnarchiverModel.parse({
output: {
directory: {
path: 'foo',
},
},
input: {
file: {
path: 'x.zip',
},
},
})
);
首先,旁注。我需要z.ZodType<BuildCommandToDecompressWithUnarchiver>
,因为在我的许多定义中,我使用嵌套模式,并且您必须经常使用此模式才能编译它。所以这需要留下来。
但我在 stackblitz 中得到的是:
Type 'ZodObject<{ overwrite: ZodDefault<ZodOptional<ZodBoolean>>; password: ZodOptional<ZodString>; output: ZodObject<{ directory: ZodObject<{ path: ZodString; }, "strip", ZodTypeAny, { ...; }, { ...; }>; }, "strip", ZodTypeAny, { ...; }, { ...; }>; input: ZodObject<...>; }, "strip", ZodTypeAny, { ...; }, { ...; }>' is not assignable to type 'ZodType<BuildCommandToDecompressWithUnarchiver, ZodTypeDef, BuildCommandToDecompressWithUnarchiver>'.
The types of '_type.output.directory' are incompatible between these types.
Type '{ path?: string; }' is not assignable to type '{ path: string; }'.
Property 'path' is optional in type '{ path?: string; }' but required in type '{ path: string; }'.(2322)
我没有看到任何地方被定义path
为可选,那么它是从哪里得到的呢?
但在本地,我看到了一个不同的错误:
Unsafe argument of type `any` assigned to a parameter of type `string`.eslint@typescript-eslint/no-unsafe-argument
(property) password?: string
我的代码库中有十几个地方出现“any
分配给类型参数的不安全参数类型”错误,所有地方都使用相同的模式来定义 zod 模式。string
知道如何修复最后一个(以及可能为什么 stackblitz 不复制而是显示不同的错误,我有时也会在本地得到该错误)?
我解决最后一个错误的方法是只执行input.password as string
,但这是不对的......此时已经保证输入了一个字符串。
至于stackbliz上的错误,我很确定这是typescript版本中的一个错误,你只需要使用关键字
as
来修复它:对于本地以上错误代码。这是因为 eslint 规则
@typescript-eslint
不允许不确定的类型。您可以通过以下方式安全地禁用它:或者