Yup villkorlig validering och TypeScript


Givet följande gränssnitt och motsvarande Yup-schema. Finns det ett sätt för TypeScript att automatiskt härleda de villkorliga funktionsargumenten (t.ex. enabled och 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)
})

Jag har försökt yupObject()<Foo> och shape<Foo>(..) men ingen av dem hjälpte. Om det inte kan göras automatiskt, vilken är den lämpliga typen för schema i detta fall?

Svar #1

Vad som fungerade för mig var något i stil med detta:

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

Jag lyckades få Typescript att fungera med den första parametern och schemaegenskapen, men tyvärr inte automatiskt.

Svar #2

Kan du prova något liknande detta

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

Relaterade artiklar