そう、これは実行時の値の解析と検証のためのスキーマ ビルダーです。スキーマを定義する、一致するように値を変換する、既存の値の形状をアサートする、あるいはその両方を行います。そう、スキーマは非常に表現力が豊かで、複雑な相互依存の検証や値の変換をモデリングできます。
あなたは v1.0.0 のドキュメントを表示しています。v1 より前のドキュメントはここから入手できます。
キラー機能:
スキーマは、入力値に関するアサーション (テスト) と同様に、解析アクション (変換) で構成されます。入力値を検証して解析し、構成されたアサーションのセットを実行します。メソッドを連鎖させてスキーマを構築します。
import { object , string , number , date , InferType } from 'yup' ;
let userSchema = object ( {
name : string ( ) . required ( ) ,
age : number ( ) . required ( ) . positive ( ) . integer ( ) ,
email : string ( ) . email ( ) ,
website : string ( ) . url ( ) . nullable ( ) ,
createdOn : date ( ) . default ( ( ) => new Date ( ) ) ,
} ) ;
// parse and assert validity
let user = await userSchema . validate ( await fetchUser ( ) ) ;
type User = InferType < typeof userSchema > ;
/* {
name: string;
age: number;
email?: string | undefined
website?: string | null | undefined
createdOn: Date
}*/
スキーマを使用して、入力値を正しい型に強制または「キャスト」し、必要に応じて、それ以上のアサーションを行うことなく、その値をより具体的で具体的な値に変換します。
// Attempts to coerce values to the correct type
let parsedUser = userSchema . cast ( {
name : 'jimmy' ,
age : '24' ,
createdOn : '2014-09-23T19:25:25Z' ,
} ) ;
// ✅ { name: 'jimmy', age: 24, createdOn: Date }
入力値がすでに解析されていることをご存知ですか?入力を「厳密に」検証し、解析ロジックの実行によるオーバーヘッドを回避できます。
// ValidationError "age is not a number"
let parsedUser = await userSchema . validate (
{
name : 'jimmy' ,
age : '24' ,
} ,
{ strict : true } ,
) ;
yup
reach(schema: Schema, path: string, value?: object, context?: object): Schema
addMethod(schemaType: Schema, name: string, method: ()=> Schema): void
ref(path: string, options: { contextPrefix: string }): Ref
lazy((value: any) => Schema): Lazy
ValidationError(errors: string | Array<string>, value: any, path: string)
Schema
Schema.clone(): Schema
Schema.label(label: string): Schema
Schema.meta(metadata: SchemaMetadata): Schema
Schema.describe(options?: ResolveOptions): SchemaDescription
Schema.concat(schema: Schema): Schema
Schema.validate(value: any, options?: object): Promise<InferType<Schema>, ValidationError>
Schema.validateSync(value: any, options?: object): InferType<Schema>
Schema.validateAt(path: string, value: any, options?: object): Promise<InferType<Schema>, ValidationError>
Schema.validateSyncAt(path: string, value: any, options?: object): InferType<Schema>
Schema.isValid(value: any, options?: object): Promise<boolean>
Schema.isValidSync(value: any, options?: object): boolean
Schema.cast(value: any, options = {}): InferType<Schema>
Schema.isType(value: any): value is InferType<Schema>
Schema.strict(enabled: boolean = false): Schema
Schema.strip(enabled: boolean = true): Schema
Schema.withMutation(builder: (current: Schema) => void): void
Schema.default(value: any): Schema
Schema.getDefault(options?: object): Any
Schema.nullable(message?: string | function): Schema
Schema.nonNullable(message?: string | function): Schema
Schema.defined(): Schema
Schema.optional(): Schema
Schema.required(message?: string | function): Schema
Schema.notRequired(): Schema
Schema.typeError(message: string): Schema
Schema.oneOf(arrayOfValues: Array<any>, message?: string | function): Schema
エイリアス: equals
Schema.notOneOf(arrayOfValues: Array<any>, message?: string | function)
Schema.when(keys: string | string[], builder: object | (values: any[], schema) => Schema): Schema
Schema.test(name: string, message: string | function | any, test: function): Schema
Schema.test(options: object): Schema
Schema.transform((currentValue: any, originalValue: any) => any): Schema
string.required(message?: string | function): Schema
string.length(limit: number | Ref, message?: string | function): Schema
string.min(limit: number | Ref, message?: string | function): Schema
string.max(limit: number | Ref, message?: string | function): Schema
string.matches(regex: Regex, message?: string | function): Schema
string.matches(regex: Regex, options: { message: string, excludeEmptyString: bool }): Schema
string.email(message?: string | function): Schema
string.url(message?: string | function): Schema
string.uuid(message?: string | function): Schema
string.datetime(options?: {message?: string | function, allowOffset?: boolean, precision?: number})
string.datetime(message?: string | function)
string.ensure(): Schema
string.trim(message?: string | function): Schema
string.lowercase(message?: string | function): Schema
string.uppercase(message?: string | function): Schema
number.min(limit: number | Ref, message?: string | function): Schema
number.max(limit: number | Ref, message?: string | function): Schema
number.lessThan(max: number | Ref, message?: string | function): Schema
number.moreThan(min: number | Ref, message?: string | function): Schema
number.positive(message?: string | function): Schema
number.negative(message?: string | function): Schema
number.integer(message?: string | function): Schema
number.truncate(): Schema
number.round(type: 'floor' | 'ceil' | 'trunc' | 'round' = 'round'): Schema
date.min(limit: Date | string | Ref, message?: string | function): Schema
date.max(limit: Date | string | Ref, message?: string | function): Schema
array.of(type: Schema): this
array.json(): this
array.length(length: number | Ref, message?: string | function): this
array.min(limit: number | Ref, message?: string | function): this
array.max(limit: number | Ref, message?: string | function): this
array.ensure(): this
array.compact(rejector: (value) => boolean): Schema
object.shape(fields: object, noSortEdges?: Array<[string, string]>): Schema
object.json(): this
object.concat(schemaB: ObjectSchema): ObjectSchema
object.pick(keys: string[]): Schema
object.omit(keys: string[]): Schema
object.from(fromKey: string, toKey: string, alias: boolean = false): this
object.noUnknown(onlyKnownKeys: boolean = true, message?: string | function): Schema
object.camelCase(): Schema
object.constantCase(): Schema
スキーマ定義は、入力を目的の形状と型に操作する解析「変換」と、解析されたデータに対してアサーションを作成する「テスト」で構成されます。スキーマには、スキーマ自体に関する詳細である「メタデータ」も格納されます。これは、エラー メッセージの改善、スキーマを動的に使用するツールの構築、またはスキーマを別の形式にシリアル化するために使用できます。
最大限の柔軟性を実現するために、特定のニーズに合わせて解析とアサーションの両方を個別に実行できます。
各組み込み型は基本的な型解析を実装しており、JSON などのシリアル化されたデータを解析するときに便利です。さらに、型は有効にできる型固有の変換を実装します。
let num = number ( ) . cast ( '1' ) ; // 1
let obj = object ( {
firstName : string ( ) . lowercase ( ) . trim ( ) ,
} )
. json ( )
. camelCase ( )
. cast ( '{"first_name": "jAnE "}' ) ; // { firstName: 'jane' }
カスタム変換を追加可能
let reversedString = string ( )
. transform ( ( currentValue ) => currentValue . split ( '' ) . reverse ( ) . join ( '' ) )
. cast ( 'dlrow olleh' ) ; // "hello world"
変換は「パイプライン」を形成し、前の変換の値が次の変換にパイプされます。入力値がundefined
の場合、スキーマのデフォルトが設定されていればそれが適用されます。
気をつけて!値が変換関数で有効な型であることは保証されません。以前の変換が失敗した可能性があります。たとえば、数値変換では、入力値
NaN
または数値を受け取ることができます。
はい、スキーマは入力値に対して「テスト」を実行します。テストでは、入力がいくつかの基準に適合しているかどうかを確認します。テストは、入力 (またはその型) を変更または変更しないという点で変換とは異なり、通常、静的型で表現することが不可能ではないにしても困難なチェックのために予約されています。
string ( )
. min ( 3 , 'must be at least 3 characters long' )
. email ( 'must be a valid email' )
. validate ( 'no' ) ; // ValidationError
変換と同様に、テストもその場でカスタマイズできます
let jamesSchema = string ( ) . test (
'is-james' ,
( d ) => ` ${ d . path } is not James` ,
( value ) => value == null || value === 'James' ,
) ;
jamesSchema . validateSync ( 'James' ) ; // "James"
jamesSchema . validateSync ( 'Jane' ) ; // ValidationError "this is not James"
注意: 変換とは異なり、カスタム テストの
value
は正しい型 (この場合はオプションの文字列) であることが保証されています。このような場合でも、スキーマによってはundefined
またはnull
なる可能性があります。変換でプレゼンス関連のアサーションを行わない限り、値が存在しない場合はtrue
を返すことができます。テスト オプションskipAbsent
設定されている場合、これが行われます。
最も単純なケースでは、テスト関数はチェックに合格したかどうかに応じてtrue
またはfalse
を返します。テストが失敗した場合、そのテストの (またはデフォルトの) メッセージとともにValidationError
がスローされます。 ValidationErrors には、テストの名前、呼び出された引数 (存在する場合)、ネストされた検証の場合に失敗したフィールドへのパスなど、テストに関するその他のメタデータも多数含まれています。
エラー メッセージをオンザフライで作成して、スキーマが失敗する方法をカスタマイズすることもできます。
let order = object ( {
no : number ( ) . required ( ) ,
sku : string ( ) . test ( {
name : 'is-sku' ,
skipAbsent : true ,
test ( value , ctx ) {
if ( ! value . startsWith ( 's-' ) ) {
return ctx . createError ( { message : 'SKU missing correct prefix' } )
}
if ( ! value . endsWith ( '-42a' ) ) {
return ctx . createError ( { message : 'SKU missing correct suffix' } )
}
if ( value . length < 10 ) {
return ctx . createError ( { message : 'SKU is not the right length' } )
}
return true
}
} )
} )
order . validate ( { no : 1234 , sku : 's-1a45-14a' } )
スキーマは不変であり、メソッド呼び出しごとに新しいスキーマ オブジェクトが返されます。別のインスタンスを変更することを恐れることなく、それらを再利用して渡します。
let optionalString = string ( ) . optional ( ) ;
let definedString = optionalString . defined ( ) ;
let value = undefined ;
optionalString . isValid ( value ) ; // true
definedString . isValid ( value ) ; // false
はい、スキーマは静的な TypeScript インターフェイスを生成します。 InferType
使用してそのインターフェイスを抽出します。
import * as yup from 'yup' ;
let personSchema = yup . object ( {
firstName : yup . string ( ) . defined ( ) ,
nickName : yup . string ( ) . default ( '' ) . nullable ( ) ,
sex : yup
. mixed ( )
. oneOf ( [ 'male' , 'female' , 'other' ] as const )
. defined ( ) ,
email : yup . string ( ) . nullable ( ) . email ( ) ,
birthDate : yup . date ( ) . nullable ( ) . min ( new Date ( 1900 , 0 , 1 ) ) ,
} ) ;
interface Person extends yup . InferType < typeof personSchema > {
// using interface instead of type generally gives nicer editor feedback
}
スキーマのデフォルトは、キャストによってundefined
出力値が生成される場合に使用されます。このため、デフォルトの設定はスキーマの出力タイプに影響し、基本的にスキーマを「define()」としてマークします。
import { string } from 'yup' ;
let value : string = string ( ) . default ( 'hi' ) . validate ( undefined ) ;
// vs
let value : string | undefined = string ( ) . validate ( undefined ) ;
場合によっては、TypeScript 型がすでに存在しており、スキーマが互換性のある型を生成することを確認したいことがあります。
import { object , number , string , ObjectSchema } from 'yup' ;
interface Person {
name : string ;
age ?: number ;
sex : 'male' | 'female' | 'other' | null ;
}
// will raise a compile-time type error if the schema does not produce a valid Person
let schema : ObjectSchema < Person > = object ( {
name : string ( ) . defined ( ) ,
age : number ( ) . optional ( ) ,
sex : string < 'male' | 'female' | 'other' > ( ) . nullable ( ) . defined ( ) ,
} ) ;
// errors:
// "Type 'number | undefined' is not assignable to type 'string'."
let badSchema : ObjectSchema < Person > = object ( {
name : number ( ) ,
} ) ;
必要に応じて、TypeScript のインターフェイス結合動作を使用してスキーマ タイプを拡張できます。型拡張子は、 globals.d.ts
などの「アンビエント」型定義ファイルに含める必要があります。アプリケーション コードで yup 型を実際に拡張することを忘れないでください。
気をつけて!マージは、ジェネリックを含め、型定義がまったく同じである場合にのみ機能します。各タイプのソース コードを参照して、正しく定義していることを確認してください。
// globals.d.ts
declare module 'yup' {
interface StringSchema < TType , TContext , TDefault , TFlags > {
append ( appendStr : string ) : this ;
}
}
// app.ts
import { addMethod , string } from 'yup' ;
addMethod ( string , 'append' , function append ( appendStr : string ) {
return this . transform ( ( value ) => ` ${ value } ${ appendStr } ` ) ;
} ) ;
string ( ) . append ( '~~~~' ) . cast ( 'hi' ) ; // 'hi~~~~'
型推論を機能させるには、 strictNullChecks
コンパイラ オプションを有効にする必要があります。
また、機能的に優れた型を得るために、 strictFunctionTypes
false
に設定することをお勧めします。はい、これにより全体的な健全性が低下しますが、TypeScript ではメソッドとコンストラクターのこのチェックがすでに無効になっています (TS ドキュメントからのメモ)。
この機能の開発中に、DOM 内の一部を含む、本質的に安全でないクラス階層を多数発見しました。このため、この設定は関数構文で記述された関数にのみ適用され、メソッド構文の関数には適用されません。
効果はさまざまですが、このチェックでは実際のバグの多くは防げず、アプリ内での面倒な明示的な型キャストの量が増加することがわかりました。
検証テストでメッセージが提供されない場合に備えて、デフォルトのエラー メッセージをカスタマイズできます。カスタム辞書にメッセージが欠落している場合、エラー メッセージはデフォルトで Yup のメッセージになります。
import { setLocale } from 'yup' ;
setLocale ( {
mixed : {
default : 'Não é válido' ,
} ,
number : {
min : 'Deve ser maior que ${min}' ,
} ,
} ) ;
// now use Yup schemas AFTER you defined your custom dictionary
let schema = yup . object ( ) . shape ( {
name : yup . string ( ) ,
age : yup . number ( ) . min ( 18 ) ,
} ) ;
try {
await schema . validate ( { name : 'jimmy' , age : 11 } ) ;
} catch ( err ) {
err . name ; // => 'ValidationError'
err . errors ; // => ['Deve ser maior que 18']
}
多言語サポートが必要な場合は、はい、サポートされています。関数setLocale
変換キーと値を持つエラー オブジェクトを生成するために使用できる関数を受け入れます。これらは、お気に入りの i18n ライブラリにフィードできます。
import { setLocale } from 'yup' ;
setLocale ( {
// use constant translation keys for messages without values
mixed : {
default : 'field_invalid' ,
} ,
// use functions to generate an error object that includes the value from the schema
number : {
min : ( { min } ) => ( { key : 'field_too_short' , values : { min } } ) ,
max : ( { max } ) => ( { key : 'field_too_big' , values : { max } } ) ,
} ,
} ) ;
// ...
let schema = yup . object ( ) . shape ( {
name : yup . string ( ) ,
age : yup . number ( ) . min ( 18 ) ,
} ) ;
try {
await schema . validate ( { name : 'jimmy' , age : 11 } ) ;
} catch ( err ) {
messages = err . errors . map ( ( err ) => i18next . t ( err . key ) ) ;
}
yup
モジュールのエクスポート。
// core schema
import {
mixed ,
string ,
number ,
boolean ,
bool ,
date ,
object ,
array ,
ref ,
lazy ,
} from 'yup' ;
// Classes
import {
Schema ,
MixedSchema ,
StringSchema ,
NumberSchema ,
BooleanSchema ,
DateSchema ,
ArraySchema ,
ObjectSchema ,
} from 'yup' ;
// Types
import type { InferType , ISchema , AnySchema , AnyObjectSchema } from 'yup' ;
reach(schema: Schema, path: string, value?: object, context?: object): Schema
ネストされたスキーマの場合、 reach
指定されたパスに基づいて内部スキーマを取得します。
動的に解決する必要がある入れ子になったスキーマの場合は、 value
指定し、オプションでcontext
オブジェクトを指定できます。
import { reach } from 'yup' ;
let schema = object ( {
nested : object ( {
arr : array ( object ( { num : number ( ) . max ( 4 ) } ) ) ,
} ) ,
} ) ;
reach ( schema , 'nested.arr.num' ) ;
reach ( schema , 'nested.arr[].num' ) ;
reach ( schema , 'nested.arr[1].num' ) ;
reach ( schema , 'nested["arr"][1].num' ) ;
addMethod(schemaType: Schema, name: string, method: ()=> Schema): void
コア スキーマ タイプに新しいメソッドを追加します。 schemaType.prototype[name] = method
のより使いやすい便利なメソッド。
import { addMethod , date } from 'yup' ;
addMethod ( date , 'format' , function format ( formats , parseStrict ) {
return this . transform ( ( value , originalValue , ctx ) => {
if ( ctx . isType ( value ) ) return value ;
value = Moment ( originalValue , formats , parseStrict ) ;
return value . isValid ( ) ? value . toDate ( ) : new Date ( '' ) ;
} ) ;
} ) ;
すべてのスキーマ タイプにメソッドを追加する場合は、抽象基本クラスSchema
を拡張します。
import { addMethod , Schema } from 'yup' ;
addMethod ( Schema , 'myMethod' , ... )
ref(path: string, options: { contextPrefix: string }): Ref
別の兄弟フィールドまたは兄弟子孫フィールドへの参照を作成します。 Ref は検証/キャスト時に解決され、指定された場合にはサポートされます。 ref は、ref を使用するフィールドの前に ref 値が解決されるように、適切な順序で評価されます (循環依存関係に注意してください)。
import { ref , object , string } from 'yup' ;
let schema = object ( {
baz : ref ( 'foo.bar' ) ,
foo : object ( {
bar : string ( ) ,
} ) ,
x : ref ( '$x' ) ,
} ) ;
schema . cast ( { foo : { bar : 'boom' } } , { context : { x : 5 } } ) ;
// => { baz: 'boom', x: 5, foo: { bar: 'boom' } }
lazy((value: any) => Schema): Lazy
検証/キャスト時に評価されるスキーマを作成します。ツリーのような再帰的スキーマ、多態性フィールドおよび配列の作成に役立ちます。
注意!親子再帰オブジェクト スキーマを定義するときは、子のdefault()
をnull
にリセットする必要があります。そうしないと、オブジェクトをキャストするときにオブジェクト自体が無限にネストされてしまいます。
let node = object ( {
id : number ( ) ,
child : yup . lazy ( ( ) => node . default ( undefined ) ) ,
} ) ;
let renderable = yup . lazy ( ( value ) => {
switch ( typeof value ) {
case 'number' :
return number ( ) ;
case 'string' :
return string ( ) ;
default :
return mixed ( ) ;
}
} ) ;
let renderables = array ( ) . of ( renderable ) ;
ValidationError(errors: string | Array<string>, value: any, path: string)
検証が失敗した場合にスローされます。次のプロパティがあります。
name
: "検証エラー"type
: 失敗した特定のテスト タイプまたはテスト「名前」。value
: テストされたフィールド値。params
?: 最大値、正規表現などのテスト入力。path
: エラーがスローされた場所を示す文字列。 path
ルートレベルで空です。errors
: エラー メッセージの配列inner
: 集計エラーの場合、 inner は検証チェーンの前半でスローされるValidationErrors
の配列です。 abortEarly
オプションがfalse
の場合、ここでスローされた各エラーを検査できます。あるいは、 errors
は各内部エラーからのすべてのメッセージが含まれます。Schema
Schema
すべてのスキーマ タイプが継承する抽象基本クラスです。これは、他のすべてのスキーマ タイプに多数の基本メソッドとプロパティを提供します。
注: カスタム スキーマ タイプを作成する場合を除き、スキーマを直接使用しないでください。不明な型または任意の型の場合は、
mixed()
を使用します。
Schema.clone(): Schema
スキーマのディープコピーを作成します。クローンは、スキーマの状態が変化するたびに新しいスキーマを返すために内部的に使用されます。
Schema.label(label: string): Schema
エラー メッセージで使用されるキー名をオーバーライドします。
Schema.meta(metadata: SchemaMetadata): Schema
メタデータ オブジェクトに追加します。これは、キャスト オブジェクト自体に属さない、スキーマを含むデータの保存に役立ちます。
カスタムSchemaMetadata
インターフェイスは、 CustomSchemaMetadata
インターフェイスとマージすることで定義できます。まず、パッケージ内にyup.d.ts
ファイルを作成し、目的のCustomSchemaMetadata
インターフェイスを作成します。
// yup.d.ts
import 'yup' ;
declare module 'yup' {
// Define your desired `SchemaMetadata` interface by merging the
// `CustomSchemaMetadata` interface.
export interface CustomSchemaMetadata {
placeholderText ?: string ;
tooltipText ?: string ;
// …
}
}
Schema.describe(options?: ResolveOptions): SchemaDescription
スキーマの詳細 (メタ、ラベル、アクティブなテストなど) をシリアル化可能な記述オブジェクトに収集します。
let schema = object ( {
name : string ( ) . required ( ) ,
} ) ;
let description = schema . describe ( ) ;
動的コンポーネント (参照、遅延、または条件) を含むスキーマの場合、describe がスキーマの説明を正確に返すには、より多くのコンテキストが必要です。このような場合にはoptions
を提供します
import { ref , object , string , boolean } from 'yup' ;
let schema = object ( {
isBig : boolean ( ) ,
count : number ( ) . when ( 'isBig' , {
is : true ,
then : ( schema ) => schema . min ( 5 ) ,
otherwise : ( schema ) => schema . min ( 0 ) ,
} ) ,
} ) ;
schema . describe ( { value : { isBig : true } } ) ;
以下は説明タイプです。スキーマ タイプによって多少異なります。
interface SchemaDescription {
type : string ;
label ?: string ;
meta : object | undefined ;
oneOf : unknown [ ] ;
notOneOf : unknown [ ] ;
default ?: unknown ;
nullable : boolean ;
optional : boolean ;
tests : Array < { name ?: string ; params : ExtraParams | undefined } > ;
// Present on object schema descriptions
fields : Record < string , SchemaFieldDescription > ;
// Present on array schema descriptions
innerType ?: SchemaFieldDescription ;
}
type SchemaFieldDescription =
| SchemaDescription
| SchemaRefDescription
| SchemaLazyDescription ;
interface SchemaRefDescription {
type : 'ref' ;
key : string ;
}
interface SchemaLazyDescription {
type : string ;
label ?: string ;
meta : object | undefined ;
}
Schema.concat(schema: Schema): Schema
2 つのスキーマを結合して、スキーマの新しいインスタンスを作成します。同じタイプのスキーマのみを連結できます。 concat
、提供されたスキーマのすべての設定が、型、存在、Null 可能性を含むベース内の設定をオーバーライドするという意味での「マージ」関数ではありません。
mixed < string > ( ) . defined ( ) . concat ( mixed < number > ( ) . nullable ( ) ) ;
// produces the equivalent to:
mixed < number > ( ) . defined ( ) . nullable ( ) ;
Schema.validate(value: any, options?: object): Promise<InferType<Schema>, ValidationError>
入力値を解析して検証し、解析された値を返すか、エラーをスローします。このメソッドは非同期であり、値で満たされるか、 ValidationError
で拒否される Promise オブジェクトを返します。
value = await schema . validate ( { name : 'jimmy' , age : 24 } ) ;
validate
の動作をより具体的に制御するoptions
を提供します。
interface Options {
// when true, parsing is skipped and the input is validated "as-is"
strict: boolean = false ;
// Throw on the first error or collect and return all
abortEarly: boolean = true ;
// Remove unspecified keys from objects
stripUnknown: boolean = false ;
// when `false` validations will be performed shallowly
recursive: boolean = true ;
// External values that can be provided to validations and conditionals
context ?: object ;
}
Schema.validateSync(value: any, options?: object): InferType<Schema>
可能であれば検証を同期的に実行し、結果の値を返すか、ValidationError をスローします。 validate
と同じオプションをすべて受け入れます。
同期検証は、構成された非同期テスト (Promise を返すテストなど) が存在しない場合にのみ機能します。たとえば、これは機能します:
let schema = number ( ) . test (
'is-42' ,
"this isn't the number i want" ,
( value ) => value != 42 ,
) ;
schema . validateSync ( 23 ) ; // throws ValidationError
ただし、これでは次のことはできません。
let schema = number ( ) . test ( 'is-42' , "this isn't the number i want" , ( value ) =>
Promise . resolve ( value != 42 ) ,
) ;
schema . validateSync ( 42 ) ; // throws Error
Schema.validateAt(path: string, value: any, options?: object): Promise<InferType<Schema>, ValidationError>
スキーマ内で深くネストされたパスを検証します。 reach
仕組みと似ていますが、結果のスキーマを検証の対象として使用します。
注記!ここでの
value
、ネストされたパスの値ではなく、開始スキーマを基準としたルート値です。
let schema = object ( {
foo : array ( ) . of (
object ( {
loose : boolean ( ) ,
bar : string ( ) . when ( 'loose' , {
is : true ,
otherwise : ( schema ) => schema . strict ( ) ,
} ) ,
} ) ,
) ,
} ) ;
let rootValue = {
foo : [ { bar : 1 } , { bar : 1 , loose : true } ] ,
} ;
await schema . validateAt ( 'foo[0].bar' , rootValue ) ; // => ValidationError: must be a string
await schema . validateAt ( 'foo[1].bar' , rootValue ) ; // => '1'
Schema.validateSyncAt(path: string, value: any, options?: object): InferType<Schema>
validateAt
と同じですが、同期的です。
Schema.isValid(value: any, options?: object): Promise<boolean>
渡された値がスキーマと一致する場合にtrue
を返します。 isValid
非同期であり、Promise オブジェクトを返します。
validate()
と同じオプションを受け取ります。
Schema.isValidSync(value: any, options?: object): boolean
渡された値がスキーマと一致する場合、同期的にtrue
返します。
validateSync()
と同じオプションを使用し、非同期テストに関しても同じ注意事項があります。
Schema.cast(value: any, options = {}): InferType<Schema>
渡された値をスキーマに一致する値に強制的に変換しようとします。たとえば、 number()
型を使用すると、 '5'
5
にキャストされます。失敗したキャストは通常null
を返しますが、 NaN
や予期しない文字列などの結果を返す場合もあります。
validate
の動作をより具体的に制御するoptions
を提供します。
interface CastOptions < TContext extends { } > {
// Remove undefined properties from objects
stripUnknown : boolean = false ;
// Throws a TypeError if casting doesn't produce a valid type
// note that the TS return type is inaccurate when this is `false`, use with caution
assert ?: boolean = true ;
// External values that used to resolve conditions and references
context ?: TContext ;
}
Schema.isType(value: any): value is InferType<Schema>
渡されたvalue
に対して型チェックを実行します。一致する場合は true を返し、値をキャストしません。 nullable()
が設定されている場合、 null
は型の有効な値とみなされます。すべてのスキーマ タイプ チェックにはisType
使用する必要があります。
Schema.strict(enabled: boolean = false): Schema
strict
オプションをtrue
に設定します。厳密なスキーマは強制と変換の試行をスキップし、値を「そのまま」検証します。
Schema.strip(enabled: boolean = true): Schema
出力オブジェクトから削除されるスキーマをマークします。ネストされたスキーマとしてのみ機能します。
let schema = object ( {
useThis : number ( ) ,
notThis : string ( ) . strip ( ) ,
} ) ;
schema . cast ( { notThis : 'foo' , useThis : 4 } ) ; // => { useThis: 4 }
strip
が有効になっているスキーマの推論型はnever
なので、全体の型から削除できます。
let schema = object ( {
useThis : number ( ) ,
notThis : string ( ) . strip ( ) ,
} ) ;
InferType < typeof schema > ; /*
{
useThis?: number | undefined
}
*/
Schema.withMutation(builder: (current: Schema) => void): void
まず、法的に義務付けられているリッチ・ヒッキーの引用:
森の中で木が倒れたら音はしますか?
純粋な関数が不変の戻り値を生成するためにローカル データを変更した場合、それは問題ありませんか?
withMutation
使用すると、変更の前にクローンを作成するデフォルトの動作の代わりに、スキーマを適切な場所で変更できます。スキーマ変更の大部分は最初の宣言中に発生し、スキーマの存続期間中に 1 回だけ発生するため、パフォーマンスは問題にならないため、通常、これは必要ありません。ただし、キャスト/検証時 ( when()
) を使用した条件付きスキーマなど)、またはスキーマ オブジェクトのインスタンス化時に、特定の変更が発生します。
object ( )
. shape ( { key : string ( ) } )
. withMutation ( ( schema ) => {
return arrayOfObjectTests . forEach ( ( test ) => {
schema . test ( test ) ;
} ) ;
} ) ;
Schema.default(value: any): Schema
値がundefined
の場合に使用するデフォルト値を設定します。デフォルトは、安全なデフォルトが指定されていることを確認するために、変換の実行後、検証の前に作成されます。デフォルト値は使用するたびに複製されるため、オブジェクトと配列のパフォーマンスが低下する可能性があります。このオーバーヘッドを回避するために、新しいデフォルトを返す関数を渡すこともできます。 null
空ではない別の値とみなされます。
yup . string . default ( 'nothing' ) ;
yup . object . default ( { number : 5 } ) ; // object will be cloned every time a default is needed
yup . object . default ( ( ) => ( { number : 5 } ) ) ; // this is cheaper
yup . date . default ( ( ) => new Date ( ) ) ; // also helpful for defaults that change over time
Schema.getDefault(options?: object): Any
以前に設定されたデフォルト値を取得します。 getDefault
デフォルトを変更する可能性のあるすべての条件を解決します。必要に応じて、 context
付きのoptions
を渡します ( context
の詳細については、 Schema.validate
参照してください)。
Schema.nullable(message?: string | function): Schema
null
スキーマの有効な値であることを示します。 nullable()
がない場合、 null
別の型として扱われ、 Schema.isType()
チェックに失敗します。
let schema = number ( ) . nullable ( ) ;
schema . cast ( null ) ; // null
InferType < typeof schema > ; // number | null
Schema.nonNullable(message?: string | function): Schema
nullable
の逆で、スキーマの有効な型値からnull
削除します。スキーマはデフォルトでは null 値を許容できません。
let schema = number ( ) . nonNullable ( ) ;
schema . cast ( null ) ; // TypeError
InferType < typeof schema > ; // number
Schema.defined(): Schema
スキーマの値が必要です。 undefined
を除くすべてのフィールド値はこの要件を満たしています。
let schema = string ( ) . defined ( ) ;
schema . cast ( undefined ) ; // TypeError
InferType < typeof schema > ; // string
Schema.optional(): Schema
defined()
の逆では、指定された型に対してundefined
値を許可します。
let schema = string ( ) . optional ( ) ;
schema . cast ( undefined ) ; // undefined
InferType < typeof schema > ; // string | undefined
Schema.required(message?: string | function): Schema
スキーマを必須としてマークします。これにより、値としてundefined
またはnull
許可されなくなります。 required
optional()
およびnullable()
の呼び出しの効果を無効にします。
気をつけて!
string().required
) の動作は少し異なり、さらに必要な場合に空の文字列値 (''
) を防ぎます。
Schema.notRequired(): Schema
スキーマを不要としてマークします。これはschema.nullable().optional()
のショートカットです。
Schema.typeError(message: string): Schema
型チェックが失敗した場合のエラー メッセージを定義します。 ${value}
および${type}
補間はmessage
引数で使用できます。
Schema.oneOf(arrayOfValues: Array<any>, message?: string | function): Schema
エイリアス: equals
値のセットからの値のみを許可します。追加された値は、 notOneOf
値が存在する場合、そこから削除されます。 ${values}
補間はmessage
引数で使用できます。 ref が指定されている場合、 ${resolved}
補間をメッセージ引数で使用して、検証時にチェックされた解決された値を取得できます。
undefined
がarrayOfValues
に含まれていない場合でも、このバリデーターはundefined
で失敗しないことに注意してください。 undefined
有効な値にしたくない場合は、 Schema.required
使用できます。
let schema = yup . mixed ( ) . oneOf ( [ 'jimmy' , 42 ] ) ;
await schema . isValid ( 42 ) ; // => true
await schema . isValid ( 'jimmy' ) ; // => true
await schema . isValid ( new Date ( ) ) ; // => false
Schema.notOneOf(arrayOfValues: Array<any>, message?: string | function)
値のセットからの値を禁止します。追加された値は、 oneOf
値が存在する場合には削除されます。 ${values}
補間はmessage
引数で使用できます。 ref が指定されている場合、 ${resolved}
補間をメッセージ引数で使用して、検証時にチェックされた解決された値を取得できます。
let schema = yup . mixed ( ) . notOneOf ( [ 'jimmy' , 42 ] ) ;
await schema . isValid ( 42 ) ; // => false
await schema . isValid ( new Date ( ) ) ; // => true
Schema.when(keys: string | string[], builder: object | (values: any[], schema) => Schema): Schema
兄弟フィールドまたは兄弟フィールドに基づいてスキーマを調整します。キーis
値またはマッチャー関数であるオブジェクト リテラルを提供し、 then
真のスキーマや失敗条件のotherwise
情報を提供できます。
is
条件は厳密に比較されます ( ===
)。別の形式の等価性を使用したい場合は、次のような関数を提供できます: is: (value) => value == true
。
プロパティの前に$
を付けて、入力値の代わりにvalidate()
またはcast
によって渡されたcontext
に依存するプロパティを指定することもできます。
条件が加算されるwhen
。
then
およびotherwise
指定された関数(schema: Schema) => Schema
です。
let schema = object ( {
isBig : boolean ( ) ,
count : number ( )
. when ( 'isBig' , {
is : true , // alternatively: (val) => val == true
then : ( schema ) => schema . min ( 5 ) ,
otherwise : ( schema ) => schema . min ( 0 ) ,
} )
. when ( '$other' , ( [ other ] , schema ) =>
other === 4 ? schema . max ( 6 ) : schema ,
) ,
} ) ;
await schema . validate ( value , { context : { other : 4 } } ) ;
複数の依存キーを指定することもできます。その場合、各値は引数として分散されます。
let schema = object ( {
isSpecial : boolean ( ) ,
isBig : boolean ( ) ,
count : number ( ) . when ( [ 'isBig' , 'isSpecial' ] , {
is : true , // alternatively: (isBig, isSpecial) => isBig && isSpecial
then : ( schema ) => schema . min ( 5 ) ,
otherwise : ( schema ) => schema . min ( 0 ) ,
} ) ,
} ) ;
await schema . validate ( {
isBig : true ,
isSpecial : true ,
count : 10 ,
} ) ;
あるいは、現在のスキーマの指定されたキーごとに値の配列を使用して呼び出される、スキーマを返す関数を提供することもできます。
let schema = yup . object ( {
isBig : yup . boolean ( ) ,
count : yup . number ( ) . when ( 'isBig' , ( [ isBig ] , schema ) => {
return isBig ? schema . min ( 5 ) : schema . min ( 0 ) ;
} ) ,
} ) ;
await schema . validate ( { isBig : false , count : 4 } ) ;
Schema.test(name: string, message: string | function | any, test: function): Schema
検証チェーンにテスト関数を追加します。テストはオブジェクトがキャストされた後に実行されます。多くのタイプにはいくつかのテストが組み込まれていますが、カスタム テストを簡単に作成できます。非同期のカスタム検証を可能にするために、すべての(またはまったく) テストが非同期で実行されます。この結果、テストの実行順序は保証されなくなります。
すべてのテストは、 name
、エラーmessage
、および現在のvalue
が有効な場合はtrue
を返し、それ以外の場合はfalse
またはValidationError
返す検証関数を提供する必要があります。テストを非同期にするには、 true
またはfalse
を解決する Promise またはValidationError
を返します。
message
引数には、 ${param}
構文を使用して指定された場合に特定の値を補間する文字列を指定できます。デフォルトでは、すべてのテスト メッセージには、ネストされたスキーマで重要なpath
値が渡されます。
test
関数は現在のvalue
を使用して呼び出されます。より高度な検証については、代替署名を使用して、より多くのオプションを提供できます (以下を参照)。
let jimmySchema = string ( ) . test (
'is-jimmy' ,
'${path} is not Jimmy' ,
( value , context ) => value === 'jimmy' ,
) ;
// or make it async by returning a promise
let asyncJimmySchema = string ( )
. label ( 'First name' )
. test (
'is-jimmy' ,
( { label } ) => ` ${ label } is not Jimmy` , // a message can also be a function
async ( value , testContext ) =>
( await fetch ( '/is-jimmy/' + value ) ) . responseText === 'true' ,
) ;
await schema . isValid ( 'jimmy' ) ; // => true
await schema . isValid ( 'john' ) ; // => false
テスト関数は、2 番目の引数として特別なコンテキスト値を使用して呼び出され、いくつかの有用なメタデータと関数を公開します。アロー関数以外の場合、テスト コンテキストも関数this
として設定されます。 this
を介してアクセスすると、アロー関数では機能しないので注意してください。
testContext.path
: 現在の検証の文字列パスtestContext.schema
: テストの実行対象となる解決されたスキーマ オブジェクト。testContext.options
: validate() または isValid() が呼び出されたoptions
オブジェクトtestContext.parent
: ネストされたスキーマの場合、これは親オブジェクトの値ですtestContext.originalValue
: テストされる元の値testContext.createError(Object: { path: String, message: String, params: Object })
: 検証エラーを作成して返します。 path
、 params
、またはおそらくエラーmessage
を動的に設定するのに役立ちます。いずれかのオプションを省略すると、現在のパスまたはデフォルトのメッセージが使用されます。 Schema.test(options: object): Schema
代替のtest(..)
シグネチャ。 options
次のオプションのいくつかを含むオブジェクトです。
Options = {
// unique name identifying the test
name : string ;
// test function, determines schema validity
test: ( value : any ) => boolean ;
// the validation error message
message: string ;
// values passed to message for interpolation
params: ? object ;
// mark the test as exclusive, meaning only one test of the same name can be active at once
exclusive: boolean = false ;
}
排他的テストと非排他的テストを混合する場合は、次のロジックが使用されます。非排他的テストが、同じ名前の排他的テストを持つスキーマに追加された場合、その排他的テストは削除され、同じ名前のさらなるテストがスタックされます。
同じ名前の非排他的テストを含むスキーマに排他的テストが追加された場合、以前のテストは削除され、同じ名前の以降のテストが相互に置き換えられます。
let max = 64 ;
let schema = yup . string ( ) . test ( {
name : 'max' ,
exclusive : true ,
params : { max } ,
message : '${path} must be less than ${max} characters' ,
test : ( value ) => value == null || value . length <= max ,
} ) ;
Schema.transform((currentValue: any, originalValue: any) => any): Schema
変換チェーンに変換を追加します。変換はキャスト プロセスの中心であり、各型のデフォルトの変換は、値を特定の型に強制します ( isType()
で検証されるように)。変換は検証の前に実行され、スキーマがstrict
としてマークされていない場合 (デフォルト) にのみ適用されます。一部のタイプには変換が組み込まれています。
変換はオブジェクトのキャスト方法を任意に変更するのに便利ですが、渡された値を変更しないように注意する必要があります。変換は順次実行されるため、各value
キャストの現在の状態を表します。生の初期値を処理する必要がある場合は、 originalValue
パラメーターを使用できます。
let schema = string ( ) . transform ( ( value , originalValue ) => {
return this . isType ( value ) && value !== null ? value . toUpperCase ( ) : value ;
} ) ;
schema . cast ( 'jimmy' ) ; // => 'JIMMY'
各型は、適切な型への値の基本的な強制を処理しますが、場合によっては、デフォルトの動作を調整または改良することが必要になる場合があります。たとえば、デフォルトとは異なる日付解析戦略を使用したい場合は、変換を使用してそれを行うことができます。
module . exports = function ( formats = 'MMM dd, yyyy' ) {
return date ( ) . transform ( ( value , originalValue , context ) => {
// check to see if the previous transform already parsed the date
if ( context . isType ( value ) ) return value ;
// the default coercion failed so let's try it with Moment.js instead
value = Moment ( originalValue , formats ) ;
// if it's valid return the date object, otherwise return an `InvalidDate`
return value . isValid ( ) ? value . toDate ( ) : new Date ( '' ) ;
} ) ;
} ;
すべてのタイプ、または構成したタイプのみに一致するスキーマを作成します。 Schema
から継承します。混合型は、デフォルトで、 any
またはunknown
の代わりに{}
を拡張します。これは、TypeScript では{}
はnull
またはundefined
はないものを意味し、区別して扱われるためです。
import { mixed , InferType } from 'yup' ;
let schema = mixed ( ) . nullable ( ) ;
schema . validateSync ( 'string' ) ; // 'string';
schema . validateSync ( 1 ) ; // 1;
schema . validateSync ( new Date ( ) ) ; // Date;
InferType < typeof schema > ; // {} | undefined
InferType < typeof schema . nullable ( ) . defined ( ) > ; // {} | null
カスタム型は、型check
関数を渡すことで実装できます。これにより、スキーマの TypeScript タイプも絞り込まれます。
import { mixed , InferType } from 'yup' ;
let objectIdSchema = yup
. mixed ( ( input ) : input is ObjectId => input instanceof ObjectId )
. transform ( ( value : any , input , ctx ) => {
if ( ctx . isType ( value ) ) return value ;
return new ObjectId ( value ) ;
} ) ;
await objectIdSchema . validate ( ObjectId ( '507f1f77bcf86cd799439011' ) ) ; // ObjectId("507f1f77bcf86cd799439011")
await objectIdSchema . validate ( '507f1f77bcf86cd799439011' ) ; // ObjectId("507f1f77bcf86cd799439011")
InferType < typeof objectIdSchema > ; // ObjectId
文字列スキーマを定義します。 Schema
から継承します。
let schema = yup . string ( ) ;
await schema . isValid ( 'hello' ) ; // => true
デフォルトでは、 string
のcast
ロジックは、値が存在する場合はその値に対してtoString
を呼び出します。
空の値は強制されません (空の値を空の文字列に強制するには、 ensure()
を使用します)。
キャストが失敗すると、入力値が返されます。
string.required(message?: string | function): Schema
必要なmixed()
スキーマと同じですが、空の文字列も「欠損」値とみなされます。
string.length(limit: number | Ref, message?: string | function): Schema
文字列値に必要な長さを設定します。 ${length}
補間はmessage
引数で使用できます
string.min(limit: number | Ref, message?: string | function): Schema
文字列値の最小長制限を設定します。 ${min}
補間はmessage
引数で使用できます。
string.max(limit: number | Ref, message?: string | function): Schema
文字列値の最大長制限を設定します。 ${max}
補間はmessage
引数で使用できます。
string.matches(regex: Regex, message?: string | function): Schema
値と照合する任意のregex
を指定します。
let schema = string ( ) . matches ( / (hi|bye) / ) ;
await schema . isValid ( 'hi' ) ; // => true
await schema . isValid ( 'nope' ) ; // => false
string.matches(regex: Regex, options: { message: string, excludeEmptyString: bool }): Schema
string.matches
の代替シグネチャは、オプション オブジェクトと一致します。 excludeEmptyString
が true の場合、値が空の文字列の場合に正規表現テストが省略され、正規表現を複雑にすることなく、何も一致しないことを回避しやすくなります。
let schema = string ( ) . matches ( / (hi|bye) / , { excludeEmptyString : true } ) ;
await schema . isValid ( '' ) ; // => true
string.email(message?: string | function): Schema
HTML 仕様で定義されているのと同じ正規表現を使用して、値を電子メール アドレスとして検証します。
注意: 電子メール アドレスを検証することは、コードだけではほぼ不可能です。クライアントやサーバーが異なれば受け入れられるものも異なり、その多くは「有効な」電子メールを定義するさまざまな仕様から乖離しています。電子メール アドレスを検証する唯一の実際の方法は、そのアドレスに確認電子メールを送信し、ユーザーがそれを取得したことを確認することです。それを念頭に置いて、yup はすべてのケースをカバーしているわけではありませんが、HTML フォームが yup の一般的な使用例であるため、ブラウザの入力検証動作と一致する比較的単純な正規表現を選択します。
より具体的なニーズがある場合は、独自のロジックまたは正規表現で電子メール メソッドをオーバーライドしてください。
yup . addMethod ( yup . string , 'email' , function validateEmail ( message ) {
return this . matches ( myEmailRegex , {
message ,
name : 'email' ,
excludeEmptyString : true ,
} ) ;
} ) ;
string.url(message?: string | function): Schema
正規表現を介して値が有効な URL であるかどうかを検証します。
string.uuid(message?: string | function): Schema
正規表現を使用して値が有効な UUID であるかどうかを検証します。
string.datetime(options?: {message?: string | function, allowOffset?: boolean, precision?: number})
正規表現を使用して値を ISO 日時として検証します。デフォルトは UTC 検証です。タイムゾーン オフセットは許可されません ( options.allowOffset
を参照)。
.date()
とは異なり、 datetime
文字列をDate
オブジェクトに変換しません。また、 datetime
では、 date
よりも日時文字列の必要な形式をより詳細にカスタマイズできます。
options.allowOffset
: タイムゾーンオフセットを許可します。 False には UTC 'Z' タイムゾーンが必要です。 (デフォルト: false) options.precision
: 日付に特定の 1 秒未満の精度が必要です。 (デフォルト: null -- 秒未満の精度 (または精度なし))
string.datetime(message?: string | function)
message
以外のオプションを渡す必要がない場合に使用できるstring.datetime
の代替署名。
string.ensure(): Schema
undefined
値とnull
値を空の文字列に変換し、 default
空の文字列に設定します。
string.trim(message?: string | function): Schema
先頭と末尾の空白を削除して文字列値を変換します。 strict()
が設定されている場合、値がトリミングされていることのみが検証されます。
string.lowercase(message?: string | function): Schema
文字列値を小文字に変換します。 strict()
が設定されている場合、値が小文字であることのみが検証されます。
string.uppercase(message?: string | function): Schema
文字列値を大文字に変換します。 strict()
が設定されている場合、値が大文字であることのみが検証されます。
数値スキーマを定義します。 Schema
から継承します。
let schema = yup . number ( ) ;
await schema . isValid ( 10 ) ; // => true
number
のデフォルトのcast
ロジックはparseFloat
です。
失敗したキャストはNaN
を返します。
number.min(limit: number | Ref, message?: string | function): Schema
許容される最小値を設定します。 ${min}
補間はmessage
引数で使用できます。
number.max(limit: number | Ref, message?: string | function): Schema
許容される最大値を設定します。 ${max}
補間はmessage
引数で使用できます。
number.lessThan(max: number | Ref, message?: string | function): Schema
値はmax
より小さい必要があります。 ${less}
補間はmessage
引数で使用できます。
number.moreThan(min: number | Ref, message?: string | function): Schema
値は厳密にmin
より大きくなければなりません。 ${more}
補間はmessage
引数で使用できます。
number.positive(message?: string | function): Schema
値は正の数である必要があります。
number.negative(message?: string | function): Schema
値は負の数である必要があります。
number.integer(message?: string | function): Schema
数値が整数であることを検証します。
number.truncate(): Schema
小数点の右側の数字を削除して値を整数に強制する変換。
number.round(type: 'floor' | 'ceil' | 'trunc' | 'round' = 'round'): Schema
指定されたMath
メソッドを使用して値を調整します (デフォルトは「round」)。
ブール値スキーマを定義します。 Schema
から継承します。
let schema = yup . boolean ( ) ;
await schema . isValid ( true ) ; // => true
日付スキーマを定義します。デフォルトでは、ISO 日付文字列は正しく解析されます。より堅牢な解析オプションについては、Readme の最後にある拡張スキーマ タイプを参照してください。 Schema
から継承します。
let schema = yup . date ( ) ;
await schema . isValid ( new Date ( ) ) ; // => true
date
のデフォルトのcast
ロジックでは、値がDate
コンストラクターに渡されます。これに失敗すると、日付を ISO 日付文字列として解析しようとします。
ISO 文字列を
Date
オブジェクトにキャストしたくない場合は、代わりに.datetime()
を使用してください。
キャストが失敗すると、無効な日付が返されます。
date.min(limit: Date | string | Ref, message?: string | function): Schema
許可される最小日付を設定します。文字列が提供されると、最初に日付へのキャストが試行され、その結果が制限として使用されます。
date.max(limit: Date | string | Ref, message?: string | function): Schema
許可される最大の日付を設定します。文字列が指定されると、最初に日付へのキャストが試行され、その結果が制限として使用されます。
配列スキーマを定義します。配列には型を指定することも、型を指定しないこともできます。要素の型を指定すると、 cast
とisValid
も要素に適用されます。 isValid
に渡されるオプションは、子スキーマにも渡されます。
Schema
から継承します。
let schema = yup . array ( ) . of ( yup . number ( ) . min ( 2 ) ) ;
await schema . isValid ( [ 2 , 3 ] ) ; // => true
await schema . isValid ( [ 1 , - 24 ] ) ; // => false
schema . cast ( [ '2' , '3' ] ) ; // => [2, 3]
便宜上、サブタイプ スキーマを配列コンストラクターに渡すこともできます。
array ( ) . of ( yup . number ( ) ) ;
// or
array ( yup . number ( ) ) ;
配列にはデフォルトのキャスト動作がありません。
array.of(type: Schema): this
配列要素のスキーマを指定します。 of()
はオプションであり、省略された場合、配列スキーマはその内容を検証しません。
array.json(): this
JSON.parse
を使用して、入力文字列値を JSON として解析しようとします。
array.length(length: number | Ref, message?: string | function): this
配列に特定の長さの要件を設定します。 ${length}
補間はmessage
引数で使用できます。
array.min(limit: number | Ref, message?: string | function): this
配列の最小長制限を設定します。 ${min}
補間はmessage
引数で使用できます。
array.max(limit: number | Ref, message?: string | function): this
配列の最大長制限を設定します。 ${max}
補間はmessage
引数で使用できます。
array.ensure(): this
デフォルトを[]
に設定し、 null
およびundefined
値も空の配列に変換することで、値が配列であることを確認します。空でない非配列値は配列にラップされます。
array ( ) . ensure ( ) . cast ( null ) ; // => []
array ( ) . ensure ( ) . cast ( 1 ) ; // => [1]
array ( ) . ensure ( ) . cast ( [ 1 ] ) ; // => [1]
array.compact(rejector: (value) => boolean): Schema
配列から誤った値を削除します。拒否機能を提供すると、拒否基準を自分で指定できます。
array ( ) . compact ( ) . cast ( [ '' , 1 , 0 , 4 , false , null ] ) ; // => [1, 4]
array ( )
. compact ( function ( v ) {
return v == null ;
} )
. cast ( [ '' , 1 , 0 , 4 , false , null ] ) ; // => ['', 1, 0, 4, false]
タプルは、各項目が異なる型を持つ固定長の配列です。
Schema
から継承します。
import { tuple , string , number , InferType } from 'yup' ;
let schema = tuple ( [
string ( ) . label ( 'name' ) ,
number ( ) . label ( 'age' ) . positive ( ) . integer ( ) ,
] ) ;
await schema . validate ( [ 'James' , 3 ] ) ; // ['James', 3]
await schema . validate ( [ 'James' , - 24 ] ) ; // => ValidationError: age must be a positive number
InferType < typeof schema > // [string, number] | undefined
タプルにはデフォルトのキャスト動作がありません。
オブジェクトスキーマを定義します。 isValid
に渡されたオプションは、子スキーマにも渡されます。 Schema
から継承します。
yup . object ( {
name : string ( ) . required ( ) ,
age : number ( ) . required ( ) . positive ( ) . integer ( ) ,
email : string ( ) . email ( ) ,
website : string ( ) . url ( ) ,
} ) ;
オブジェクト スキーマにはデフォルトの変換が適用されていません。
オブジェクト スキーマには、デフォルト値がすでに設定されており、オブジェクトの形状を「構築」し、フィールドのデフォルトを設定します。
let schema = object ( {
name : string ( ) . default ( '' ) ,
} ) ;
schema . default ( ) ; // -> { name: '' }
これは少し驚くかもしれませんが、大規模なネストされたスキーマで、ルート オブジェクトだけでなく形状全体を埋めるデフォルト値を作成できるため、通常は役に立ちます。問題が 1 つあります。けれど。ネストされたオブジェクト スキーマの場合、オプションであってもオプションではないフィールドが含まれる場合、予期しない方法で失敗する可能性があります。
let schema = object ( {
id : string ( ) . required ( ) ,
names : object ( {
first : string ( ) . required ( ) ,
} ) ,
} ) ;
schema . isValid ( { id : 1 } ) ; // false! names.first is required
これは、検証を実行する前に入力オブジェクトをキャストし、次の結果が生成されるためです。
{ id: '1', names: { first: undefined }}
検証フェーズ中に、 names
存在し検証され、 names.first
が欠落していることが検出されます。この動作を回避したい場合は、次のいずれかを実行してください。
names.default(undefined)
names.nullable().default(null)
object.shape(fields: object, noSortEdges?: Array<[string, string]>): Schema
オブジェクトのキーとそのキーのスキーマを定義します。
Object.assign
のように動作するshape
メソッドをチェーンできることに注意してください。
object ( {
a : string ( ) ,
b : number ( ) ,
} ) . shape ( {
b : string ( ) ,
c : number ( ) ,
} ) ;
は次とまったく同じになります:
object ( {
a : string ( ) ,
b : string ( ) ,
c : number ( ) ,
} ) ;
object.json(): this
JSON.parse
を使用して、入力文字列値を JSON として解析しようとします。
object.concat(schemaB: ObjectSchema): ObjectSchema
schemaB
のすべての設定とフィールドをベースに適用して、新しいスキーマを生成することにより、オブジェクト スキーマを作成します。オブジェクトの形状は、基本フィールドよりも優先されて、 schemaB
の共通フィールドと浅くマージされます。
object.pick(keys: string[]): Schema
元のフィールドのサブセットから新しいスキーマを作成します。
let person = object ( {
age : number ( ) . default ( 30 ) . required ( ) ,
name : string ( ) . default ( 'pat' ) . required ( ) ,
color : string ( ) . default ( 'red' ) . required ( ) ,
} ) ;
let nameAndAge = person . pick ( [ 'name' , 'age' ] ) ;
nameAndAge . getDefault ( ) ; // => { age: 30, name: 'pat'}
object.omit(keys: string[]): Schema
フィールドを省略した新しいスキーマを作成します。
let person = object ( {
age : number ( ) . default ( 30 ) . required ( ) ,
name : string ( ) . default ( 'pat' ) . required ( ) ,
color : string ( ) . default ( 'red' ) . required ( ) ,
} ) ;
let nameAndAge = person . omit ( [ 'color' ] ) ;
nameAndAge . getDefault ( ) ; // => { age: 30, name: 'pat'}
object.from(fromKey: string, toKey: string, alias: boolean = false): this
指定されたキーを新しいキーに変換します。 alias
がtrue
の場合、古いキーが残ります。
let schema = object ( {
myProp : mixed ( ) ,
Other : mixed ( ) ,
} )
. from ( 'prop' , 'myProp' )
. from ( 'other' , 'Other' , true ) ;
schema . cast ( { prop : 5 , other : 6 } ) ; // => { myProp: 5, other: 6, Other: 6 }
object.noUnknown(onlyKnownKeys: boolean = true, message?: string | function): Schema
オブジェクト値にshape
で指定されたキーのみが含まれていることを検証し、最初の引数としてfalse
を渡してチェックを無効にします。キーを既知のものに制限すると、厳密モードでない場合は、 stripUnknown
オプションも有効になります。
object.camelCase(): Schema
すべてのオブジェクトキーをキャメルケースに変換します
object.constantCase(): Schema
すべてのオブジェクト キーを CONSTANT_CASE に変換します。