为什么在对枚举类型使用常量时打字稿会出错?
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.
当我尝试为下面的字段传递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.