给出以下界面和相应的
Yup
模式。 TypeScript 有没有办法自动推断条件函数参数(例如 enabled
和 schema
)?
import { object as yupObject, string as yupString, boolean as yupBoolean } from 'yup';
interface Foo {
enabled: boolean
name?: string
}
const fooSchema = yupObject().shape({
enabled: yupBoolean(),
name: yupString().when('enabled', (enabled, schema) => enabled ? schema.required() : schema)
})
我尝试过
yupObject()<Foo>
和shape<Foo>(..)
,但都没有帮助。如果无法自动完成,在这种情况下 schema
的合适类型是什么?
对我有用的是这样的:
import * as Yup from 'yup';
import { SchemaOf, StringSchema } from 'yup';
interface Foo {
enabled: boolean;
name?: string;
}
const FooSchemaObj: SchemaOf<Foo> = Yup.object({
enabled: Yup.boolean(),
name: Yup.string().when('enabled', (enabled: boolean, schema: StringSchema) =>
enabled ? schema.required() : schema
)
});
我设法让打字稿与第一个参数和模式属性一起工作,但遗憾的是不能自动工作。
你能尝试这样的事情吗
import * as Yup from "yup"
interface Foo {
enabled?: Yup.BooleanSchema
name?: Yup.StringSchema
}
const FooSchemaObj: Foo = {
name: Yup.string().when('enabled', (enabled, schema) => enabled ?
schema.required() : schema),
enabled: Yup.boolean()
}
这是执行以下操作的最佳且可读的方法:
首先你需要遵循他们的界面:
type ConditionConfig<T extends ISchema<any>> = {
is: any | ((...values: any[]) => boolean);
then?: (schema: T) => ISchema<any>;
otherwise?: (schema: T) => ISchema<any>;
};
then 和 other 的含义应该是返回类型模式的函数
const FooSchemaObj: string().when('enabled', {
is: 'enabled',
then: (schema) => schema.required(),
otherwise: (schema) => schema.notRequired(),
}),
});