React: рдЗрд╕рдХреЗ рд▓рд┐рдП рдЪреЗрддрд╛рд╡рдиреА: PropTypes.object.isрдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬрдм рдкреНрд░реЛрдк `null` рд╣реЛ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 16 рдлрд╝рд░ре░ 2015  ┬╖  37рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: facebook/react

рдЪреВрдВрдХрд┐ PropTypes рдкреНрд░реЛрдк рдХреЗ 'рдкреНрд░рдХрд╛рд░' рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ, null рдПрдХ рдЦрд╛рд▓реА рд╡рд╕реНрддреБ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБ рд╣реИ, рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗред

рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдпрд╣ рдЪреЗрддрд╛рд╡рдиреА рджреЗрддрд╛ рд╣реИ:

 Warning: Required prop `profile` was not specified in `Element`. Check the render method of `OtherElement`.

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдРрд╕рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрд╣ рдЕрдм null рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЪреЗрддрд╛рд╡рдиреА рджреЗрдирд╛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИред рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреЗрд╡рд▓ рддрднреА рдЪреЗрддрд╛рд╡рдиреА рджреЗрдиреА рдЪрд╛рд╣рд┐рдП рдЬрдм рдпрд╣ undefined ?

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ рдХреЙрд▓ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рдЬреЛ рдореБрдЭреЗ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ, рд╡рд╣ рд╣реИ рд░рд┐рдПрдХреНрдЯ рдПрдХ рдШрдЯрдХ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ред рдкрд╣рд▓рд╛ рд░реЗрдВрдбрд░ рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА ( items: null )ред рдлрд┐рд░ рдПрдкреАрдЖрдИ рдХреЙрд▓ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЕрдм items рдПрдХ рд╕рд░рдгреА рдХреЗ рд╕рд╛рде рднрд░ рдЬрд╛рддрд╛ рд╣реИред

рд╕рднреА 37 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

null рдмрд┐рдирд╛ рдХрд┐рд╕реА рдореВрд▓реНрдп рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ рдФрд░ рдпрд╣ рдХреЛрдИ рд╡рд╕реНрддреБ рдирд╣реАрдВ рд╣реИ (рдЦрд╛рд▓реА рдпрд╛ рдЕрдиреНрдпрдерд╛)ред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ null рд▓рд┐рдП рдЪреЗрддрд╛рд╡рдиреА рдирд╣реАрдВ рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЗрд╕реЗ рдЖрд╡рд╢реНрдпрдХ рди рдмрдирд╛рдПрдВ, рдЗрд╕рдХрд╛ рдкреНрд░рднрд╛рд╡ рд╕рдорд╛рди рд╣реИред рдПрдХ рдХреБрдВрдЬреА рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХреБрдЫ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдХреА рдореИрдВ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВред

рдореИрдВ рд╕рд╣рдордд рд╣реВрдБред рдореИрдВ рдмрд╣реБрдд рд╕реЗ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рдЬрд╣рд╛рдВ рдЖрдк рдХрд┐рд╕реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдорд╛рдиреНрдп рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рд╢реВрдиреНрдп рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдЗрдЪреНрдЫреБрдХ рд╣реЛрдВрдЧреЗред рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рд╢реВрдиреНрдп рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЪреЗрддрд╛рд╡рдиреА рд╕рдордЭрджрд╛рд░ рдФрд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИред

рд╕рдВрдмрдВрдзрд┐рдд: https://github.com/facebook/react/issues/2166
(рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдЕрднреА рднреА рдЦреЛрдЬ рдкрд░рд┐рдгрд╛рдореЛрдВ рдореЗрдВ рдкреНрд░рдореБрдЦрддрд╛ рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ)

рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ рдХреЙрд▓ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рдЬреЛ рдореБрдЭреЗ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ, рд╡рд╣ рд╣реИ рд░рд┐рдПрдХреНрдЯ рдПрдХ рдШрдЯрдХ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ред рдкрд╣рд▓рд╛ рд░реЗрдВрдбрд░ рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА ( items: null )ред рдлрд┐рд░ рдПрдкреАрдЖрдИ рдХреЙрд▓ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЕрдм items рдПрдХ рд╕рд░рдгреА рдХреЗ рд╕рд╛рде рднрд░ рдЬрд╛рддрд╛ рд╣реИред

рдореИрдВ PropTypes.oneOfType([null, PropTypes.object]).isRequired рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╛ рддреЛ рд╢реВрдиреНрдп рдпрд╛ рдПрдХ рд╡рд╕реНрддреБ, рдХреНрдпрд╛ рдпрд╣ рдЕрднреА рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ?

CHANGELOG рдХреЗ рдЕрдиреБрд╕рд╛рд░, 15.4.0 рдпрд╣ рд╕рдВрднрд╡ рд╣реЛрдиреЗ рдХрд╛ рдЕрдиреБрдорд╛рди рд╣реИ

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ 15.4.0 рдореЗрдВ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣реИ: Required PropTypes now fail with specific messages for null and undefined.

рдореИрдВ рднреА рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
@Noitidart рдХрд╛ рд╕рдорд╛рдзрд╛рди рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрд╣ рдХрд╣рддреЗ рд╣реБрдП рдПрдХ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрддрд╛ рд╣реИ:
Failed prop type: The prop рдорд╛рди is marked as required in рдЪреБрдиреЗрдВ , but its value is рд╢реВрдиреНрдп .

рдореБрдЭреЗ рд╕рдВрдкрддреНрддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд▓рдЧрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╢реВрдиреНрдп рдорд╛рдиреЛрдВ рдХреЛ рднреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

+1 рдХрд┐рд╕реА рднреА рддрд░рд╣ null рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдПред

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ рдЬрд╣рд╛рдВ рд╣рдорд╛рд░рд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди JSON рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдХрдИ рд▓реЗрдмрд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ рдЬреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреБрдЫ рдЗрд╕ рддрд░рд╣:

{
  "title": "my title"
}

рдЗрд╕рд▓рд┐рдП рдЬрдм рдХреЛрдИ рд╢реАрд░реНрд╖рдХ рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рддреЛ рд╣рдо рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЛ рджрд░реНрд╢рд╛рдиреЗ рдХреЗ рд▓рд┐рдП null рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:

{
  "title": null
}

(рд╕рдорд╛рдирд╛рдВрддрд░ hasTitle: false рдЬреЛрдбрд╝рдирд╛ рдирд┐рд╖реЗрдзрд╛рддреНрдордХ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрдирдореЗрдВ рд╕реЗ рджрд░реНрдЬрдиреЛрдВ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╣реИрдВред)

JSON рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдП, рдЕрд╢рдХреНрдд ( undefined ) рдмрдирд╛рдо рдЬрд╛рдирдмреВрдЭрдХрд░ рдЫреЛрдбрд╝реЗ рдЧрдП ( null ) рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рдЙрдкрдпреЛрдЧреА рддрд░реАрдХрд╛ рд╣реИред

рдЖрдк рд╢реВрдиреНрдп рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рдкреНрд░реЛрдкрдЯрд╛рдЗрдк рдХреЛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд░реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ: рдкреА

@jquense рдзрдиреНрдпрд╡рд╛рдж рдпрд╣ рдмрд╣реБрдд рдорджрджрдЧрд╛рд░ рд╣реИ! рдореИрдВрдиреЗ рдЕрдкрдиреА рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рд╣рдЯрд╛ рджреА рдереА рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ SO рдЙрддреНрддрд░ рдиреЗ рд╡рд╣реА рдмрд╛рдд рдХрд╣реА рдереАред

@jquense рдЖрдк рдЕрд╢рдХреНрдд рдФрд░ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдпрд╛ рджреВрд╕рд░реЗ рдХреЛ рдирд╣реАрдВред

рдпрд╣реА рд╣реИ рд╕рд╛рд░реА рд╕рдорд╕реНрдпрд╛! рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдиреЗ рдЗрди 2 рдЕрд▓рдЧ-рдЕрд▓рдЧ рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреЛ рдПрдХ рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рднреА рдХреЛ рдкреНрд░реЛрдкрдЯрд╛рдЗрдк рдХреЗ рд▓рд┐рдП null === undefined рдХрд╛ рдЗрд▓рд╛рдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдирд╛ рдПрдХ рдХреГрддреНрд░рд┐рдо рд╕реАрдорд╛ рд╣реИред

рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рдореИрдВ рдПрдХ рдкреНрд░реЛрдкрдЯрд╛рдЗрдк рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╢реВрдиреНрдп рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЛ рднреА рдЕрдиреБрдорддрд┐ рджреЗрдиреА рдЪрд╛рд╣рд┐рдПред рд╡реЗ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдорд╛рдорд▓реЗ рд╣реИрдВ, рдФрд░ рднрд╛рд╖рд╛ рдиреЗ рдЙрдиреНрд╣реЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рдбрд┐рдЬрд╛рдЗрди рдХрд┐рдпрд╛ рд╣реИред

рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕ рдирд┐рд░реАрдХреНрд╖рдг рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреАрдЖрд░ рд╣реИ: https://github.com/facebook/prop-types/pull/90

рдореИрдВ undefined рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдПрдХ рдЯрд╛рдЗрдкреЛ рд╣реИ рдФрд░ null рдЕрдиреБрдорддрд┐ рджреЗрдВ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХреЙрд▓рд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ null рдореЗрдВ рдкрд╛рд░рд┐рдд рд╣реЛ рдЧрдпрд╛ рд╣реИред рдпрд╣реА рдЗрд╕ рдореБрджреНрджреЗ рдХреА рдмрд╛рдд рд╣реИред рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдореБрджреНрджрд╛ рдмрдВрдж рд╣реЛ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдкреНрд░рд╡рд╛рд╣ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рдЬрд┐рд╕реЗ рдореИрдВ рджреЗрдЦреВрдВрдЧрд╛ред

@binki null рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ рд▓реЗрдХрд┐рди undefined , рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреНрд░реЛрдкрдЯрд╛рдЗрдк рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред

рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдХреЗрд╡рд▓ null рдпрд╛ string рдХреА рдЕрдиреБрдорддрд┐ рд╣реИред PropTypes рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреА рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ typeof рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд╡рд╣реА рдХрд┐рдпрд╛ред рдПрдХ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрдкрдиреЗ рдШрдЯрдХ рдХреЗ рдмрд╛рд╣рд░ рд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

static propTypes = {
  id: PropTypes.number.isRequired,
  email: function(props, propName, componentName) {
    const propValue = props[propName] // the actual value of `email` prop
    if (propValue === null) return
    if (typeof propValue === 'string') return
    return new Error(`${componentName} only accepts null or string`)
  }
}

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдорд╛рдзрд╛рди PropTypes рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдЗрд░рд╛рджреЗ рд╕реЗ рднрдЯрдХ рдЧрдпрд╛ рд╣реИ - рдореЗрд░реЗ рдХрд╣рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ https://github.com/facebook/prop-types/blob/master/factoryWithTypeCheckers.js рдкрд░ рдкреНрд░реЛрдкрдЯрд╛рдЗрдк рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдХреЗ рдХрд╛рд░рдг рд╣реИред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╛рдиреНрдп рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рддреНрд╡рд░рд┐рдд рдЬрд╛рдВрдЪ рдХреА рдЬрд╛рддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ isRequired рдХреЗ рд╕рд╛рде рд╕реЗрдЯ рдХрд┐рдП рдЧрдП рдЧреБрдг рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХ рджреЗрддреЗ рд╣реИрдВ рдпрджрд┐ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдореВрд▓реНрдп null ред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЙрдирдХрд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдПрдХ рдЖрд╡рд╢реНрдпрдХ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рд╢реВрдиреНрдп рд╣реЛрдирд╛ рдЧрд▓рдд рд╣реИ, рдЬрдмрдХрд┐ рдореИрдВ рдЗрд╕реЗ рдПрдХ рд╡реИрдз рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдирд▓ рдХреЗ рд▓рд┐рдП рдорд╛рдирддрд╛ рд╣реВрдВред

if (props[propName] == null) {
  if (isRequired) {
    if (props[propName] === null) {
      return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required ' + ('in `' + componentName + '`, but its value is `null`.'));
    }
    return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required in ' + ('`' + componentName + '`, but its value is `undefined`.'));
  }
  return null;
} else {
  return validate(props, propName, componentName, location, propFullName);
}

рдореИрдВ рдмрддрд╛рдП рдЧрдП рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП @ jharris4 рд╕реЗ рд╕рд╣рдордд рд╣реВрдВред null undefined рдХреЗ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИред рдЗрд╕реЗ рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдорд╛рдирдХ рд╣реИред

рдореЛрдЬрд╝рд┐рд▓рд╛ рдбреЗрд╡рд▓рдкрд░ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ:

рдореВрд▓реНрдп рд╢реВрдиреНрдп рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдореВрд▓реНрдп рдХреА рдЬрд╛рдирдмреВрдЭрдХрд░ рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред

рд╢реВрдиреНрдп рд╡реИрд╢реНрд╡рд┐рдХ рд╡рд╕реНрддреБ рдХреА рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЬреИрд╕реЗ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдЕрд╢рдХреНрдд рдкрд╣рдЪрд╛рди рдХреА рдХрдореА рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЪрд░ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдПрдкреАрдЖрдИ рдореЗрдВ, рдирд▓ рдХреЛ рдЕрдХреНрд╕рд░ рдЙрд╕ рд╕реНрдерд╛рди рдкрд░ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ рд▓реЗрдХрд┐рди рдХреЛрдИ рд╡рд╕реНрддреБ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рд╣реИред

рд╢реВрдиреНрдп рдХреЛ рдХрдо рд╕реЗ рдХрдо PropTypes.oneOfType([null, PropTypes.string]).isRequired рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред

@jquense - isRequired рд╣рдЯрд╛рдиреЗ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд╢рд╛рдпрдж рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЕрдм рдЖрдк рд░реЗрдбреНрдпреВрд╕рд░ рдореЗрдВ рдШрдЯрдХ _and_ рдореЗрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдорд╛рди рдХреЗ рд▓рд┐рдП рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯ рдХрд░ рд░рд╣реЗ рд╣реЛрдВрдЧреЗ, рд╕рднреА рдХреЛ null рдХреЛ рдПрдХ рдкреНрд░реЛрдк рдХреЗ рдореВрд▓реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП?

рдореЗрд░реЗ рдкрд╛рд╕ data || '' ( isRequired рдЦрд╛рд▓реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ '' , рдЦрд╛рд▓реА рд╡рд╕реНрддреБ {} , рдЖрджрд┐) рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рд╣реИред рд╕рдорд╛рдкреНрдд null рдШрдЯрдХ рдХреЛ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХрджрдо рд╕рд╣реА рдмрд╛рдд рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рдЖ рд░рд╣рд╛ рд╣реИ рдмрд╕ рдереЛрдбрд╝рд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗрдВ! (рд▓реЗрдХрд┐рди рдореИрдВ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛...)
@ puiu91 рдЕрдм рдХреЗ рд▓рд┐рдП рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ ... рдореИрдВ рд╣рдорд╛рд░реЗ codebase рднрд░ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛рд░реНрдп рдХрд░рдирд╛ рд╣реЛрдЧрд╛ ... рдХреЗ рдмрд╛рдж рд╕реЗ рдпрд╣ рдЗрд╕ рдореБрджреНрджреЗ рдХреА рддрд░рд╣ рдХрд┐рд╕реА рднреА рд╕рдордп рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рд╛ рдирд╣реАрдВ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдЬрд▓реНрдж рд╣реА рд╡рд┐рд▓рд╛рдк рд▓рдЧ рд░рд╣рд╛ рд╣реИ

рдореИрдВ рдпрд╣ рднреА рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ null рдХреЛ рдореВрд▓реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдорд╛рдирдХ рддрд░реАрдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЙрдиреНрд╣реАрдВ рдХрд╛рд░рдгреЛрдВ рд╕реЗ @ jharris4 рдФрд░ @Findiglay рдиреЗ рдХрд╣рд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдм рдЪрд░реНрдЪрд╛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХрд╛ рд╕реНрдерд╛рди рдирд╣реАрдВ рд╣реИред рди рдХреЗрд╡рд▓ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдпрд╣ facebook/prop-types рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ ред рдореИрдВ рдпрд╣рд╛рдБ facebook/prop-types#90 рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдХрд╛ рдкрд╛рд▓рди рдХрд░ рд░рд╣рд╛ рд╣реВрдБред

рдЯрдХреНрдХрд░ред рдЖрдЬ рднреА рдЗрд╕рдореЗрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИред рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛:

myObj: PropType.object.isRequiredOrNull :)

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдкрд░ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдмрд╣реБрдд рдХрдо рд╣реИред рдлреНрд▓реЛ рдЬрд╛рдиреЗ рдХрд╛ рдЕрдиреБрд╢рдВрд╕рд┐рдд рддрд░реАрдХрд╛ рд╣реИред http://flow.org/

@ рдорд░реБрдЬрд╛рд╣ рдЖрдкрдХрд╛ рд╕реНрдирд┐рдкреЗрдЯ рд╕рд╣реА рдирд╣реАрдВ рд╣реИред

рдШрдЯрдХ рдХреЛ рд╢реВрдиреНрдп рдкрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рдФрд░ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЖрдкрдХреЛ рдЪреЗрддрд╛рд╡рдиреА рдорд┐рд▓ рдЬрд╛рдПрдЧреА:

Warning: Failed prop type: The prop 'theProp' is marked as required in 'TheComponent', but its value is null.

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЖрд╡рд╢реНрдпрдХ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдХрднреА рднреА рд╢реВрдиреНрдп рдпрд╛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдорд╛рдиреЛрдВ рдХреЛ рдирд╣реАрдВ рдЬрд╛рдиреЗ рджреЗрдЧрд╛ред

рдпрджрд┐ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рддреЛ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреАрдЖрд░ рдЯреВ рдкреНрд░реЙрдк-рдЯрд╛рдЗрдк рдКрдкрд░ рд▓рд┐рдВрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдУрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ! рдлрд┐рд░ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рддреБрдо рд╕рд╣реА рд╣реЛ

рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдПрдХ рдореВрд▓реНрдп рдпрд╛ рд╢реВрдиреНрдп рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдкреВрд░реА рддрд░рд╣ рд╕реЗ PropTypes рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред

рдпрд╣рд╛рдВ рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдореИрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реВрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдХреЙрд▓рдмреИрдХ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рдЪрдпрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ 90% рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВред рдЬрд┐рди рд▓реЛрдЧреЛрдВ рдХреЛ рдЙрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рд╡реЗ рдмрд╣реБрдд рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдирдП рдбреЗрд╡рд▓рдкрд░ рд╣реИрдВ рдЬреЛ рд╕рднреА рд╕рд╛рдорд╛рдиреНрдп рдХреЙрд▓рдмреИрдХ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд▓рдЧрд╛рддрд╛рд░ рднреВрд▓ рд░рд╣реЗ рд╣реИрдВред

рдореИрдВ рдЗрди рдШрдЯрдХреЛрдВ рдХреЗ рд╕рднреА рдЙрдкрдпреЛрдЧреЛрдВ рдХреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЙрд▓рдмреИрдХ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдЪреЗрдд рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдмрдЬрд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдХреБрдЫ рдкреНрд░реЙрдкреНрд╕ рдХреЛ рднреВрд▓ рдЬрд╛рдПред

рд╣рд╛рдВ, рд╣рдо рдкреНрд░рд╡рд╛рд╣ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЪреЗрдХ рдореЗрдВ рд╣реИрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдк рд╕рддреНрдпрд╛рдкрди рдХреЛ рджреЛ рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдкрдЯрд╛рдЗрдк рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдкрд░ рдирдЬрд╝рд░ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдирдЬрд╛рди рд╣реИред

рдмрд╕ рдпрд╣рд╛рдВ рдореЗрд░рд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╕ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдореЗрд░реЗ рдкрд╛рд╕ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд░реЗрдбрдХреНрд╕ рд╕реНрдЯреЛрд░ рд╣реИ, рдЬрдм рд╡рд╣ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЕрдЧрд░ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдереА, рдЖрджрд┐ред рдореЗрд░реЗ рдШрдЯрдХ рдХреЛ рдПрдХ 'рддреНрд░реБрдЯрд┐' рдкреНрд░реЛрдк рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдбреЗрдЯрд╛ рдирд╣реАрдВ рд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрд╛ рддреЛ рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рддреНрд░реБрдЯрд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ), рдЬреЛ рдбреЗрдЯрд╛ рдХреЗ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд▓реЛрдб рд╣реЛрдиреЗ рдкрд░ рд╢реВрдиреНрдп рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рддреНрд░реБрдЯрд┐ рд╣реЛрдиреЗ рдкрд░ рдкреЙрдкреНрдпреБрд▓реЗрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдореИрдВ рдПрдХ рд▓реЛрдбрд░ рдШрдЯрдХ ( PropTypes.node ) рдХреЛ props рдкрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдЬрдм рдореИрдВ рд▓реЛрдбрд░ рдкреНрд░рд╕реНрддреБрдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рддреЛ рдореИрдВ null рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВред
Afaik, рдПрдХ render рдлрд╝рдВрдХреНрд╢рди рдХреЛ null рдмрдЬрд╛рдп undefined рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рдХреБрдЫ рднреА рдкреНрд░рд╕реНрддреБрдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд▓рд┐рдП null рдХреНрдпреЛрдВрдХрд┐ рдорд╛рди рдореЗрд░реЗ рд▓рд┐рдП рдЗрд╕реЗ рдХрд░рдиреЗ рдХрд╛ рд╕рд╣реА рддрд░реАрдХрд╛ рд╣реИред

рдореИрдВ InputNumber рдШрдЯрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (рдХреЗ рд▓рд┐рдП рдЖрд╡рд░рдг <input type="number"> ), рддреЛ рдореИрдВ рдерд╛ propTypes рдореЗрд░реА рдкреНрд░реЛрдк рдХреЗ рд▓рд┐рдП value - PropTypes.number.isRequired , рдФрд░ рдЬрдм рдореИрдВ рдЕрдкрдиреЗ рдШрдЯрдХ, рдореИрдВ рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рд╣рдореЗрд╢рд╛ рдЗрд╕реЗ рд╕рдВрдкрддреНрддрд┐ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдЖрдЬ рдореБрдЭреЗ рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд▓рд┐рдВрдХ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдирд┐рд░рд░реНрдердХ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдореЗрд░рд╛ рдШрдЯрдХ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдПрдХрдорд╛рддреНрд░ рдирд┐рд░реНрдгрдп рдЬрд┐рд╕рдХреА рдореИрдВ рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддрд╛ рдерд╛, рд╡рд╣ рд╣реИ propTypes рдХреЛ рдореЗрд░реЗ рдкреНрд░реЛрдк value рд╕реЗ PropTypes.oneOfType([PropTypes.number, PropTypes.string]) рдмрджрд▓рдирд╛ рдФрд░ defaultProps рдХреЛ рд╢реВрдиреНрдп рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд╣реА рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрдирдкреБрдЯ рдкреНрд░рдХрд╛рд░ = рд╕рдВрдЦреНрдпрд╛ рдХреЗрд╡рд▓ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореИрдВ PropTypes.oneOfType([null, PropTypes.object]).isRequired рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╛ рддреЛ рд╢реВрдиреНрдп рдпрд╛ рдПрдХ рд╡рд╕реНрддреБ, рдХреНрдпрд╛ рдпрд╣ рдЕрднреА рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ?

рдпрд╣ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ: Warning: Invalid argument supplied to oneOfType. Expected an array of check functions, but received null at index 1.

рддреЛ, рдЖрдкрдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрдкреВрд░реНрддрд┐ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ:

PropTypes.oneOfType([
  () => null,
  PropTypes.object
]).isRequired

рдЗрд╕ рдмрдЧ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрд╛ рд╣реИ:

function nullable(subRequirement) {
  const check = (required, props, key, ...rest) => {
    if (props[key] === null) {
      return null;
    }
    const sub = required ? subRequirement.isRequired : subRequirement;
    return sub(props, key, ...rest);
  };
  const fn = check.bind(null, false);
  fn.isRequired = check.bind(null, true);
  return fn;
}

рдЙрдкрдпреЛрдЧ:

static propTypes = {
  someCallbackFunction: nullable(PropTypes.func).isRequired,
};

nullable рдмрд┐рдирд╛ isRequired рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ (рдмрд▓реНрдХрд┐ рд╡реНрдпрд░реНрде) рд╣реИред рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдЗрд╕реЗ isRequired рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рдмрдирд╛рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ react/require-default-props рдПрд╕реНрд▓рд┐рдВрдЯ рдирд┐рдпрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

рдореЗрд░рд╛ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓рд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдПрдкреАрдЖрдИ рдХреЗ рдЕрдиреБрд░реВрдк рдШрдЯрдХреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╣реИ, рдЬреЛ рдПрдХ рдШрдЯрдХ рджреНрд╡рд╛рд░рд╛ рд▓рдкреЗрдЯрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдХреЙрд▓рдмреИрдХ рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИред null рдХреЙрд▓рдмреИрдХ рдХрд╛ рдЕрд░реНрде рд╣реИ 'рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП', рдЗрд╕рд▓рд┐рдП рд░реИрдкрд░ рдШрдЯрдХ рдХрднреА-рдХрднреА рдЬрд╛рдирдмреВрдЭрдХрд░ null s рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИред рд╕рд╛рде рд╣реА, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрджрд┐ рдХреЛрдИ рдирдИ рд╕рдВрдкрддреНрддрд┐ рдЬреЛрдбрд╝реА рдЬрд╛рддреА рд╣реИ, рддреЛ рдпрд╣ рдЫреВрдЯ рдирд╣реАрдВ рдЬрд╛рддреА рд╣реИ, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдкрддреНрддрд┐ рдЙрдк-рдШрдЯрдХреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░ рджреА рдЬрд╛рддреА рд╣реИред рдореИрдВ рдЗрд╕ рдПрдкреАрдЖрдИ рдХреЗ рдЕрдиреБрд░реВрдк рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдХ рдХреЗ рд▓рд┐рдП defaultProps рд╢реВрдиреНрдп рднреА рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛; рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрд╡реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдХреЙрд▓рд░ рдиреЗ рдПрдХ рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рд╣реЛрдЧрд╛ред

рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд▓рд┐рдЦреЗ рдЧрдП рд╕рд╣рд╛рдпрдХ рдХреЛ рд▓рд┐рдпрд╛ рдФрд░ рд╢реБрджреНрдзрддрд╛ рд╕рд╛рдмрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдПрдХ рдкреИрдХреЗрдЬ рдореЗрдВ рдбрд╛рд▓ рджрд┐рдпрд╛:

npm install --save git+https://github.com/davidje13/prop-types-nullable.git#semver:^1.0.0

рдЙрдкрдпреЛрдЧ:

import PropTypes from 'prop-types';
import nullable from 'prop-types-nullable';

[...]

static propTypes = {
  thing: nullable(PropTypes.string).isRequired,
};

рдирдпрд╛ рд╕рдорд╛рдзрд╛рди: PropTypes.oneOfType([PropTypes.object]).isRequired

рдореБрдЭреЗ рддреНрд░реБрдЯрд┐ рд╣реЛ рд░рд╣реА рд╣реИред
рдХреИрд╕реЗ рдареАрдХ рдХрд░реЗрдВред

./~/prop-types/prop-types.js рдореЗрдВ рдЪреЗрддрд╛рд╡рдиреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд┐рд░реНрднрд░рддрд╛рдПрдБ: 1:482-489 рдпрд╣ рдПрдХ рдкреВрд░реНрд╡-рдирд┐рд░реНрдорд┐рдд рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рд╛рдЗрд▓ рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ, рдпрд╣ рдЕрдиреБрд╢рдВрд╕рд┐рдд рдирд╣реАрдВ рд╣реИред рдмреЗрд╣рддрд░ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореВрд▓ рд╕реНрд░реЛрдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред @ ./~/prop-types/prop-types.js 1:482-489

рдореИрдВ PropTypes.oneOfType([null, PropTypes.object]).isRequired рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╛ рддреЛ рд╢реВрдиреНрдп рдпрд╛ рдПрдХ рд╡рд╕реНрддреБ, рдХреНрдпрд╛ рдпрд╣ рдЕрднреА рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ?

рдпрд╣ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ: Warning: Invalid argument supplied to oneOfType. Expected an array of check functions, but received null at index 1.

рддреЛ, рдЖрдкрдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрдкреВрд░реНрддрд┐ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ:

PropTypes.oneOfType([
  () => null,
  PropTypes.object
]).isRequired

рдЕрд╕рд▓ рдореЗрдВ рдореБрдЭреЗ рдЕрдВрдд рдореЗрдВ 'рдЖрд╡рд╢реНрдпрдХ' рдХреА рд╡рдЬрд╣ рд╕реЗ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реБрдИ рдереА, рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╢реВрдиреНрдп рдФрд░ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИ ...
рдЗрд╕реА рд╕реЗ рдореЗрд░рд╛ рдХрд╛рдо рдмрдирд╛ рд╣реИ:

PropTypes.oneOfType([ 
    PropTypes.string.isRequired, 
    () => null 
])

@ gugol2 рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЖрдкрдиреЗ рдЬреЛ рд▓рд┐рдЦрд╛ рд╣реИ рд╡рд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЯрд╛рдЗрдк рдЪреЗрдХрд┐рдВрдЧ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░ рджреЗрдЧрд╛ (рдЕрдм рдЖрдк рдЙрд╕ рдкреНрд░реЛрдк, рдпрд╛ undefined , рдпрд╛ рдХреБрдЫ рднреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдВрдмрд░ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ); рд╕рддреНрдпрд╛рдкрди рд╕рдлрд▓ рд╣реЛрдиреЗ рдкрд░ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдлрд╝рдВрдХреНрд╢рди null рд╡рд╛рдкрд╕ рдЖрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдпрджрд┐ рдпрд╣ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ рддреЛ рдЧреИрд░- null ред

рдпрджрд┐ рдЖрдк рдЙрд╕ рдорд╛рд░реНрдЧ рдкрд░ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рдХреБрдЫ рдФрд░ рдЪрд╛рд╣рд┐рдП:

PropTypes.oneOfType([
  PropTypes.string.isRequired,
  (props, key) => props[key] === null ? null : 'Not null'
])

рдмреЗрд╢рдХ рдЖрдк рдЦрд░рд╛рдм рджрд┐рдЦрдиреЗ рд╡рд╛рд▓реЗ рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдп рдХреЛ рдкреВрд░реНрд╡-рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

const nullable = (props, key) => props[key] === null ? null : 'Not null'

// ...

PropTypes.oneOfType([PropTypes.string.isRequired, nullable])

рдпрд╣ рдХреЗрд╡рд▓ PropTypes.oneOfType([PropTypes.string.isRequired]) рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд┐рддреНрд░ рд░реВрдк рд╕реЗ рд╕рдВрднрд╡ рд╣реИ (рд▓реЗрдХрд┐рди рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдирд╣реАрдВ рдХрд░рддрд╛!) рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдПрдХ рдмрдЧ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХреЛ рдмрд╛рдж рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдЬреАрд╡рд┐рдд рд░рд╣рдиреЗ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рдХрд░рддрд╛ред рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╕реБрдЭрд╛рдИ рдЧрдИ рд╡рд┐рдзрд┐ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИ рдЬреЛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреА рд╣реИред


рдпрджрд┐ рдЖрдк рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рдЦреБрд▓рд╛ рдкреАрдЖрд░ рд╣реИ рдЬреЛ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдзреАрд░реЗ-рдзреАрд░реЗ рдЖрдЧреЗ рдмрдврд╝ рд░рд╣рд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЬрд╛рд╣рд┐рд░ рддреМрд░ рдкрд░ рдЕрднреА рднреА рд╡рд┐рдЪрд╛рд░ рдореЗрдВ рд╣реИред

рдФрд░ рдЬрдм рддрдХ рдкреАрдЖрд░ рдХрд╛ рд╡рд┐рд▓рдп рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛, рдореИрдВ рдЕрдкрдиреЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рдкреАрдЫреЗ рдХрд╛ .isRequired рдбрд╛рд▓рдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдЗрд╕реЗ рд▓рд╛рдЗрдирд┐рдВрдЧ рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрдХреВрд▓ рдмрдирд╛рддрд╛ рд╣реИред

рдЖрдИрдПрдордПрдЪрдУ рдпрд╣ рд╕рд╣реА рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ рд▓реЗрдХрд┐рди рдЗрд╕реЗ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ рдХреЙрд▓ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рдЬреЛ рдореБрдЭреЗ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ, рд╡рд╣ рд╣реИ рд░рд┐рдПрдХреНрдЯ рдПрдХ рдШрдЯрдХ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ред рдкрд╣рд▓рд╛ рд░реЗрдВрдбрд░ рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА ( items: null )ред рдлрд┐рд░ рдПрдкреАрдЖрдИ рдХреЙрд▓ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЕрдм items рдПрдХ рд╕рд░рдгреА рдХреЗ рд╕рд╛рде рднрд░ рдЬрд╛рддрд╛ рд╣реИред

рдЗрд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХрд╛ рдХреЛрдИ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛? рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдкреНрд░реЛрдк рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд▓реЗрдХрд┐рди рдПрдкреАрдЖрдИ рд╕реЗ рд╡рд╛рдкрд╕ рдЖрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ рд╢реВрдиреНрдп рд╣реИред

PropTypes.oneOfType([
  PropTypes.string.isRequired,
  (props, key) => props[key] === null ? null : 'Not null'
])

@ davidje13 рдореБрдЭреЗ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдПрдХ рдЫреЛрдЯреА рд╕реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рдХрд╡рд░реЗрдЬ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ 1/4 рдорд╛рдорд▓рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдХрднреА рдХрд╡рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдорд╛рди рд▓реЗрдВ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдШрдЯрдХ рд▓реЙрдЧрд┐рди рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░реЛрдк 'рдирд╛рдо' рд╣реИ рдЬреЛ рд╢реВрдиреНрдп рдпрд╛ рдЖрд╡рд╢реНрдпрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

const Login = ({name}) => {
  return <div>{name}</div>
} 

рддреЛ рдЗрд╕рдХреЗ рдкреНрд░реЙрдкрдЯрд╛рдЗрдк рд╣реИрдВ:

Login.propTypes = {
  name: PropTypes.oneOfType([
    PropTypes.string.isRequired,
    (props, key) => (props[key] === null ? null : 'Not null'),
  ]),
};

рдЬрдм рдореИрдВ рдЗрд╕ рдШрдЯрдХ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдореЗрд░реЗ рдкрд╛рд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЗрд╡рд▓ 2 рдкрд░рд┐рджреГрд╢реНрдп рд╣реЛрддреЗ рд╣реИрдВ, рд╢реВрдиреНрдп рдпрд╛ рдПрдХ рдЖрд╡рд╢реНрдпрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧред

render(<Login name={null} />
render(<Login name={'anyName'} />

рд▓реЗрдХрд┐рди рдХрд╡рд░реЗрдЬ рдореБрдЭреЗ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдХреЗрд╡рд▓ 75% рдХрд╡рд░реЗрдЬ рд╣реИред
рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреНрдпрд╛ рд╣реЛрдЧрд╛ред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рд▓рд╛рдкрддрд╛ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓рд╛ рд╡рд╣ рд╣реИ рдЬрд╣рд╛рдВ рдпрд╣ рдкреНрд░реЛрдк рдЬрд╛рдВрдЪ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ? рдпрд╛рдиреА рдпрджрд┐ рдЖрдк рдХреЛрдИ рд╕рдВрдЦреНрдпрд╛ рдпрд╛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдпрд╛ рдХреБрдЫ рдФрд░ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЙрд╕рдХреЗ рдкрд╛рд╕ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рд▓рд╛рдкрддрд╛ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓рд╛ рд╡рд╣ рд╣реИ рдЬрд╣рд╛рдВ рдпрд╣ рдкреНрд░реЛрдк рдЬрд╛рдВрдЪ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ? рдпрд╛рдиреА рдпрджрд┐ рдЖрдк рдХреЛрдИ рд╕рдВрдЦреНрдпрд╛ рдпрд╛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдпрд╛ рдХреБрдЫ рдФрд░ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЙрд╕рдХреЗ рдкрд╛рд╕ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдирд╣реАрдВ, рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред

рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдкрд╛рд╕ рдХрд░рдирд╛ рдХрд╡рд░реЗрдЬ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдФрд░ рдореИрдВ рд╡реИрд╕реЗ рднреА рдПрдХ рдирдВрдмрд░ рдкрд╛рд╕ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдпрд╣ рдПрдХ рдЕрдиреБрдордд рдорд╛рди рдирд╣реАрдВ рд╣реИред

рдореИрдВ рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реВрдВред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

jimfb picture jimfb  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

huxiaoqi567 picture huxiaoqi567  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

hnordt picture hnordt  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

zpao picture zpao  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

tleunen picture tleunen  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ