是的条件验证和 TypeScript

问题描述 投票:0回答:3

给出以下界面和相应的

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
的合适类型是什么?

typescript yup
3个回答
2
投票

对我有用的是这样的:

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
  )
});

我设法让打字稿与第一个参数和模式属性一起工作,但遗憾的是不能自动工作。


0
投票

你能尝试这样的事情吗

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() 
}

0
投票

这是执行以下操作的最佳且可读的方法:

首先你需要遵循他们的界面:

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(),
  }),
});
© www.soinside.com 2019 - 2024. All rights reserved.