Definitelytyped: [@ рдкреНрд░рдХрд╛рд░/рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛] RefObject.current рдЕрдм рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

рдХреЛ рдирд┐рд░реНрдорд┐рдд 5 рджрд┐рд╕ре░ 2018  ┬╖  48рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: DefinitelyTyped/DefinitelyTyped

ref.current рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛ рдЕрдм рдареАрдХ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ: https://reactjs.org/docs/hooks-faq.html#is -there-something-like-instance-variables

рдЗрд╕реЗ рдПрдХ рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ: Cannot assign to 'current' because it is a constant or a read-only property.

  • [x] рдореИрдВрдиреЗ @types/react рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ рд╕рдорд╕реНрдпрд╛рдПрдВ рдереАрдВред
  • [x] рдореИрдВрдиреЗ tsc рдХреЗ рдирд╡реАрдирддрдо рд╕реНрдерд┐рд░ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ред https://www.npmjs.com/package/typescript
  • [x] рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░рд╢реНрди рд╣реИ рдЬреЛ StackOverflow рдХреЗ рд▓рд┐рдП рдЕрдиреБрдкрдпреБрдХреНрдд рд╣реИред (рдХреГрдкрдпрд╛ рд╡рд╣рд╛рдВ рдХреЛрдИ рдЙрдкрдпреБрдХреНрдд рдкреНрд░рд╢реНрди рдкреВрдЫреЗрдВ)ред
  • [x] [рдЙрд▓реНрд▓реЗрдЦ] (https://github.com/blog/821-mention-somebody-the-re-notified) рд▓реЗрдЦрдХ ( Definitions by: рдореЗрдВ index.d.ts рджреЗрдЦреЗрдВ) рддрд╛рдХрд┐ рд╡реЗ рдХрд░ рд╕рдХреЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛.

    • рд▓реЗрдЦрдХ: @johnnyreilly @bbenezech @pzavolinsky @digiguru @ericanderson @morcerf @tkrotoff @DovydasNvickas @onigoetz @ theruther4d @guilhermehubner @ferdaber @jrakotoharisoa @pascaloliv @Hotell @franklixuefei

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

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

рдпрджрд┐ рдЖрдк рдПрдХ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд░реЗрдл рдСрдмреНрдЬреЗрдХреНрдЯ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рд╢реВрдиреНрдп рдорд╛рди рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╕рд╛рдорд╛рдиреНрдп рддрд░реНрдХ рдХреЛ | null рднреА рджреЗрдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВред рдпрд╣ рдЗрд╕реЗ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдмрдирд╛ рджреЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЗрд╕реЗ "рд╕реНрд╡рд╛рдорд┐рддреНрд╡" рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

рд╢рд╛рдпрдж рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рднреА рдЕрдХреНрд╕рд░ рд╕реВрдЪрдХ-рдЖрдзрд╛рд░рд┐рдд рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдЙрдирдореЗрдВ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ _very_ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдФрд░ рдпрд╣реА рд░реЗрдлрд░реА рд╣реИрдВ, рдПрдХ рд╕реВрдЪрдХред .current рд╕реВрдЪрдХ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИред

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

рдПрдХ рдЬрдирд╕рдВрдкрд░реНрдХ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рдПрдЧреА! рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рдЖрд╕рд╛рди рдПрдХ рд▓рд╛рдЗрди рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

@ferdaber ,
рдирдорд╕реНрддреЗ, рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЪреБрдирдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдирдпрд╛ рд╣реВрдВ (рд╕рд┐рд░реНрдл рдПрдХ рд╕рдкреНрддрд╛рд╣) рдФрд░ рдУрдкрди рд╕реЛрд░реНрд╕ рдореЗрдВ рдпрд╣ рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рдпреЛрдЧрджрд╛рди рд╣реЛрдЧрд╛ред

рдореИрдВ node_modules/@types/react/index.d.ts рд╕реЗ рдЧреБрдЬрд░рд╛ рд╣реВрдВ рдФрд░ рд▓рд╛рдЗрди рдирдВрдмрд░ 61 рдкрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╣реИ рдЬреЛ рдХрд░рдВрдЯ рдХреЛ рд░реАрдбреЛрдирд▓реА рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред

interface RefObject<T> {
        readonly current: T | null;
    }

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

рд╣рд╛рдВ, рдпрд╣ рд╕рд┐рд░реНрдл рдЙрд╕ рд▓рд╛рдЗрди рдкрд░ readonly рд╕рдВрд╢реЛрдзрдХ рдХреЛ рд╣рдЯрд╛ рд░рд╣рд╛ рд╣реИред

React.useRef рдПрдХ MutableRefObject $ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА current рд╕рдВрдкрддреНрддрд┐ readonly рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд░реЗрдл рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдПрдХреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЙрдиреНрд╣реЗрдВ рдПрдХреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд░рд┐рдПрдХреНрдЯ рд░рдирдЯрд╛рдЗрдо рдХреА current рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рд╕рдВрдкрддреНрддрд┐ рдкрд░ рдХреЛрдИ рд╕реАрдорд╛ рдирд╣реАрдВ рд╣реИ React.createRef() , рд╡рд╕реНрддреБ рд╕реНрд╡рдпрдВ рд╕реАрд▓ рд╣реИ рд▓реЗрдХрд┐рди рдЬрдореА рдирд╣реАрдВ рд╣реИред

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

рдпрджрд┐ рдЖрдк рдПрдХ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд░реЗрдл рдСрдмреНрдЬреЗрдХреНрдЯ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рд╢реВрдиреНрдп рдорд╛рди рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╕рд╛рдорд╛рдиреНрдп рддрд░реНрдХ рдХреЛ | null рднреА рджреЗрдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВред рдпрд╣ рдЗрд╕реЗ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдмрдирд╛ рджреЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЗрд╕реЗ "рд╕реНрд╡рд╛рдорд┐рддреНрд╡" рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

рд╢рд╛рдпрдж рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рднреА рдЕрдХреНрд╕рд░ рд╕реВрдЪрдХ-рдЖрдзрд╛рд░рд┐рдд рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдЙрдирдореЗрдВ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ _very_ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдФрд░ рдпрд╣реА рд░реЗрдлрд░реА рд╣реИрдВ, рдПрдХ рд╕реВрдЪрдХред .current рд╕реВрдЪрдХ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИред

рдпрд╣ рдЙрдЪрд┐рдд рд╣реИ, рдореИрдВ рдХреЗрд╡рд▓ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╣рд╛рдпрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ React.createRef() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рд░рд┐рдПрдХреНрдЯ рдЗрд╕реЗ рддрдм рддрдХ рдкреНрд░рдмрдВрдзрд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдЗрд╕реЗ ref рдкреНрд░реЛрдк рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдмрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдПрдХ рд╣реА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕реВрдЪрдХ рд╡рд╕реНрддреБ рдмрдирд╛рдПрдВред

рд╣рдо рд╕рдорд╛рди рдЕрдзрд┐рднрд╛рд░ рддрд░реНрдХ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП createRef рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рддрд░реНрдХ рдирд╣реАрдВ рд╣реИ, рдЗрд╕реЗ рд╕рд╢рд░реНрдд рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╛рдкрд╕реА рдХреЗ рд╕рд╛рде рд╣реЛрдирд╛ рд╣реЛрдЧрд╛ред рдпрджрд┐ рдЖрдк | null рд╢рд╛рдорд┐рд▓ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ MutableRefObject рд▓реМрдЯрд╛рдПрдЧрд╛, рдпрджрд┐ рдЖрдк рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ (рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп) RefObject рд╣реЛрдЧрд╛ред

рдХреНрдпрд╛ рдпрд╣ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ strictNullTypes рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐?

рдореИрдВ

рдХреНрдпрд╛ рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЧрд▓рдд рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рдирдореЗрдВ _do_ рдореЗрдВ strictNullTypes рд╕рдХреНрд╖рдо рд╣реИ?

рдЬрдм рдореИрдВрдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрдирд╛рдпрд╛ рддреЛ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ рдпрд╣ | null рдЕрдзрд┐рднрд╛рд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдерд╛ред рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд╛рдорд╛рдиреНрдп рдкреИрдЯрд░реНрди рдирд╣реАрдВ рд╣реИ рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдРрд╕рд╛ рдХреБрдЫ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рдереАред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рдХреИрд╕реЗ рдпрд╛рдж рдХрд┐рдпрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреНрд░рд▓реЗрдЦрд┐рдд рдФрд░ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬрдм рддрдХ рдЖрдк useRef рдФрд░ createRef рдХреЛ рдПрдХреАрдХреГрдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ, рдореИрдВ рдЗрд╕реЗ рдПрдХ рдЧреИрд░-рдореБрджреНрджреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдареАрдХ рд╣реВрдВред

рдЪреВрдВрдХрд┐ рдпрд╣ рдореБрджреНрджрд╛ рд╕реНрд╡рдпрдВ useRef рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдерд╛ рдФрд░ createRef рдкрд░ рдирд╣реАрдВ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рднреА рдареАрдХ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣рд╛рдВ рдмрд╣реБрдд рдХрдо рд▓реЛрдЧ createRef рдореЗрдВ рд╕реАрдзреЗ рд╕рдВрджрд░реНрднрд┐рдд рд╕реВрдЪрдХ рдорд╛рди рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдЕрдЧрд░ рдпрд╣ рдЕрдзрд┐рднрд╛рд░ рдкреИрдЯрд░реНрди рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рдЬрд╛рдПрдЧрд╛, рддреЛ рд╣реБрдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рд╣рдо рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЗ рд╕рд╛рде useRef рдХреБрдЫ рдЙрдкрдпреЛрдЧ рджреЗрдЦрддреЗ рд╣реИрдВ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ .current рдХрд╛ рдореВрд▓реНрдп рдХрднреА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рд╢реВрдиреНрдп рд▓реЗрдХрд┐рди рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдЧрд╛рддрд╛рд░ рдЧреИрд░-рд╢реВрдиреНрдп рджрд╛рд╡рд╛ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реЗрд╢рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдпрджрд┐ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХреНрдпрд╛ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рд╣реЛрдирд╛ рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЗрд╕реЗ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рдП рддреЛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИ? рдпрджрд┐ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдорд╛рди рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд░реЗрдлрд░реА рд╢рд╛рдпрдж ref рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рд╕реА рдШрдЯрдХ рдХреЛ рдкрд╛рд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдПрдХ рдЖрд╡реГрддреНрддрд┐ рдЪрд░ рдХреА рддрд░рд╣ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рджреВрд╕рд░реА рддрд░рдл, рдПрдХ рдШрдЯрдХ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд░реЗрдлрд░реА рдмрдирд╛рддреЗ рд╕рдордп, рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп рд╢рд╛рдпрдж рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдореИрдВ рдРрд╕рд╛ рд╣реА рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ред @ рдХреЛрд╡реЗрдиреНрд╕реНрдХреА рдЖрдкрдХреЗ рдХреНрдпрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ?

@ferdaber useRef рдЬреИрд╕рд╛ рдХрд┐ рдЕрднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рдореЗрд╢рд╛ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ _рдФрд░_ рдЕрд╢рдХреНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдЖрдк рджреЛрдиреЛрдВ рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рддрд░реНрдХ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ | null рдФрд░ null рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИред

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

рд░рд┐рдПрдХреНрдЯ рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдФрд░ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп рдХреЗ рдмрд┐рдирд╛ useRef рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд░рд┐рдПрдХреНрдЯ рдЯреАрдо null рдФрд░ undefined рдХреЗ рдмреАрдЪ рдХреЗ рдЕрдВрддрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреНрдпрд╛рджрд╛ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддреА рд╣реИред рдпрд╣ рдПрдХ рдлреНрд▓реЛ рдЪреАрдЬ рд╣реЛ рд╕рдХрддреА рд╣реИред


рд╡реИрд╕реЗ рднреА, рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдореИрдВрдиреЗ useRef рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ рд╡рд╣ рдмрд┐рд▓реНрдХреБрд▓ @bschlenk рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ, рдХреЗрд╡рд▓ null "рдЫреЛрдбрд╝реЗ рдЧрдП" рдорд╛рди рд╣реИ, рдЬрд┐рди рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдореИрдВрдиреЗ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИред

рдЖрд╣, рдЕрдзрд┐рдХ рдмрд╛рд░реАрдХреА рд╕реЗ рджреЗрдЦрдиреЗ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐, рдФрд░ рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ рдЗрд╕реЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░рд┐рдПрдХреНрдЯ рд╕реНрд░реЛрдд рдореЗрдВ undefined рдХреЗ рд░реВрдк рдореЗрдВ рдЖрд░рдВрдн рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдХреВрд▓ рддреЛ рд╕рдм рдХреБрдЫ рдЖрдбрд╝реВ рдЬреИрд╕рд╛ рд╣реИ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡реИрд╕реЗ рд╣реА рдареАрдХ рд╣реИ, рдмрд╕ рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм рд╣реИ рдХрд┐ рдЪрд╛рд╣реЗ рдЖрдк | null рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ, current рдХрд╛ рдкреНрд░рдХрд╛рд░ рдЕрднреА рднреА рд╢реВрдиреНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдмрд╕ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓рддрд╛ рдмрджрд▓ рдЧрдИ рд╣реИред рд╕рд╛рде рд╣реА, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╣рдореЗрд╢рд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╢реВрдиреНрдп рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдХреНрдпрд╛ рдпрд╣ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╡реИрд▓реНрдпреВ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдорд╛рдиреНрдп рд╣реИ?

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

рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ createContext рдХреЗ рд▓рд┐рдП рдкрд╣рд▓рд╛ рддрд░реНрдХ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рднрд▓реЗ рд╣реА рдЖрдк рдХрд┐рд╕реА рд╕рдВрджрд░реНрдн рдХреЛ undefined рд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реЛрдВред рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ undefined рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдЙрдкрдпреЛрдЧреЛрдВ рдореЗрдВ рдпрд╣ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ:

https://reactjs.org/docs/hooks-faq.html#is -there-something-like-instance-variables
https://reactjs.org/docs/hooks-faq.html#how -to-get-the-previous-props-or-state
https://reactjs.org/docs/hooks-faq.html#how -to-read-an-often-changeing-value-from-usecallback

@ferdaber рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╡рд╣рд╛рдВ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред useRef() (рдХреЛрдИ рддрд░реНрдХ рдирд╣реАрдВ) рдореЗрдВ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ current рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП? undefined ? any ? рдЬреЛ рднреА рд╣реЛ, рднрд▓реЗ рд╣реА рдЖрдк рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рддрд░реНрдХ рджреЗрдВ, рдЗрд╕реЗ | рдПрдб рдХреЗ рд╕рд╛рде undefined рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред _And_ рдпрджрд┐ рдпрд╣ рдПрдХ рд░реЗрдлрд░реА рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рддрддреНрд╡ рд░реЗрдлрд░реА рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ (рди рдХреЗрд╡рд▓ рдереНрд░реЗрдб рд╕реНрдерд╛рдиреАрдп рднрдВрдбрд╛рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ) рддреЛ рдЖрдкрдХреЛ | null рднреА рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╡рд╣рд╛рдВ null рд▓рд┐рдЦ рд╕рдХрддреА рд╣реИред

рдЕрдм рдЖрдк рд╕реНрд╡рдпрдВ рдХреЛ рдХреЗрд╡рд▓ T $ рдХреЗ рдмрдЬрд╛рдп current рдХреЗ рд░реВрдк рдореЗрдВ T | null | undefined рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рддреЗ рд╣реИрдВред

// you should always give an argument even if the docs sometimes miss them
// $ExpectError
const ref1 = useRef()
// this is a mutable ref but you can only assign `null` to it
const ref2 = useRef(null)
// this is also a mutable ref but you can only assign `undefined`
const ref3 = useRef(undefined)
// this is a mutable ref of number
const ref4 = useRef(0)
// this is a mutable ref of number | null
const ref5 = useRef<number | null>(null)
// this is a mutable ref with an object
const ref6 = useRef<React.CSSProperties>({})
// this is a mutable ref that can hold an HTMLElement
const ref7 = useRef<HTMLElement | null>(null)
// this is the only case where the ref is immutable
// you did not say in the generic argument you want to be able to write
// null into it, but you gave a null anyway.
// I am taking this as the sign that this ref is intended
// to be used as an element ref (i.e. owned by React, you're only sharing)
const ref8 = useRef<HTMLElement>(null)
// not allowed, because you didn't say you want to write undefined in it
// this is essentially what would happen if we allowed useRef with no arguments
// to make it worse, you can't use it as an element ref, because
// React might write a null into it anyway.
// $ExpectError
const ref9 = useRef<HTMLElement>(undefined)

рд╣рд╛рдБ рдпрд╣ рдбреАрдПрдХреНрд╕ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдП ++ рд╣реИ рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ рд▓реЛрдЧ рдЗрд╕ рдкрд░ рднреНрд░рдорд┐рдд рд╣реЛрдВрдЧреЗред рдЗрд╕ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдЖрдкрдХреЛ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЯрд╛рдЗрдкрдбреЙрдХ рдореЗрдВ рд╕рд┐рд░реНрдл рдкрд░рдорд╛рд▓рд┐рдВрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП :)

useRef<T>() рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ useRef<T | undefined>(undefined) рдХреЗ рд╕рдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ; рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд╕рд╛рде рдЖрдк рдЬреЛ рднреА рд░реЗрдлрд░реА рдмрдирд╛рддреЗ рд╣реИрдВ рдЙрд╕реЗ рдЕрднреА рднреА рдПрдХ рддрддреНрд╡ рд░реЗрдлрд░реА рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдереНрд░реЗрдб рд╕реНрдерд╛рдиреАрдп рд╕реНрдЯреЛрд░реЗрдЬред

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐... рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдпрджрд┐ рдЖрдк рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рддрд░реНрдХ рджреЗрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ? рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗрд╡рд▓ {} рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдПрдЧрд╛ред рд╕рд╣реА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░рдХрд╛рд░ unknown рд╣реИ рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред

рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рдирд┐рдореНрди рдХреЛрдб рдХреЗ рд╕рд╛рде рдорд┐рд▓ рд░рд╣реА рд╣реИ:

~~~ рдЬреЗрдПрд╕
//...
рдЕрдВрддрд░рд╛рд▓ рд░реЗрдл = рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рджреЗрдВ(рд╢реВрдиреНрдп); // let . рдХреЗ рдмрдЬрд╛рдп const рдХреЗ рд╕рд╛рде рднреА рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛
//...
рдЙрдкрдпреЛрдЧ рдкреНрд░рднрд╛рд╡ (() => {
рдХрд╛рд╕реНрдЯ рдЕрдВрддрд░рд╛рд▓ = рд╕реЗрдЯрдЗрдВрдЯрд░рд╡рд▓ (() => {/* рдХреБрдЫ рдХрд░реЗрдВ */}, 1000);
рдЗрдВрдЯрд░рд╡рд▓ рд░реЗрдлред рдХрд░рдВрдЯ = рдЕрдВрддрд░рд╛рд▓; // рдЗрд╕ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдореБрдЭреЗ рддреНрд░реБрдЯрд┐ рдорд┐рд▓ рд░рд╣реА рд╣реИ

return () => {
    clearInterval(intervalRef.current);
}

})
//...
~рдФрд░ рдЬрдм рдореИрдВ рдпрд╣рд╛рдВ readonly рд╣рдЯрд╛рддрд╛ рд╣реВрдВ рддреЛ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:~ рдЬреЗрдПрд╕
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ RefObject{
рд░реАрдбрдУрдирд▓реА рдХрд░рдВрдЯ: рдЯреА | рд╢реВрдиреНрдп;
}
~~~

рдореИрдВ рд░реАрдХ рд╣реБрдХ рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рджреЛрдиреЛрдВ рдХреЗ рд╕рд╛рде рдирдпрд╛ рд╣реВрдВ (рдмрд╕ рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕рд╛рде рдЖрдЬрд╝рдорд╛ рд░рд╣рд╛ рд╣реВрдВ) рдЗрд╕рд▓рд┐рдП рдореЗрд░рд╛ рдХреЛрдб рдЧрд▓рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдпрджрд┐ рдЖрдк null рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЗ рд╕рд╛рде рдПрдХ рд░реЗрдлрд░реА рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рд╕рдВрджрд░реНрдн рдХреЛ "рд╕реНрд╡рдпрдВ" рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдиреЗ рдХреЗ рдЕрдкрдиреЗ рдЗрд░рд╛рджреЗ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд░реЗрдлрд░реА рдХреЛ рдмрджрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

const intervalRef= useRef<NodeJS.Timeout | null>(null) // <-- the generic type is NodeJS.Timeout | null

@ferdaber рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рдЗрд╕реЗ рдПрдХ рдЪрд░рдг рдФрд░ рдЖрдЧреЗ рд▓реЗ рдЬрд╛рдирд╛ рдФрд░ current рдХреЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдХреНрдпрд╛ рдпрд╣ рд╢рд╛рдпрдж T рдХреЗ рдмрдЬрд╛рдп T | null #$1$#$ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП? рд╣реБрдХ рдХреЗ рдЖрдЧрдорди рдХреЗ рд╕рд╛рде, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ _рд╣рдореЗрд╢рд╛ рдирд╣реАрдВ_ рдпрд╣ рдорд╛рдорд▓рд╛ рд╣реИ рдХрд┐ рд╕рднреА рд░реЗрдлрд░реА null рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдХреНрд╕рд░ рдРрд╕реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЬрд╣рд╛рдВ useRef рдХреЛ рдЧреИрд░-рд╢реВрдиреНрдп рдкреНрд░рд╛рд░рдВрднрдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЙрддреНрдХреГрд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рд╕реВрдЪреА рд╕реЗ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реБрдП https://github.com/DefinitelyTyped/DefinitelyTyped/issues/31065#issuecomment -446660394, рдЕрдЧрд░ рдореИрдВ рд▓рд┐рдЦрддрд╛ рд╣реВрдВ:

const numericRef = useRef<number>(42);

numericRef.current рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП? рдЗрд╕рдХреЗ number | null рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ _need_ рдирд╣реАрдВ рд╣реИред

рдпрджрд┐ рд╣рдо рдкреНрд░рдХрд╛рд░реЛрдВ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

interface RefObject<T> {
  current: T;
}

function useRef<T>(initialValue: T): RefObject<T>;
function useRef<T>(initialValue: T|null): RefObject<T | null>;

function createRef<T>(): RefObject<T | null>;

рдЬреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрдкрдпреЛрдЧреЛрдВ рдФрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдЧрд╛:

const r1 = useRef(42);
// r1 is of type RefObject<number>
// r1.current is of type number (not number | null)

const r2 = useRef<number>(null);
// r2 is of type RefObject<number | null>
// r2.current is of type number | null

const r3 = useRef(null);
// r3 is of type RefObject<null>
// r3.current is of type null

const r4 = createRef<number>();
// r4 is of type RefObject<number | null>
// r4.current is of type number | null

рдХреНрдпрд╛ рд╡рд╣рд╛рдВ рдХреБрдЫ рдЧрд▓рдд рд╣реИ?

рд░рд┐рдПрдХреНрдЯ рдЯреАрдо рдХреЗ рдЕрдиреБрд╕рд╛рд░, "рдПрдХ рдЕрдкрд░рд┐рдореЗрдп useRef рдХрд╛ рдкреНрд░рдХрд╛рд░ рдХреНрдпрд╛ рд╣реИ?" рдХреЗ рдЙрддреНрддрд░ рдХреЗ рд▓рд┐рдП, рдЙрддреНрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рд╡рд╣ рдХреЙрд▓ (рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдХреЗ рдмрд╛рд╡рдЬреВрдж) рдЧрд▓рдд рд╣реИред

рдореИрдВрдиреЗ рдбреАрдУрдПрдо/рдШрдЯрдХ рд░реЗрдлрд░реА рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛ рдЕрдзрд┐рднрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ |null _specifically_ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рднрд╛рд░ рдЬреЛрдбрд╝рд╛, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╣рдореЗрд╢рд╛ рд╢реВрдиреНрдп рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рд╡реЗ рд╣рдореЗрд╢рд╛ рдЕрдирдорд╛рдЙрдВрдЯ рдкрд░ рд╢реВрдиреНрдп рдкрд░ рд░реАрд╕реЗрдЯ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдЖрдк рдХрднреА рднреА рд╡рд░реНрддрдорд╛рди рдХреЛ рдкреБрди: рдЕрд╕рд╛рдЗрди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддреЗ рд╣реИрдВред

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлреНрд░реЛрдЬрди рдСрдмреНрдЬреЗрдХреНрдЯ/рдЧреЗрдЯрд░-рдУрдирд▓реА рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд▓реЙрдЬрд┐рдХ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдмрдЪрд╛рд╡ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рднреА рдХреБрдЫ рд╣реИред

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

рдЖрд╣, рд╣рд╛рдБ, рдЕрдм рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБ рдХрд┐ MutableRefObject<T> рдХреА рддреБрд▓рдирд╛ рдореЗрдВ RefObject<T> | null рдорд╛рдорд▓реЗ рдХреЛ рдкрд╣рд▓реЗ рд╣реА рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рддреЛ useRef<number>(42) рдорд╛рдорд▓рд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рд╣рдореЗрдВ createRef рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ? рдЕрднреА рдпрд╣ рдПрдХ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп RefObject<T> рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╣рдорд╛рд░реЗ рдХреЛрдбрдмреЗрд╕ рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдПрдВ рдкреИрджрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдкрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЙрд╕реА рддрд░рд╣ (рдореНрдпреВрдЯреЗрдмрд▓) useRef рд░реЗрдл рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдХреНрдпрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рд╣рдо createRef рдЯрд╛рдЗрдкрд┐рдВрдЧ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЗрд╕реЗ рдореНрдпреВрдЯреЗрдмрд▓ рд░реЗрдл рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓ рд╕рдХреЗ?

(рдФрд░ ref рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ Ref<T> рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ RefObject<T> рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╕рдм рдХреБрдЫ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХ рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛ рд╣реИ: рднрд▓реЗ рд╣реА рд╣рдореЗрдВ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп useRef рд╕реЗ рджреЗрдЦреЗрдВ, рд╣рдо рдЗрд╕ рддрдереНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ forwardRef рдХреЙрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИред)

рд╣рдореНрдо ... рд╢рд╛рдпрдж рд╣рдо рдПрдХ рд╣реА рдЪрд╛рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП рдХрд┐ рдЗрд╕рдореЗрдВ рдХреЛрдИ рддрд░реНрдХ рдирд╣реАрдВ рд╣реИ (рдФрд░ рд╣рдореЗрд╢рд╛ рд╢реВрдиреНрдп рдХреЗ рд░реВрдк рдореЗрдВ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ) рдЗрд╕реЗ рдПрдХ рд╕рд╢рд░реНрдд рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

: null extends T ? MutableRefObject<T> : RefObject<T> рдХреЛ рдЙрд╕реА рддрд░реНрдХ рдХреЛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЙрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдЗрд╕рдореЗрдВ рдирд▓ рдбрд╛рд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рд╣реИ, рдпрджрд┐ рдЖрдк рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдЕрднреА рднреА рд╡рд░реНрддрдорд╛рди рдЕрд░реНрде рдореЗрдВ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИред

рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред рдЪреВрдВрдХрд┐ createRef рдХреЛрдИ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ рд▓реЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рдВрднрд╡рддрдГ рдЗрд╕реЗ рд╣рдореЗрд╢рд╛ | null рд╡рд┐рдХрд▓реНрдк рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ ( useRef рдХреЗ рд╡рд┐рдкрд░реАрдд), рддрд╛рдХрд┐ рд╢рд╛рдпрдж MutableRefObject<T | null> рдХрд╣рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ?

рдореИрдВ рдпрд╛ рддреЛ рдЯреАрдПрд╕ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реВрдВред рдпрд╣рд╛рдБ TS рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рдЗрд╕рдХреЗ рд╕рд╛рде рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
https://tinyurl.com/y75c32y3

рдкреНрд░рдХрд╛рд░ рдХреЛ рд╣рдореЗрд╢рд╛ MutableRefObject рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣рдЪрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЖрдкрдХреЛ рдХреНрдпрд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо forwardRef рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдпрд╣ ref рдХреЛ Ref<T> рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ MutableRefObject рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИред

(рд╣рдорд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдЬреЛ рдХрдард┐рдирд╛рдИ рдкреИрджрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ рд╡рд╣ mergeRefs рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╣реИ рдЬреЛ рд░реЗрдлрд░реА рдХреА рдПрдХ рд╕рд░рдгреА рд▓реЗрддрд╛ рд╣реИ, рдЬреЛ рдпрд╛ рддреЛ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд░реЗрдлрд░реА рдпрд╛ рд░реЗрдлрд░реА рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдПрдХ рд╕рдВрдпреБрдХреНрдд рд░реЗрдлрд░реА [рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд░реЗрдлрд░реА] рдмрдирд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдПрдХ рдШрдЯрдХ рдХреЗ рд▓рд┐рдПред рд╡рд╣ рд╕рдВрдпреБрдХреНрдд рд░реЗрдлрд░реА рддрдм рдХрд┐рд╕реА рднреА рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрджрд░реНрднрд┐рдд рддрддреНрд╡ рдХреЛ рд╕рднреА рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рд░реЗрдлрд░реА рдХреЛ рд╡рд┐рддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдпрд╛ рддреЛ рдЙрдиреНрд╣реЗрдВ рдХреЙрд▓ рдХрд░рдХреЗ рдпрджрд┐ рд╡реЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд░реЗрдлрд░реА рд╣реИрдВ, рдпрд╛ .current рд╕реЗрдЯ рдХрд░рдХреЗ рдпрджрд┐ рд╡реЗ рд░реЗрдлрд░реА рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрд╕реНрддрд┐рддреНрд╡ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп RefObject<T> рдФрд░ MutableRefObject<T> in Ref<T> рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреА рдХрдореА рдЗрд╕реЗ рдХрдард┐рди рдмрдирд╛ рджреЗрддреА рд╣реИред рдХреНрдпрд╛ рдореБрдЭреЗ рдлреЙрд░рд╡рд░реНрдбрд░реЗрдл рдФрд░ рд░реЗрдл рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджрд╛ рдЙрдард╛рдирд╛ рдЪрд╛рд╣рд┐рдПрдореБрд╢реНрдХрд┐рд▓реЗрдВ?)

рд╣рдо рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП useRef рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд╣реАрдВ рдмрджрд▓ рд░рд╣реЗ рд╣реИрдВ (рд╣рд╛рд▓рд╛рдВрдХрд┐ createRef рдЕрднреА рднреА рдЪрд░реНрдЪрд╛ рдореЗрдВ рд╣реИ), рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рддрд░реНрдХ рдкрд░ рдХреЛрдИ рдкреНрд░рд╢реНрди рд╣реИрдВ?

рдХреНрдпрд╛ рдореБрдЭреЗ https://github.com/DefinitelyTyped/DefinitelyTyped/issues/31065#issuecomment -457650501 рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджрд╛ рдЙрдард╛рдирд╛ рдЪрд╛рд╣рд┐рдП?

рд╣рд╛рдБ, рдЪрд▓рд┐рдП рдЗрд╕реЗ рдЕрд▓рдЧ рдХрд░рддреЗ рд╣реИрдВред

рдпрджрд┐ рдЖрдк рдПрдХ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд░реЗрдл рдСрдмреНрдЬреЗрдХреНрдЯ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рд╢реВрдиреНрдп рдорд╛рди рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╕рд╛рдорд╛рдиреНрдп рддрд░реНрдХ рдХреЛ | null рднреА рджреЗрдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВред рдпрд╣ рдЗрд╕реЗ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдмрдирд╛ рджреЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЗрд╕реЗ "рд╕реНрд╡рд╛рдорд┐рддреНрд╡" рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! useRef рдЬреЗрдиреЗрд░рд┐рдХ рдореЗрдВ рд╢реВрдиреНрдп рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╣рд▓ рд╣реЛ рдЧрдпрд╛ред

рдкрд╣рд▓реЗ

const ref = useRef<SomeType>(null) 

// Later error: Cannot assign to 'current' because it is a constant or a read-only property.

рдмрд╛рдж

const ref = useRef<SomeType | null>(null)

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

рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реБрдХ рдмрдирд╛рдпрд╛:

export const useCombinedRefs = <T>(...refs: Ref<T>[]) =>
    useCallback(
        (element: T) =>
            refs.forEach(ref => {
                if (!ref) {
                    return;
                }

                if (typeof ref === 'function') {
                    ref(element);
                } else {
                    ref.current = element; // this line produces error
                }
            }),
        refs,
    );

рдФрд░ рдореБрдЭреЗ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ: "'рд╡рд░реНрддрдорд╛рди' рдХреЛ рдЕрд╕рд╛рдЗрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдкрддреНрддрд┐ рд╣реИред"
рдХреНрдпрд╛ current рдХреЛ рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп рдореЗрдВ рдмрджрд▓реЗ рдмрд┐рдирд╛ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ?

рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдзреЛрдЦрд╛ рджреЗрдирд╛ рдкрдбрд╝реЗрдЧрд╛ред

(ref.current as React.MutableRefObject<T> ).current = element;

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

рд╣рдо рд╕рдорд╛рди рдЕрдзрд┐рднрд╛рд░ рддрд░реНрдХ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП createRef рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рддрд░реНрдХ рдирд╣реАрдВ рд╣реИ, рдЗрд╕реЗ рд╕рд╢рд░реНрдд рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╛рдкрд╕реА рдХреЗ рд╕рд╛рде рд╣реЛрдирд╛ рд╣реЛрдЧрд╛ред рдпрджрд┐ рдЖрдк | null рд╢рд╛рдорд┐рд▓ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ MutableRefObject рд▓реМрдЯрд╛рдПрдЧрд╛, рдпрджрд┐ рдЖрдк рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ (рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп) RefObject рд╣реЛрдЧрд╛ред

рдмрд╣реБрдд - рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж

(ref.current as React.MutableRefObject<T>).current = element;

рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

(ref as React.MutableRefObject<T>).current = element;

рдЖрдк рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЖрдВрддрд░рд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдирдХрд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ

рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкреБрд░рд╛рдиреЗ рд╣реИрдВ? рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕реЗ рдПрдХ рдЗрдЪреНрдЫрд┐рдд рдХрд╛рд░реНрдпрдкреНрд░рд╡рд╛рд╣ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЖрдВрддрд░рд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВред

рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЖрдкрдХреЗ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рд╡рд╛рд▓реЗ рд░реЗрдлрд░реА рдХрд╛ рдЬрд┐рдХреНрд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрди рд░реЗрдлрд░реА рдХреЗ рд▓рд┐рдП рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдПрдХ HTML рддрддреНрд╡ рдХреЗ рд▓рд┐рдП ref рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП _to you_ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

function Component() {
  // same API, different type semantics
  const countRef = useRef<number>(0); // not readonly
  const divRef = useRef<HTMLElement>(null); // readonly

  return <button ref={divRef} onClick={() => countRef.current++}>Click me</button>
}

рдореЗрд░рд╛ рдмреБрд░рд╛, рдЖрдЧреЗ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ред рдореЗрд░реЗ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рд╡рд╛рд▓реЗ рд░реЗрдлрд░реА рдХреЗ рд▓рд┐рдП readonly рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓реА рдФрд░ рдорд╛рди рд▓рд┐рдпрд╛ рдХрд┐ рдпрд╣ рд╡рд╣реА рдорд╛рдорд▓рд╛ рдерд╛ред (рдореИрдВ рдЕрдм рдПрдХ рдЕрд▓рдЧ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЕрдм рдФрд░ рддреНрд░реБрдЯрд┐ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ ...)

рд╡реИрд╕реЗ рднреА, рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж!

рдореИрдВ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реВрдВ рдХрд┐ рд╡рд┐рд╖рдп рдХрд╛ createRef рднрд╛рдЧ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛ рдЧрдпрд╛ рд╣реИ - рд▓реЗрдХрд┐рди рдореИрдВ рдпрд╣рд╛рдВ рднреА рдкреЛрд╕реНрдЯ рдХрд░реВрдВрдЧрд╛ред

рдореИрдВ рд░рд┐рдПрдХреНрдЯ рдиреЗрдЯрд┐рд╡ (рд░рд┐рдПрдХреНрд╢рди рдиреЗрд╡рд┐рдЧреЗрд╢рди) рдХреЗ рд▓рд┐рдП рдПрдХ рд▓реЛрдХрдкреНрд░рд┐рдп рдиреЗрд╡рд┐рдЧреЗрд╢рди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдЕрдкрдиреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рдпрд╣ рдЖрдорддреМрд░ рдкрд░ createRef рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рд░реЗрдлрд░реА рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рдмрдВрдзрд┐рдд рдирд╣реАрдВ рдХрд░ рд░рд╣реА рд╣реИ (рдХреЛрдИ рдбреЛрдо рдирд╣реАрдВ рд╣реИ)ред

рдХреНрдпрд╛ рд░рд┐рдПрдХреНрдЯ рдиреЗрдЯрд┐рд╡ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдЕрд▓рдЧ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?

рджреЗрдЦреЗрдВ: https://reactnavigation.org/docs/navigating-without-navigation-prop

@sylvanaar
рдиреЗрд╡рд┐рдЧреЗрд╢рди рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп рдореБрдЭреЗ рднреА рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛, рдХреНрдпрд╛ рдЖрдкрдХреЛ рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛ рд╣реИ?

рдЬреЛ рдореИрдВрдиреЗ рдЕрднреА рдкрдврд╝рд╛ рд╣реИ рдЙрд╕рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢: createRef<T> рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рд░реЗрдлрд░реА рдХреЗ рд▓рд┐рдП рдорд╛рди рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЗрд╕реЗ рдбрд╛рд▓рдирд╛ рд╣реИ? рдЗрд╕рдХреЗ рдкреАрдЫреЗ рдХреНрдпрд╛ рддрд░реНрдХ рд╣реИ? рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ readonly рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рд░реЗрдлрд░реА рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рди рдХреЛ рд░реЛрдХ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреВрд░реЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЛ рд╣рд░рд╛ рд░рд╣рд╛ рд╣реИред

TLDR: рдпрджрд┐ рдЖрдкрдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдорд╛рди null (рд╡рд┐рд╡рд░рдг: рдпрд╛ рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдмрд╛рд╣рд░ рдХреБрдЫ рдФрд░) рд╣реИ, рддреЛ рдЕрдкрдиреЗ рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ | null рдЬреЛрдбрд╝реЗрдВ, рдФрд░ рдЗрд╕рд╕реЗ .current рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдкрд╕рдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реМрдВрдкрд╛ рдЬрд╛рдирд╛ред

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

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

[рдбреА3] рдореЙрдбреНрдпреВрд▓ 'рдбреА3-рд╕реНрдХреЗрд▓' рдкрд╣рд▓реЗ рд╣реА 'рдЗрдВрдЯрд░рдкреЛрд▓реЗрдЯрдХреВрд▓' рдирд╛рдо рдХреЗ рдПрдХ рд╕рджрд╕реНрдп рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд░ рдЪреБрдХрд╛ рд╣реИред рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреБрдирдГ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
matt-senseye picture matt-senseye  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

victor-guoyu picture victor-guoyu  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

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

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

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