在 yup 模式中使用打字稿类型

Use typescript type in yup schema

是否可以在 yup 验证中使用打字稿类型?

是的,你可以:

yup.string().oneOf(['salami', 'tuna', 'cheese']);

在我的一个组件中,我定义了这种类型:

type toppings = 'salami' | 'tuna' | 'cheese';

我可以把这两个结合起来吗?即:

type toppings = 'salami' | 'tuna' | 'cheese';
yup.string().oneOf(toppings); // <- how?

您可以使用 yup.mixed<TYPE>() 传递您的通用类型。

yup.mixed<toppings>().oneOf(['salami', 'tuna', 'cheese']);

您将其作为 yup.string() 传递,但它不是字符串,它是 'salami' | 'tuna' | 'cheese' 的类型,它包含字符串但不是任何字符串,因此您需要使用 .mixed定义一个特定的值。

如果你不想直接传递带有类型值的数组,你可以看看如何制作它。

如果您想避免将类型转换为枚举,可以使用 const 断言以@Vencovsky 的回答为基础。

const possibleToppings = ['salami', 'tuna', 'cheese'] as const;

type toppings = typeof possibleToppings[number]; // 'salami' | 'tuna' | 'cheese'

yup.mixed<toppings>().oneOf([...possibleToppings]);