Na verdade, por algum motivo estranho, estou recebendo um erro localmente (com zod v3.22.4) e outro erro no stackblitz, usando v3.22.4, então não tenho certeza, talvez ambos os erros precisem ser corrigidos.
O exemplo do stackblitz , que é o mesmo código que tenho localmente, é este:
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',
},
},
})
);
Em primeiro lugar, nota lateral. Eu preciso z.ZodType<BuildCommandToDecompressWithUnarchiver>
porque em muitas das minhas definições eu uso esquemas aninhados e você precisa usar esse padrão com frequência para compilá-lo. Então isso precisa ficar.
Mas o que estou obtendo no 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)
Não vejo nenhum lugar que esteja definindo path
como opcional, então de onde isso vem?
Mas localmente, vejo um erro diferente:
Unsafe argument of type `any` assigned to a parameter of type `string`.eslint@typescript-eslint/no-unsafe-argument
(property) password?: string
Eu tenho aquele erro "Argumento inseguro do tipo any
atribuído a um parâmetro do tipo string
" em mais de uma dúzia de lugares na minha base de código, todos usando o mesmo padrão para definir esquemas zod. Alguma ideia de como consertar o último (e possivelmente por que o stackblitz não está reproduzindo e, em vez disso, mostra um erro diferente, que às vezes também recebo localmente)?
Minha maneira de contornar o último erro é apenas do input.password as string
, mas isso não está certo... Já é garantido que uma string foi digitada neste ponto.
Quanto ao erro no stackbliz, tenho certeza que é um bug na versão typescript, basta usar a palavra-chave
as
para corrigi-lo:para o código de erro local acima. Isso se deve a uma regra eslint que
@typescript-eslint
não permite tipos indeterminados. Você pode desativá-lo com segurança com:ou