Definitelytyped: [@ рдкреНрд░рдХрд╛рд░/рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛] рд░реЗрдл рдкреНрд░реЛрдк рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рд░реЗрдл рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рд╕рдВрдШрд░реНрд╖

рдХреЛ рдирд┐рд░реНрдорд┐рдд 19 рдордИ 2019  ┬╖  12рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: DefinitelyTyped/DefinitelyTyped

  • [x] рдореИрдВрдиреЗ @types/16.8.17 рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ рдореБрдЭреЗ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реБрдИрдВред
  • [x] рдореИрдВрдиреЗ tsc рдХреЗ рдирд╡реАрдирддрдо рд╕реНрдерд┐рд░ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ред https://www.npmjs.com/package/typescript
  • [x] рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░рд╢реНрди рд╣реИ рдЬреЛ StackOverflow рдХреЗ рд▓рд┐рдП рдЕрдиреБрдкрдпреБрдХреНрдд рд╣реИред (рдХреГрдкрдпрд╛ рд╡рд╣рд╛рдВ рдХреЛрдИ рдЙрдкрдпреБрдХреНрдд рдкреНрд░рд╢реНрди рдкреВрдЫреЗрдВ)ред
Type 'MutableRefObject<HTMLDivElement | undefined>' is not assignable to type 'string | ((instance: HTMLDivElement | null) => void) | RefObject<HTMLDivElement> | null | undefined'.
  Type 'MutableRefObject<HTMLDivElement | undefined>' is not assignable to type 'RefObject<HTMLDivElement>'.
    Types of property 'current' are incompatible.
      Type 'HTMLDivElement | undefined' is not assignable to type 'HTMLDivElement | null'.
        Type 'undefined' is not assignable to type 'HTMLDivElement | null'.

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

рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╕рд╛рдл рд╕рдорд╛рдзрд╛рди рд╣реИ рдХрд┐ рдпреВрдЬрд╝рд░рдл рдлрдВрдХреНрд╢рди рдХреЙрд▓ рдореЗрдВ рдЗрдирд┐рд╢рд┐рдпрд▓рд╡реИрд▓реНрдпреВ рдХреЛ рд╢реВрдиреНрдп рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВ

const componentRef = useRef<HTMLDivElement>(null);

рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ ComponentsRef = HTMLDivElement | null рдЬреЛ рдХрд┐ рд░реЗрдлрд░реА рдкреНрд░реЛрдк HTMLDivElement | undefined рдХреЗ рдмрдЬрд╛рдп рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред

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

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ 2: рдореЗрд░реЗ рд╕рдорд╛рдзрд╛рди рдХреА рдЕрд╡рд╣реЗрд▓рдирд╛ рдХрд░реЗрдВ, рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ :)

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

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЕрдм рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд╕реНрд╡реАрдХрд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЗрддрдирд╛ рд╕реБрдВрджрд░ рдирд╣реАрдВ, рд╕рдорд╛рдзрд╛рди:

const inputField = React.useRef() as React.MutableRefObject<HTMLInputElement>;

рдпрд╣рд╛рдВ рдорд┐рд▓рд╛: https://github.com/DefinitelyTyped/DefinitelyTyped/issues/28884#issuecomment -471341041

рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╕рд╛рдл рд╕рдорд╛рдзрд╛рди рд╣реИ рдХрд┐ рдпреВрдЬрд╝рд░рдл рдлрдВрдХреНрд╢рди рдХреЙрд▓ рдореЗрдВ рдЗрдирд┐рд╢рд┐рдпрд▓рд╡реИрд▓реНрдпреВ рдХреЛ рд╢реВрдиреНрдп рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВ

const componentRef = useRef<HTMLDivElement>(null);

рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ ComponentsRef = HTMLDivElement | null рдЬреЛ рдХрд┐ рд░реЗрдлрд░реА рдкреНрд░реЛрдк HTMLDivElement | undefined рдХреЗ рдмрдЬрд╛рдп рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред

@shane935 рдЖрдкрдиреЗ рдореЗрд░рд╛ рджрд┐рди рдмрдирд╛ рджрд┐рдпрд╛ рд╕рд░

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ undefined рдХреЛ RefObject<T>.current рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреИрд╕реЗ:

//index.ts, line 80
interface RefObject<T> {
   readonly current: T | null;
}

рддреЛ рдпрд╣ рдкрдврд╝рддрд╛ рд╣реИ

//index.ts, line 80
interface RefObject<T> {
   readonly current: T | null | undefined;
}

рдпрд╣ рдХреЛрдИ рдмрдЧ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдПрдХ рд╡реИрдз рдЯрд╛рдЗрдкрд┐рдВрдЧ рддреНрд░реБрдЯрд┐ рдкрдХрдбрд╝ рд░рд╣рд╛ рд╣реИред

рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВ https://github.com/DefinitelyTyped/DefinitelyTyped/pull/38228#issuecomment -529749802

рдЬреИрд╕реЗ @Jessidhia рдХрд╣рддреЗ рд╣реИрдВ, рдпрд╣ рдХреЛрдИ рдмрдЧ рдирд╣реАрдВ рд╣реИ, рд╢рд╛рдпрдж рдЖрдкрдХреЛ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред

import React, {
  forwardRef,
  ForwardRefRenderFunction,
  useImperativeHandle,
  useRef,
  PropsWithChildren,
} from "react";

interface Props {}
interface Ref {
  value: string;
  setValue: (value: string) => void;
}

const InputEmail: ForwardRefRenderFunction<Ref, PropsWithChildren<Props>> = (
  props,
  ref
) => {
  // hooks
  const inputElement = useRef<HTMLInputElement | null>(null);
  useImperativeHandle(ref, () => {
    return {
      value: inputElement.current ? inputElement.current.value : "",
      setValue: (value: string) => {
        inputElement.current && (inputElement.current.value = value);
      },
    };
  });

  // render
  return (
    <div>
      <input
        type="text"
        ref={inputElement}
        defaultValue="[email protected]"
        disabled
      />
    </div>
  );
};

const Component = forwardRef(InputEmail);

export default Component;

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╣рд░ рдХрд┐рд╕реА рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░ рджреЗрдЧрд╛, рдФрд░ рдореИрдВ рдЗрд╕ рд╕рд╛рдорд╛рди рдкрд░ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдирд╣реАрдВ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рд░реЗрдлрд░реА рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛ рдЧреБрдЬрд░ рд░рд╣рд╛ рдерд╛ рдЙрд╕рдХреЗ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдФрд░ рдШрдЯрдХ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд░реЗрдл рдкреНрд░рдХрд╛рд░ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рдмрд╛рдж рдореИрдВ рд░реЗрдлрд░реА рдХреЛ рдкрд╛рд╕ рдХрд░ рд░рд╣рд╛ рдерд╛ , рдРрд╕рд╛ рд▓рдЧ рд░рд╣рд╛ рдерд╛ рдЬреИрд╕реЗ рдореЗрд░реЗ рдкрд╛рд╕ рдЗрдВрдЯрд░рдлреЗрд╕ рдЧрд▓рдд рдерд╛ред

рдореБрдЭреЗ рд╢реБрд░реВ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рдкреНрд░реЙрдкреНрд╕ рдХрд╛ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдерд╛:

type TextboxProps = CustomProps & React.HTMLProps<HTMLInputElement>

рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдмрджрд▓ рджрд┐рдпрд╛:

type TextboxProps = CustomProps & React.HTMLAttributes<HTMLInputElement>

рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреА рддреНрд░реБрдЯрд┐ рддрдм рдЧрд╛рдпрдм рд╣реЛ рдЧрдИред

рдореИрдВ рдпрд╣ рджрд┐рдЦрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рдЬрд┐рддрдирд╛ рдЬрд╛рдирддрд╛ рд╣реВрдВ рдЙрд╕рд╕реЗ рдЕрдзрд┐рдХ рдЬрд╛рдирддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди HTMLProps рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдкрд┐рдВрдЧ рдФрд░ React.forwardRef() рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░ рдХреЛ рджреЗрдЦрдХрд░ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ RefAttributes рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ. рдЙрд╕рдХреЗ рдареАрдХ рдКрдкрд░, рдЖрдк ClassAttributes . рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВрдЯрд╛рдЗрдк рдХрд░реЗрдВ рдХрд┐ HTMLPropsрд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ LegacyRef рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИрдЯрд╛рдЗрдк рдЬреЛ рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдореЗрд░реА рдЯрд╛рдЗрдкрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛ рдкреИрджрд╛ рдХрд░ рд░рд╣рд╛ рдерд╛ред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ useRef() рдХреЗ рд▓рд┐рдП 3 рдУрд╡рд░рд▓реЛрдб рд╣реИрдВ, рдХреНрдпрд╛ рд╣рдореЗрдВ рд╕рднреА 3 рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ useRef<T>(null) рдорд╛рдорд▓рд╛ рдПрдХ рдРрд╕рд╛ рдорд╛рдорд▓рд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдордп рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

    function useRef<T>(initialValue: T): MutableRefObject<T>;
    function useRef<T>(initialValue: T|null): RefObject<T>;
    function useRef<T = undefined>(): MutableRefObject<T | undefined>;
  1. рджреЛ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдЕрдзрд┐рднрд╛рд░реЛрдВ рдХрд╛ рдЕрдкреЗрдХреНрд╖рд┐рдд рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдХреНрдпрд╛ рд╣реИ?
  2. рдХреНрдпрд╛ рдХреЛрдИ рдФрд░ рддрд░реАрдХрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ "рд╕рд╣реА" рдЕрдзрд┐рднрд╛рд░ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдвреВрдВрдв рд╕рдХреЗрдВ?

рдореЗрд░реЗ рдкрд╛рд╕ RefObject рд╣реИ:

Screen Shot 2020-08-23 at 1 06 16 PM

рдореИрдВ рдЗрд╕реЗ рдЕрдкрдиреЗ Panel рдШрдЯрдХ рдХреЛ рдкреНрд░реЛрдк ref рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ:

Screen Shot 2020-08-23 at 1 06 04 PM

рдореИрдВ рдЙрдкрднреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ w/ forwardRef , рдпрд╣ рдмрди рдЬрд╛рддрд╛ рд╣реИ MutableRefObject :

Screen Shot 2020-08-23 at 1 06 56 PM

рдореИрдВ рдЕрдм .current рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рд╣реВрдВ:

Screen Shot 2020-08-23 at 1 10 27 PM

@ Jessidhia @osf2e рдЖрдкрдХрд╛ рд╕реБрдЭрд╛рд╡ рдпрд╣рд╛рдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддрд╛ред

рдореБрдЭреЗ рдЬрд┐рд╕ рд╕рдорд╛рдзрд╛рди рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓реЗрдирд╛ рдкрдбрд╝рд╛ рд╣реИ:

        if (ref && (ref as RefObject<HTMLDivElement>).current) {
              // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
              (ref as RefObject<
                HTMLDivElement
              >)!.current!.style.height = `${containerHeight}px`;
            }

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдореВрд▓-рд╡реЗрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдореБрдЭреЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред

import {RefObject} from 'react';
// ...
const myRef = useRef() as RefObject<View>

рдореБрдЭреЗ Input рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рд░реЗрдлрд░реА рдХреЗ рд╕рд╛рде рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдереА
рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ useRef<HTMLDivElement>() -> useRef<HTMLInputElement>() рд╕реЗ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕рдиреЗ рдареАрдХ рдХрд╛рдо рдХрд┐рдпрд╛

@joshribakoff рдЖрдк рд╕реАрдзреЗ рдкреИрд░рд╛рдореАрдЯрд░ рднреА рдЯрд╛рдЗрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

export const Panel = React.forwardRef((props: PanelProps, ref: React.RefObject<HTMLDivElement>) => {

рдЗрд╕ рддрд░рд╣ рдЖрдкрдХреЛ рдЕрдкрдирд╛ рд░реЗрдлрд░реА рдПрдХреНрд╕реЗрд╕ рдХрд░рддреЗ рд╕рдордп рдЯрд╛рдЗрдкрдХрд╛рд╕реНрдЯ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрднреА рднреА рд╕рдордЭ рдирд╣реАрдВ рдЖ рд░рд╣рд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдРрд╕рд╛ рдХреНрдпреЛрдВ рдХрд░рдирд╛ рд╣реИ...

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