为什么在对枚举类型使用常量时打字稿会出错?

Why does typescript give an error when using a constant for an enum type?

当我尝试为下面的字段传递conatant而不是就地值时,出现类型错误,但如果我使用就地值,一切正常

import * as z from "zod";

const data = ["1", "2"];

// this way works fine
/*
  age: z.enum<any, [string, ...string[]]>(["1", "2"])
*/

const schema = z.object({
  name: z.number(),
  age: z.enum<any, [string, ...string[]]>(data) // error here
});

这是z.enum类型的样子

declare function createZodEnum<U extends string, T extends Readonly<[U, ...U[]]>>(values: T): ZodEnum<Writeable<T>>;

请注意 T extends Readonly<[U, ...U[]]>,它需要类似 ['foo', 'bar', /* etc */] 的类型,但不需要 Array<string>

在您的代码中,

const data = ["1", "2"];

实际上推断为

const data: Array<string> = ["1", "2"];

你可以

const data = ["1", "2"] as const;

或者按照你注释掉的方式。


注意README是怎么说的

Alternatively, use as const to define your enum values as a tuple of strings. See the const assertion docs for details.