Definitelytyped: React.d.ts рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП<t>рд░рд╛рдЬреНрдп рдФрд░ рд╕рд╣рд╛рд░рд╛ рдореЗрдВ</t>

рдХреЛ рдирд┐рд░реНрдорд┐рдд 25 рдЬрдире░ 2017  ┬╖  91рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: DefinitelyTyped/DefinitelyTyped

рдирдорд╕реНрддреЗ @ericanderson

рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдореБрдЭреЗ рдЗрд╕ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде рдХрдИ рд╕рдорд╕реНрдпрд╛рдПрдВ рдЖ рд░рд╣реА рд╣реИрдВ:

рд╕рдорд╕реНрдпрд╛ 1: рдкрд░рд┐рднрд╛рд╖рд╛ рдкрд░ рдЬрд╛рдПрдБ

рдЬрдм рдЖрдк рдкреНрд░реЙрдкреНрд╕ рдпрд╛ рд╕реНрдЯреЗрдЯ рдХреА рдкреНрд░реЙрдкрд░реНрдЯреА рдкрд░ рдЧреЛ рдЯреВ рдбреЗрдлрд┐рдирд┐рд╢рди рджрдмрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

interface MyComponentProps {
    name: string;
}

export abstract class MyComponent extends React.Component<MyComponentProps , void> {
    myMethood() {
       this.props.name; //<-- Go To definition in name
   }
}

image

рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕рджрд╕реНрдп рдХреГрддреНрд░рд┐рдо рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реИрд╕реЗ рднреА рдкрд░реЗрд╢рд╛рди рд╣реЛрддрд╛ рд╣реИред

рд╕рдорд╕реНрдпрд╛ 2: рдШрдЯрдХреЛрдВ рдХреЗ рдкрджрд╛рдиреБрдХреНрд░рдо (рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рд╛рдорд╛рдиреНрдп рдкреА)

рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг, рдпрджрд┐ рдЖрдк рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЕрдореВрд░реНрдд рдШрдЯрдХ рдмрдирд╛рддреЗ рд╣реИрдВ:

interface MyBaseProps {
    onChange?: (val: any) => void;
}

export abstract class MyBase<P extends MyBaseProps> extends React.Component<P, void> {
    myMethood() {
        this.props.onChange!(2); //The type is S["onChange"] instead of (val: any) => void and so is not invocable. 
   }
}

рдЯреАрдПрд╕ рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ рдХрд┐ рдЪреЗрдВрдЬ рдкрд░ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рд╣реИ, рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдЙрд╕рдХрд╛ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рдЦреЛрдЬрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

image

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

рд╕рдорд╕реНрдпрд╛ 3: рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред

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

C# this.state.name = "John"; this.forceUpdate(); //Ok as long as you don't setState afterwards, but calling setState also is annoying with the callback.

рдХреНрдпрд╛ рдЗрд╕рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИ? рдирд╣реАрдВред
рдХреНрдпрд╛ рдпрд╣ рд╡рд░реНрдЬрд┐рдд рд╣реИ? рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдирд╣реАрдВ, рдЕрдиреНрдпрдерд╛ рдмрд▓ рдЕрдкрдбреЗрдЯ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рдмреЗрд╢рдХ рдЖрдк рд░рд╛рдЬреНрдп рдХреЛ S (рдпрд╛ any ) рдореЗрдВ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдмрджрд▓рд╛рд╡ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреИрдЯрд░реНрди рд╣реИ рддреЛ рдмреЛрдЭрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖: рдХреНрдпрд╛ рдпрд╣ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реИ?

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

рджреВрд╕рд░реА рддрд░рдл, setState рдХрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ Pick<S,K> рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ред

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

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ 3 рдмрд╣рд╕ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред

рдЖрдк рд╕рд╣реА рд╣реИрдВ рдХрд┐ рдЖрдк рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдХреЛ рд░рд┐рдПрдХреНрдЯ рдореЗрдВ _рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдЙрд╕ рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рдерд╛ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд░рд┐рдПрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рдерд╛ред

рдЗрд╕реЗ 3 рдЕрд▓рдЧ-рдЕрд▓рдЧ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕рд╛рдорд╛рдиреНрдп рдЖрд░рдВрднреАрдХрд░рдг

interface State {
  bar: number;
}

interface Props {
  baz: number;
}

class Foo extends React.Component<Props, State> {
  public state: State = {
    bar: 5,
  };
}

рд╕рд╣рд╛рд░рд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЖрд░рдВрднреАрдХрд░рдг

interface State {
  bar: number;
}

interface Props {
  baz: number;
}

class Foo extends React.Component<Props, State> {
  constructor(props: Props) {
    super(props);
    this.state = {
      bar: props.baz,
    };

    // or
    this.setState({
      bar: props.baz,
    });
  }
}

forceUpdate рдХреЗ рд╕рд╛рде рд░реИрдВрдбрдо рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ

рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд▓реЛрдЧреЛрдВ рдХреЛ "рд╕рд╣реА" рдЪреАрдЬрд╝ рдХреА рдУрд░ рдзрдХреЗрд▓рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдЖрдк public state рдХреЛ рдлрд┐рд░ рд╕реЗ рдШреЛрд╖рд┐рдд рдХрд░рдХреЗ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

interface State {
  bar: number;
}

class Foo extends React.Component<{}, State> {
  public state: State;
  public myMethod() {
    this.state.bar = 5;
  }
}

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

рдЖрдкрдХрд╛ рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдХрд┐рд╕ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ?

@vsaio sa . рдХреЗ рд▓рд┐рдП

рд╕рдорд╕реНрдпрд╛ 1 рдХреЗ рд▓рд┐рдП, TS 2.1.5 рдФрд░ рдирд╡реАрдирддрдо VSCode рдХреЗ рд╕рд╛рде, рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ рд╡рд┐рдВрдбреЛрдЬрд╝/рд╡реАрдПрд╕ рдирд╣реАрдВ рд╣реИ рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╡рд╣рд╛рдВ рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рд╢рд░реНрдд рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдкрдХреЗ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдореЗрдВ рдЕрдкрдбреЗрдЯ рд╣реИрдВ рдпрд╛ рдЖрдк рдЯреАрдПрд╕ 2.1.5 рдкрд░ рдирд╣реАрдВ рд╣реИрдВ

рд╕рдорд╕реНрдпрд╛ 2 рдХреЗ рд▓рд┐рдП рд╡рд╣реА

рдЯреАрдПрд╕ 2.1.5.0 . рдХреЗ рд╕рд╛рде рд╡реА.рдПрд╕. 2015

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ 3 рдмрд╣рд╕ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред

рдЖрдк рд╕рд╣реА рд╣реИрдВ рдХрд┐ рдЖрдк рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдХреЛ рд░рд┐рдПрдХреНрдЯ рдореЗрдВ _рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдЙрд╕ рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рдерд╛ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд░рд┐рдПрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рдерд╛ред

рдЗрд╕реЗ 3 рдЕрд▓рдЧ-рдЕрд▓рдЧ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕рд╛рдорд╛рдиреНрдп рдЖрд░рдВрднреАрдХрд░рдг

interface State {
  bar: number;
}

interface Props {
  baz: number;
}

class Foo extends React.Component<Props, State> {
  public state: State = {
    bar: 5,
  };
}

рд╕рд╣рд╛рд░рд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЖрд░рдВрднреАрдХрд░рдг

interface State {
  bar: number;
}

interface Props {
  baz: number;
}

class Foo extends React.Component<Props, State> {
  constructor(props: Props) {
    super(props);
    this.state = {
      bar: props.baz,
    };

    // or
    this.setState({
      bar: props.baz,
    });
  }
}

forceUpdate рдХреЗ рд╕рд╛рде рд░реИрдВрдбрдо рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ

рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд▓реЛрдЧреЛрдВ рдХреЛ "рд╕рд╣реА" рдЪреАрдЬрд╝ рдХреА рдУрд░ рдзрдХреЗрд▓рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдЖрдк public state рдХреЛ рдлрд┐рд░ рд╕реЗ рдШреЛрд╖рд┐рдд рдХрд░рдХреЗ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

interface State {
  bar: number;
}

class Foo extends React.Component<{}, State> {
  public state: State;
  public myMethod() {
    this.state.bar = 5;
  }
}

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

class TBaseState {
  public value: string;
}

function globalFunc<T extends Readonly<TBaseState>>(item: T) {
}

class MyComponent<TProps, TState extends TBaseState> extends React.Component<TProps, TState> {
  broken() {
    // typing of this.state is Readonly<TState>
    // this is not assignable to Readonly<TBase>
    globalFunc(this.state);

    // this is a horrible hack to fix the generics variance issue
    globalFunc(this.state as TState as Readonly<TBaseState>);
  }
}

class MyState extends TBaseState {
}

let component: MyComponent<any, MyState>;

// here the typing of component.state is Readonly<MyState>
// this is assignable to Readonly<TBase>
globalFunc(component.state);

рдореИрдВ рдЯреАрдПрд╕ 2.1.5.0 . рдореЗрдВ рд╣реВрдВ

image

рд▓реЗрдХрд┐рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡реАрдПрд╕ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡реАрдПрд╕ рдХреЛрдб рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рдЯреАрдПрд╕ рдЕрдиреБрднрд╡ рд╣реЛ ...

рд╕рдорд╕реНрдпрд╛ 1 рдХреЗ рд▓рд┐рдП, рдкрд░рд┐рднрд╛рд╖рд╛ рдкрд░ рдЬрд╛рдПрдБ TS VS рдХреЛрдб рдореЗрдВ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:

interface MyComponentProps {
    name: string;
}

export abstract class MyComponent extends React.Component<MyComponentProps , void> {
    fullName: string;
    myMethood() {
       this.props.name; //<-- doesnt work
       this.fullName; //<-- works
   }
}

рд╕рдорд╕реНрдпрд╛ 2 рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдЪ рд╣реИ рдХрд┐ рд╡реАрдПрд╕ рдХреЛрдб рдмреЗрд╣рддрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ:

image

рдЬрдмрдХрд┐ рд╡реАрдПрд╕ рднреНрд░рдорд┐рдд рджрд┐рдЦрддрд╛ рд╣реИ:

image

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реАрдПрд╕рд╕реАрдУрдбреА рдФрд░ рд╕рдорд╕реНрдпрд╛ 1 рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ "рдирд╡реАрдирддрдо рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡реНрдпрд╛рдХрд░рдг" рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрд┐рд╕рдореЗрдВ рдмреЗрд╣рддрд░ рдкреНрд░рдмрдВрдзрди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

@patsissons рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдЙрджрд╛рд╣рд░рдг рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд░рд┐рднрд╛рд╖рд╛ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ рдмрдЧ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдПрдХ рдмрдЧ рдХрд╛ рдЕрдзрд┐рдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, setState рдЙрдкрдпреЛрдЧ S рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рдерд╛, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рдерд╛ рдХрд┐ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ setState({foo:5} as any as State) рдЬреИрд╕реА рдЕрдЬреАрдм рдЪрд╛рд▓реЗрдВ рдХрд░рдиреА рдкрдбрд╝рддреА рдереАрдВ рдпрд╛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрддрд╛ рдерд╛ред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рдХ рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдХрдореА рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЛ "рдЧрд▓рдд" рдмрдирд╛рддреА рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдПрдЬ рдХреЗрд╕ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реАрдбрдореЗ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реНрдХ рд╣реИред

рдХреНрдпрд╛ рдЖрдкрдиреЗ TS рдкрд░ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рджрд░реНрдЬ рдХреА рд╣реИ?

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

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдкреВрд░реНрдгрддрд╛ рддрд░реНрдХ рд╣реИред рдЕрд░рдмреЛрдВ рдПрдкреАрдЖрдИ рд╣реИрдВ рдЬреЛ рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдВ рдФрд░ рдЖрдЬрдХрд▓ рдирд╣реАрдВ рд╣реИрдВ, рдмрд╕ React.d.ts . рдореЗрдВ рд╣реИрдВ

 interface ComponentLifecycle<P, S> {
        componentWillMount?(): void;
        componentDidMount?(): void;
        componentWillReceiveProps?(nextProps: Readonly<P>, nextContext: any): void;
        shouldComponentUpdate?(nextProps: Readonly<P>, nextState: Readonly<S>, nextContext: Readonly<any>): boolean;
        componentWillUpdate?(nextProps: Readonly<P>, nextState: Readonly<S>, nextContext: Readonly<any>): void;
        componentDidUpdate?(prevProps: Readonly<P>, prevState: Readonly<S>, prevContext: Readonly<any>): void;
        componentWillUnmount?(): void;
    }

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

рджрд╛рдпрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рдореИрдВ рдирдП Readonly<T> рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЬ рд╣реА рдЕрдкрдирд╛ рдХреЛрдб рджреЛрдмрд╛рд░рд╛ рдирд┐рдХрд╛рд▓ рд░рд╣рд╛ рд╣реВрдВ, рдпрд╣ рдПрдХ рдРрд╕рд╛ рдорд╛рдорд▓рд╛ рдерд╛ рдЬрд┐рд╕рдореЗрдВ рдореИрдВрдиреЗ рднрд╛рдЧ рд▓рд┐рдпрд╛ рдерд╛ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдареАрдХ рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдерд╛ред рдЖрдЧреЗ рдмрдврд╝реЛ рдФрд░ рдПрдХ рд╕рдорд╕реНрдпрд╛ рджрд░реНрдЬ рдХрд░реЛ, рдореИрдВ рдЖрдЬ рд╢реЗрд╖ рджрд┐рди рдкреИрдЪрд┐рдВрдЧ рдХреЛрдб рдХреЗ рд╕рд╛рде рд╡реНрдпрд╕реНрдд рд░рд╣реВрдВрдЧрд╛ред

рдЖрд╣ рд╣рд╛рдБ, рдореБрдЭреЗ рдкрддрд╛ рдерд╛ рдХрд┐ рдореИрдВрдиреЗ рдХреБрдЫ рдпрд╛рдж рдХрд┐рдпрд╛ рд╣реИред @olmobrutall рдпрджрд┐ рд╣рдо рдЙрди рд░рд╛рдЬреНрдп рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд░рдЦрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреЗрд╢ рдХрд┐рдпрд╛ рдерд╛, рддреЛ рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдЙрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЕрджреНрдпрддрди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдкрд╣рд▓реЗ рд╕рд╣реА рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдо рд╕рд╣рдорддрд┐ рдХреА рдЬрд░реВрд░рдд рд╣реИред

рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрд╡реАрдПрд╕ рдмреНрд░реЗрдХ рдХрд╛ рд╕рд╡рд╛рд▓ рд╣реИ, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдХреНрдпрд╛ рд╕рд╣реА рд╣реИред рдХреНрдпрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдХреБрдЫ рдЙрдкрдХрд░рдг рдЕрджреНрдпрддрд┐рдд рдирд╣реАрдВ рд╣реИрдВ?

@patsissons рдЖрдк рд╣рдореЗрд╢рд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдЯрд╛рдЗрдкрд┐рдВрдЧ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдЖрдк рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рд╕рднреА рдХреЛрдб рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреИрд╕реЗ рдирд┐рдХрд▓рддрд╛ рд╣реИред https://ericlanderson.com/using-custom-typescript-definitions-with-ts-2-x-3121db84015d#.ftlkojwnb

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

@ericanderson рд╣реИрдХ рдЕрднреА рдХреЗ рд▓рд┐рдП рдЗрддрдирд╛ рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ, рдореБрдЭреЗ рдЕрдкрдирд╛ T рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ Readonly<T> рдЬреАрддрдирд╛ рд╣реИ рдЬреЛ Readonly<Base> рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИред

рд╣рдо 'react.d.ts' рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕ рдПрдХрд▓ рд╕рджрд╕реНрдп рдШреЛрд╖рдгрд╛ рдХрд╛ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реАрдПрд╕ рддреИрдпрд╛рд░ рд╣реЛрдиреЗ рддрдХ рд░реБрдХрдирд╛ рдЙрдЪрд┐рдд рд╣реИред

рд╕рд╛рде рд╣реА, рдЬреИрд╕реЗ рджреБрдирд┐рдпрд╛ рдореЗрдВ 50% рдкреНрд░рдХрд╛рд░ рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдЖрдкрдХреЛ рдПрдкреАрдЖрдИ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╡рд╕реНрддреБрдПрдВ, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдореЗрдВ рдЙрд╕ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд░реАрдбреЛрдирд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рдиреНрд╣реЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХреЗрд╡рд▓-рдкреНрд░рд╛рдкреНрдд рдЧреБрдгреЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдлреНрд░реАрдЬ рдХреА рддрд░рд╣ред

@olmobrutall Readonly рдирдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рдЯреАрдХ рд╕рд░реНрд╡реЛрддреНрддрдо рдЕрднреНрдпрд╛рд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИред рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд╕рдм рдХреБрдЫ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Readonly<> рдЪреАрдЬреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕реЗ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдЗрд╕реА рддрд░рд╣, рд░рд┐рдПрдХреНрдЯ рдЖрдкрд╕реЗ state рдХреЛ setState $ рдХреЗ рдмрд╛рд╣рд░ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рджреБрд░реНрдШрдЯрдирд╛рдПрдВ рдмрдЧ рдкреЗрд╢ рдирд╣реАрдВ рдХрд░рддреА рд╣реИрдВ, рдЬреЛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдкреНрд░рд╛рдердорд┐рдХ рд▓рд╛рднреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред

рдпрджрд┐ рдкреНрд░рджрд░реНрд╢рди Object.freeze рдХреЗ рд▓рд┐рдП рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реБрд╕рдВрдЧрдд рдерд╛, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд▓реЛрдЧ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ setState рдХреЗ рдмрд╛рдж рдлреНрд░реАрдЬ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдВрдЧреЗред

рдлреЛрд░реНрд╕рдЕрдкрдбреЗрдЯ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдХреНрдпрд╛ рд╣реИ?

рдореИрдВ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрддреНрд╕реБрдХ рд╣реВрдВ рдХрд┐ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдЯреВрд▓рд┐рдВрдЧ рдЕрдкрдбреЗрдЯ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкрд░ рд░реАрдбреЛрдирд▓реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рджрд░реНрд╢рди рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП (рдФрд░ рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЬрд┐рдирдХрд╛ рдЗрд░рд╛рджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдХреБрдЫ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ)ред

cc/ @johnnyreilly @vsaio @pspeter3 рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЕрдиреНрдп рд╡рд┐рдЪрд╛рд░реЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП
cc/ @andy-ms @mhegazy рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреИрд╕реЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдХреЛ рдЯреВрд▓реАрдВрдЧ рдЕрдкрдбреЗрдЯ рдФрд░ Readonly рдХреЗ рдЙрддреНрд╕рд╛рд╣реА рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рджрд╛рд░реНрд╢рдирд┐рдХ рд░реВрдк рд╕реЗ рдЖрдЧреЗ рдмрдврд╝рдирд╛ рдЪрд╛рд╣рд┐рдП

@olmobrutall рд╣рдо рд░рд╛рдЬреНрдп рдХреА рдУрд░ рд╕реЗ рджреЗрдЦрдиреЗ рдпреЛрдЧреНрдп рдШрдЯрдирд╛рдУрдВ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкрдХреНрд╖ рдкрд░ рдПрдХ рд░реЗрдВрдбрд░ рдХреЛ рдХрддрд╛рд░рдмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП forceUpdate рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдЕрджреНрдпрддрди :
рдореИрдВ рдЕрдкрдиреЗ рдкрд░рд┐рджреГрд╢реНрдп рдХреЛ рдереЛрдбрд╝рд╛ рд╕реНрдкрд╖реНрдЯ рдХрд░реВрдВрдЧрд╛ рддрд╛рдХрд┐ рдЗрд╕реЗ рдЧрд▓рдд рди рд╕рдордЭрд╛ рдЬрд╛рдПред рд╣рдорд╛рд░реА рд░рд╛рдЬреНрдп рд╡рд╕реНрддреБрдПрдВ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд░рд╣рдиреЗ рд╡рд╛рд▓реА рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╡рд╕реНрддреБрдПрдВ рд╣реИрдВ (рдЗрд╕рд▓рд┐рдП Readonly<T> рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреБрдХреНрдд рд╣реИ)ред рдЗрди рд░рд╛рдЬреНрдп рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рдПрдХрд╛рдзрд┐рдХ rxjs рджреЗрдЦрдиреЗ рдпреЛрдЧреНрдп рдзрд╛рд░рд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВ рдЬреЛ stateChanged рдирд╛рдордХ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдореЗрдВ рдлрд╝рдирд▓ рд╣реЛрддреА рд╣реИрдВред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдШрдЯрдХ рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рджреЗрдЦрдиреЗ рдпреЛрдЧреНрдп рджреЗрдЦрддреЗ рд╣реИрдВ рдФрд░ рдЙрди рдШрдЯрдирд╛рдУрдВ рдХреЛ forceUpdate (рдбрд┐рдмрд╛рдЙрдВрд╕рд┐рдВрдЧ рдХреЗ рдмрд╛рдж) рдкрд░ рдХреЙрд▓ рдореЗрдВ рдлрд╝рдирд▓ рдХрд░рддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдорд╛рд░рд╛ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рд░рд╛рдЬреНрдп рд░рд╛рдЬреНрдп рдХреЗ рднреАрддрд░ рд░рд╣рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд░рд╛рдЬреНрдп рдФрд░ рд░рд╛рдЬреНрдп рдореЗрдВ рдореМрдЬреВрдж рд╕рджрд╕реНрдп рд╕рднреА рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИрдВред рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд░рд┐рдПрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкреНрд░рд╡рд╛рд╣ рдореЗрдВ рдмрд╣реБрдд рд╕рдорд╛рди рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмрд╕ рд╕реНрдорд╛рд░реНрдЯ рд╕реНрдЯреЗрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИрдВ рдЬреЛ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдкреБрди: рдкреНрд░рддрд┐рдкрд╛рджрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдиреЗ рдкрд░ рдШрдЯрдХреЛрдВ рдХреЛ рдХреИрд╕реЗ рд╕реВрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред

@ericanderson рдореБрдЦреНрдп рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ SemVer рдореБрджреНрджреЛрдВ рд╕реЗ рдкреАрдбрд╝рд┐рдд рд╣реИрдВред рдХреНрдпреЛрдВрдХрд┐ рдЯрд╛рдЗрдк рдбреЗрдлрд┐рдирд┐рд╢рди рд╕рдВрд╕реНрдХрд░рдг рдХрд╛рдлреА рд╣рдж рддрдХ рдЙрдирдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдореЙрдбреНрдпреВрд▓ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рд╕реЗ рдмрдВрдзреЗ рд╣реЛрддреЗ рд╣реИрдВ, рд╣рдо рдПрдХ рдорд╛рдореВрд▓реА рд╕рдВрд╕реНрдХрд░рдг рдмрдореНрдк рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдмреНрд░реЗрдХрд┐рдВрдЧ рдЯрд╛рдЗрдк рдбреЗрдлрд┐рдирд┐рд╢рди рдкрд░рд┐рд╡рд░реНрддрди рд▓рд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЕрдкрдиреЗ package.json рдореЗрдВ @types рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рдкрд┐рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдлрд╝рд╛рдЗрд▓ред

@olmobrutall рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рд╕реЗ:

рдЖрдо рддреМрд░ рдкрд░ рдЖрдкрдХреЛ forceUpdate() рдХреЗ рд╕рднреА рдЙрдкрдпреЛрдЧреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ рдХреЗрд╡рд▓ this.props рдФрд░ this.state рд╕реЗ рд░реЗрдВрдбрд░ () рдореЗрдВ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЧрд╛рдЗрдб рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдкрдХреЛ рд╕реАрдзреЗ рд░рд╛рдЬреНрдп рдХреЛ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИ: https://facebook.github.io/react/docs/state-and-lifecycle.html#do -not-modify-state-directly

forceUpdate , рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рдкрдврд╝рд╛ рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ рдЖрдкрдХреЗ рдШрдЯрдХ рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬрдм рдЖрдкрдХрд╛ рдШрдЯрдХ рдЖрдкрдХреЗ рдкреНрд░реЛрдк рдпрд╛ рдЖрдкрдХреЗ рд░рд╛рдЬреНрдп рдореЗрдВ рдбреЗрдЯрд╛ _not_ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИред

@patsissons рдореИрдВ рдЧрд▓рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ SemVer рдХреЛ рдПрдкреАрдЖрдИ рдФрд░ рдЕрд░реНрдердкреВрд░реНрдг рдЗрд░рд╛рджреЛрдВ рдХреЗ рд╕рд╛рде рдкреАрдЫреЗ рдХреА рдУрд░ рд╕рдВрдЧрдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рдЖрдк рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕рдХрд╛ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рдерд╛ (рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░) рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдЙрдкрдпреЛрдЧреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓реЗрдЦрдХ рд╕реЗрдорд╡рд░ рдХреЗ рднреАрддрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╢рдмреНрджрд╛рд░реНрде рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдВ рдЬреЛ рдЧрд▓рдд рдереЗ рд▓реЗрдХрд┐рди рдХреБрдЫ рд▓реЛрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдереЗред

рдЙрд╕ рдиреЗ рдХрд╣рд╛, рд╢рд╛рдпрдж Readonly<> рд╕реЗ state рдмрд╣реБрдд рдмрдбрд╝рд╛ рдмрджрд▓рд╛рд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдкрд▓ рдХреЗ рд▓рд┐рдП рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдпрд╣ рд╕рд╣реА рдмрджрд▓рд╛рд╡ рд╣реИред рдЗрд╕реЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдореЗрдВ рдХрдм рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? state рдХреЛ Readonly<> $ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдЕрдкрдбреЗрдЯ рдорд┐рд▓рдиреЗ рдХреЗ рдмрд╛рдж рдЖрдкрдХреЗ рдХреЛрдб рдХреЛ рд╣рдореЗрд╢рд╛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

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

рдореБрдЭреЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рд╕рдореАрдХреНрд╖рдХ рдХреЛ рд╕реНрдердЧрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛ рд░рд╣реА рд╣реИ (рдореИрдВрдиреЗ рдЙрди рд╕рднреА рдХреЛ рдКрдкрд░ cc'd рдХрд┐рдпрд╛ рд╣реИ)ред

рддреЛ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рдЙрд╕ рд░рд╛рдЬреНрдп рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ? рддреЛ рд░рд╛рдЬреНрдп рдХреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдмрджрд▓рдирд╛ рдХреБрдЫ рд╣рдж рддрдХ рдЕрдиреБрдорддрд┐ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрд╣рд╛рдВ рд░реАрдбреЛрдирд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рд╡рд╣ 100% рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЙрдкрдХрд░рдг рддреИрдпрд╛рд░ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣рдореЗрдВ рдПрдХ рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рдФрд░ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?

рдореИрдВ рд╕рднреА рджреГрдврд╝рддрд╛ рд╕реЗ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реВрдВ, рдореИрдВ рд╕рдЦреНрдд рдирд▓рдЪреЗрдХ рдХреЗ рд╕рд╛рде 6 рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рд▓рд╛рдн рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдХрдо рд╣реИрдВред

@ericanderson рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ SemVer2 рдХреЛ рдиреЛрдб рд╕рдВрд╕реНрдХрд░рдг рдШреЛрд╖рдгрд╛рдУрдВ рдЬреИрд╕реЗ ^15.0.0 рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдХреЛрдИ рдорд╛рдореВрд▓реА рдпрд╛ рдкреИрдЪ рдЕрдкрдЧреНрд░реЗрдб (рдпрд╛рдиреА, 15.0.1 рдпрд╛ 15.1.0 ) рдкрд╛рд░рджрд░реНрд╢реА рд╣реИрдВ рдпрд╛ рдмрд╛рд╣рд░реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдХрдо рд╕реЗ рдХрдо рдкреАрдЫреЗ рдХреА рдУрд░ рд╕рдВрдЧрддред рдХрд┐рд╕реА рднреА рдмрдбрд╝реЗ рдЕрдкрдЧреНрд░реЗрдб ( 16.0.0 ) рдХреЛ рдмрджрд▓рд╛рд╡ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд╕реНрдХрд░рдг рдШреЛрд╖рдгрд╛ рдореЗрдВ рд╕рдорд╛рдпреЛрдЬрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдпрд╣ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдкрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд▓рд╛рдП рдЬрд╛рдиреЗ рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рддреЛрдбрд╝ рджреЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЯрд╛рдЗрдк рдкрд░рд┐рднрд╛рд╖рд╛ рд╕рдВрд╕реНрдХрд░рдг рдЕрдкрдиреЗ рд╕рдВрдмрдВрдзрд┐рдд рдореЙрдбреНрдпреВрд▓ рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рдореБрдЦ рд╕рдВрд╕реНрдХрд░рдг (рд╕рдореНрдореЗрд▓рди рджреНрд╡рд╛рд░рд╛) рд╕реЗ рд╡рд┐рдЪрд▓рд┐рдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдпрд╣ рдЕрд╕рдВрддреБрд▓рди рд╣реЛрддрд╛ рд╣реИред

рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╕рдВрд╕реНрдХрд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдмрд┐рдирд╛ рд╢реБрд░реВ рдХрд┐рдП рдЧрдП рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдореБрдЦ рд╕рдВрд╕реНрдХрд░рдг рдЯрдХреНрдХрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рд▓реЗрдХрд┐рди рдЖрдк рдПрдХ рдкреАрдЖрд░ рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрд▓ рдХреЛ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд╣реИ рдирд╛?

рдлрд┐рд░ рдЕрдЧрд░ рдлреЛрд░реНрд╕рдЕрдкрдбреЗрдЯ рд╣реИ рддреЛ рд░рд╛рдЬреНрдп рдХреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдмрджрд▓рдирд╛ рднреА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдЖрдкрдХреЛ рдПрдХ рдЧрд╣рд░реЗ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд░рд╛рдЬреНрдп рдЧреНрд░рд╛рдл рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЕрдХреНрд╕рд░ рд░рд╛рдЬреНрдп рдХреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдмрджрд▓рдирд╛ рдареАрдХ рд╣реИ рдФрд░ рд╕рднреА рдбреЗрд╡рд▓рдкрд░реНрд╕ рд▓рдЧрд╛рддрд╛рд░ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдореЗрдВ рдирд╣реАрдВ рдЦрд░реАрджрддреЗ рд╣реИрдВред

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

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП Vue.js рдЕрдирд┐рд╡рд╛рд░реНрдп рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрддрд╛ рд╣реИ, рдЕрдЧрд░ рдпрд╣ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ рддреЛ рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдХреБрдЫ рд░рд┐рдПрдХреНрдЯ рд▓реЗрдЦрдХ рдХреЗ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдХреЛ рдмрд╣реБрдд рдкрд╣рд▓реЗ рдирд╣реАрдВ рдкрдврд╝ рд░рд╣рд╛ рдерд╛ (рдореБрдЭреЗ рдпрд╛рдж рд╣реИ) рд╕рднреА Redux рд╕рдорд╛рд░реЛрд╣ рдХреЗ рдмрд┐рдирд╛ рд░рд┐рдПрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдирд╛ред

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

рдЗрд╕ рдкрд░ рд╕реЛрдиреЗ рдХреЗ рдмрд╛рдж рдореЗрд░реА рдирд┐рдЬреА рд░рд╛рдп рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

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

рдЙрдкрд░реЛрдХреНрдд рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЧреИрд░-рдорд╛рдирдХ рд░рд┐рдПрдХреНрдЯ рдРрдкреНрд╕ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЗ рдХрд╛рдордХрд╛рдЬ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд░реАрдбрдСрдирд▓реА рд╕рд╣реА рд╣реИ рдФрд░ рдкреВрд░реНрдгрддрд╛ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рдкрд░рд┐рд╡рд░реНрддрди рдЬреАрд╡рди рдЪрдХреНрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдорд┐рд▓рд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрджреНрдпрддрди рдХрд░рдирд╛ рд╣реИред

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

рдкреИрдЯрд┐рд╕рди, рд╡реАрдПрд╕, рд╡реАрдПрд╕ рдХреЛрдб рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рдВрдкрд╛рджрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

рдореЗрд░рд╛ рдХрд╣рдирд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЬрдмрдХрд┐ рд░рд┐рдПрдХреНрдЯ рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрддрд╛ рд╣реИ, рдпрд╣ рдПрдХ рд╡реАрдбрд┐рдпреЛрдЧреЗрдо-рдЬреИрд╕реЗ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрд╣рд╛рдБ рдЖрдк рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ (рд░рд╛рдЬреНрдп) рджреБрдирд┐рдпрд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рд░реЗрдВрдбрд░ (рдлреЛрд░реНрд╕рдЕрдкрдбреЗрдЯ) рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЕрдм TS рдореЗрдВ рдирд┐рд╖рд┐рджреНрдз рд╣реИред рдлрдВрдХ-рджрдВрддрд╡рд╛рдж рдХреА рддрд░рд╣ :)

рдореИрдВ рдЕрдкрдиреЗ рд╡рд░реНрддрдорд╛рди рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреВрдВрдЧрд╛...

рд╕рдорд╕реНрдпрд╛ 2 рдХреЗрд╡рд▓ strictNullChecks рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХ рд░рд╣рд╛ рд╣реИред

[TS] Cannot invoke an expression whose type lacks a call signature. Type '((val: any) => void) | undefined' has no compatible call signatures.

+1 рдореИрдВ рд╕рдЦреНрдд рдирд▓рдЪреЗрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ

@ericanderson ?

рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рдЯреВрд▓рд┐рдВрдЧ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдбреАрдЯреА рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИред рдпрджрд┐ рдЖрдк VSCode рдкрд░ рд╣реИрдВ рдФрд░ рдЖрдЧрд╛рдореА TS рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЬрдм рдореИрдВ рдЙрдкрд░реЛрдХреНрдд рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рд▓рд┐рдЦ рд░рд╣рд╛ рдерд╛, рддреЛ рдореБрдЭреЗ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╕рдЦреНрдд рдирд▓рдЪреЗрдХ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рджрд┐рдЦрд╛рдИ рджреАред

рдореЗрд░реЗ рдкрд╛рд╕ рдЦрд┐рдбрд╝рдХрд┐рдпрд╛рдБ рдирд╣реАрдВ рд╣реИрдВ рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╡реАрдПрд╕ рд╕реЗ рдареАрдХ рд╕реЗ рдмрд╛рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред

рдЗрд╕ Pick рдкреИрдЪ рдиреЗ VSCode рдХреЗ рддрд╣рдд рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЛ рддреЛрдбрд╝рд╛ред this.setState({ | }) (Ctrl + Space) рдХрд░рддреЗ рд╕рдордп, рдХреБрдЫ рднреА рдирд╣реАрдВ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рд░рд╛рдЬреНрдп рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реЛ рдФрд░ Partial<State> рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реЛ рдХреНрдпреЛрдВрдХрд┐ setState рд╕рджрд╕реНрдпреЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЪреБрдирд┐рдВрджрд╛ рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ

IMHO рд╕рд╣реА рдХреЛрдб setState(state: Partial<S>, callback?: () => any): void; . рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

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

рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд░рд╛рдЬреНрдп {
рдлреВ: рд╕реНрдЯреНрд░рд┐рдВрдЧ;
}

рдлрд┐рд░ рдЖрдВрд╢рд┐рдХ рдХреЗ рд╕рд╛рде рдЖрдк рдирд┐рдореНрди рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

рд╕реЗрдЯрд╕реНрдЯреЗрдЯ ({foo: рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд});

рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЧрд▓рдд рд╣реИред

рдореБрдЭреЗ рдЦреЗрдж рд╣реИ - рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╕реЗ Readonly рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ

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

рддреЛ рдЙрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдХреНрдпреЛрдВ рдЬреЛрдбрд╝реЗрдВ рдЬреЛ рдореВрд▓ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛрдб рдореЗрдВ .d.ts рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ? .d.ts рдореВрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдкреНрд░рддрд┐рдмрд┐рдВрдм рд╣реЛрдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд▓реЗрдЦрдХ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд▓реЛрдЧреЛрдВ рдХреЛ рд╕рд╣реА рдХреЛрдбрд┐рдВрдЧ рд╢реИрд▓реА рдХреА рд╢рд┐рдХреНрд╖рд╛ рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИ!

@lezious , рдореБрдЭреЗ рдбрд░ рд╣реИ рдХрд┐ рдореИрдВ рдЖрдкрдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдордЭ рдирд╣реАрдВ рдкрд╛ рд░рд╣рд╛ рд╣реВрдВред рдХреНрдпрд╛ рдЖрдк рдПрдХ рдХреЛрдб рдирдореВрдирд╛ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдирдореВрдиреЗ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдЯреВрдЯрд╛ рд╣реБрдЖ рд╣реИ? рдзрдиреНрдпрд╡рд╛рдж!

рдХреЛрдИ рджрд┐рдХреНрдХрдд рдирд╣реАрдВ рд╣реИ:

рдпрд╣ рдореЗрд░рд╛ рд░рд╛рдЬреНрдп рд╡рд░реНрдЧ рд╣реИ

class UserInfoBlockState  
{
    <strong i="7">@observable</strong>                  <- this is mobx way to declare state
    public updating: boolean;
    <strong i="8">@observable</strong> 
    public deleted: boolean;
}

рдФрд░ рдпрд╣ рдореЗрд░рд╛ рдШрдЯрдХ рд╣реИ

<strong i="12">@observer</strong>       <-- this is mobx way to make component react to state change
export class UserPanel extends React.Component<IUserInfoBlockProps, UserInfoBlockState>
{
   ......
     private updateUser()
    {
        this.state.updating = true;
        UsersAPI.update(this.props.user)
       .then(() =>
            {
                this.state.updating = false;      <--- this is the mobx way to work with the state
            }
        ).catch(() =>
            {
                this.showErrror("Server error");
                this.state.updating = false;
            });
    }
   ....

}

рдФрд░ рдЕрдм рд╣рдо (рд╣рдорд╛рд░реА рдХрдВрдкрдиреА рд░рд┐рдПрдХреНрдЯ + рдореЛрдмрдХреНрд╕ рдкрд░ рд▓рд┐рдЦреА рдЧрдИ рд╡рд┐рд╢рд╛рд▓ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рде) рдиреЗ рдирдП рд░рд┐рд▓реАрдЬ рд╕рд░реНрдХрд▓ рдХреА рд╢реБрд░реБрдЖрдд рдкрд░ рдбреАрдЯреА рдФрд░ рд░рд┐рдПрдХреНрдЯ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдФрд░ ... 3000+ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐рдпрд╛рдВ "рд╕рдВрдкрддреНрддрд┐ рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ"ред рдмрд╣реБрдд рдЦреВрдмред рдЖрдк рдореБрдЭреЗ рдХреНрдпрд╛ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВ - рдкреВрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ redux рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВ, рдХрднреА рднреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЕрдкрдбреЗрдЯ рди рдХрд░реЗрдВред d.ts рдпрд╛ рд╣рдореЗрд╢рд╛ рдлреЛрд░реНрдХрдб рд╕рдВрд╕реНрдХрд░рдг рд░рдЦреЗрдВ рдФрд░ рд╕рдорд░реНрдерди рдХрд░реЗрдВ?

@mweststrate , рдХреГрдкрдпрд╛ рдЗрд╕реЗ рдЬрд╛рдВрдЪреЗрдВред

@Iezious рдореИрдВ рдЖрдкрдХреА рд╕реНрдерд┐рддрд┐ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдореИрдВ рдкреВрдЫрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдХреГрдкрдпрд╛ рд╢рд╛рдВрдд рд╣реЛ рдЬрд╛рдПрдВред рдореИрдВ рдЖрдкрдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдЗрд╕рдХрд╛ Redux рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╢реБрджреНрдз рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реИред

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

рд░рд┐рдПрдХреНрдЯ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд░рд╛рдЬреНрдп рдХрд╛ рд╕рд╣реА рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ 3 рддрд░реАрдХреЗ рд╣реИрдВ, рдФрд░ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ "рд░рд╛рдЬреНрдп рдХреЛ рд╕реАрдзреЗ рд╕рдВрд╢реЛрдзрд┐рдд рди рдХрд░реЗрдВ" рд╣реИред

рдпрд╣ рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рджрд┐рд▓рд╛рддрд╛ рд╣реИ рдХрд┐ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЖрдкрдХрд╛ рдХреЛрдб рдЖрдзрд╛рд░ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╡рд╣ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдЯреВрдЯрдиреЗ рдХреА рдХрд╛рдлреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред https://github.com/mobxjs/mobx-react рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреЗрдЦрдиреЗ рдореЗрдВ, рдореБрдЭреЗ рдХреЛрдИ рд╕реБрдЭрд╛рд╡ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕ рддрд░рд╣ рд╕реЗ рд░рд╛рдЬреНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдЧреБрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

https://mobx.js.org/getting-started.html рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдирд╛ рдФрд░ "mobx рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реНрдерд┐рддрд┐" рдХреЗ рд▓рд┐рдП рдЧреБрдЧрд▓реА рдХрд░рдирд╛, рдореБрдЭреЗ рдРрд╕рд╛ рдХреЛрдИ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдирд╣реАрдВ рдорд┐рд▓рд╛ рдЬреЛ рдпрд╣ рд╕реБрдЭрд╛рд╡ рджреЗ рдХрд┐ рдЖрдк рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдЖрдк mobx рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рдбреАрдЯреА рдХреЛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рднрд╛рд╡рдирд╛ рдХреЛ рд╕рд░реНрд╡реЛрддреНрддрдо рд░реВрдк рд╕реЗ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рддрд░реАрдХреЗ рд╕реЗ рд╡реНрдпрдХреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЦрд░реАрджрдирд╛ рдФрд░ рдШрдЯрдХ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдирд┐рд╣рд┐рдд рдЕрдиреБрдмрдВрдз рдХрд╛ рд╕рдореНрдорд╛рди рдХрд░рдирд╛ рд╣реИред

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдЖрдкрдХреЛ рдХреНрдпрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВред рдХреБрдЫ рд╡рд┐рдХрд▓реНрдк рдЬреЛ рдореИрдВ рд╣рд╛рде рд╕реЗ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВ:

  1. рдПрдХ "рд╕рд╕реНрддрд╛" рд╡рд┐рдХрд▓реНрдк, рдпрджрд┐ рдЖрдк state рдЪрд░ рдХреЛ рд▓реЗрдиреЗ рдкрд░ рдЬреЛрд░ рджреЗрддреЗ рд╣реИрдВ рддреЛ React.Component рдХреЛ MyComponent рд╕реЗ рдЦреЛрдЬрдирд╛ рдФрд░ рдмрджрд▓рдирд╛ рд╣реИ рдФрд░ MyComponent рдХреЛ рдЙрдкрд╡рд░реНрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╣реИ React.Component рдХрд╛ рд░реАрдбреЛрдирд▓реА рдмрд╛рдзрд╛рдУрдВ рдХреЗ рдмрд┐рдирд╛ред
  2. рдореЛрдмрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдкреЛрд╕реНрдЯ рдХрд┐рдП рдЧрдП рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдФрд░, this.state рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдирд┐рдХрд╛рд▓рдирд╛ рд╣реИ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ React.Component рдкрд░ рдХреЗрд╡рд▓ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рдпрд╣ рдереЛрдбрд╝рд╛ рджрд░реНрджрдирд╛рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЖрдкрдХреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдирдП рд▓реЛрдЧ рдЖрдкрдХреЗ рдХреЛрдб рдмреЗрд╕ рдореЗрдВ рдкреИрдЯрд░реНрди рджреЗрдЦ рдкрд╛рдПрдВрдЧреЗ рдЬреИрд╕рд╛ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдСрдирд▓рд╛рдЗрди рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
  3. рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдХ рдореЗрдВ state рдХреЛ рдлрд┐рд░ рд╕реЗ рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдЙрд╕реА рддрд░рд╣ рдХрд░рддреЗ рд░рд╣рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдЖрдк рдХрд░ рд░рд╣реЗ рд╣реИрдВред
  4. рдЖрдк this.state рдХреЛ this.somethingElse рд╕реЗ рдЦреЛрдЬ рдФрд░ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
  5. рдЖрдк рдбреАрдЯреА рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдбреЗрдЯ рд▓реЗрдирд╛ рдмрдВрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдФрд░ рд╕рдВрднрд╡рддрдГ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реЗ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдЖрдкрдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред

рдЕрдЧрд░ рдпрд╣ рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реЛрддреА, рддреЛ рд╢рд╛рдпрдж рдореИрдВ рдирдВрдмрд░ 2 рдХрд░рддрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдореЛрдмрдХреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИред

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореИрдВ рдЖрдкрд╕реЗ рд╕рд╣рдордд рдирд╣реАрдВ рд╣реЛ рд╕рдХрд╛ (рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рджреВрд╕рд░реЗ рдЖрдкрд╕реЗ рд╕рд╣рдордд рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ)ред рдореИрдВрдиреЗ рдЙрд╕ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдХрд╛рд░рдг рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕ рд╕рдордп рдмреЛрд░реНрдб рдкрд░ рдирд╣реАрдВ рд▓рдЧ рд╕рдХрддрд╛ред

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

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

рдФрд░ рдХреНрдпрд╛ рдХрд╛рд░рдг рд╣реИ? рдХреНрдпрд╛ рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ? рдирд╣реАрдВ, рдпрд╣ рдЙрди рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдФрд░ рд╡реНрдпрд╡рд╣рд╛рд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдЬреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИрдВ, рдкреНрд░рддрд┐рдмрдВрдз рдЬреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рд╕реЛрдЪрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд╣реА рд╣реИред

рдбреАрдЯреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдХреНрдпрд╛ рд╣реИ? рдЬреЗрдПрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдпрдерд╛рд╕рдВрднрд╡ рд╕рдЯреАрдХ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╛ рдЙрди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рд╣реА рдЙрдкрдпреЛрдЧ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдорд╛рд░реА рджреГрд╖реНрдЯрд┐ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП? "рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЧрдпрд╛" рдирд╛рдо рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдпрд╣ рдкрд╣рд▓рд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдпрд╣ рдкреНрд░рддрд┐рдмрдВрдз рдореВрд▓ JS рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ DT рдореЗрдВ рднреА рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдореЗрд░реА рдмрд╛рдд рд╣реИред рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдореИрдВ рдХрд╣рд╛рдБ рдЧрд▓рдд рд╣реВрдБ?

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

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

https://facebook.github.io/react/docs/react-component.html#state

рдЗрд╕реЗ рдХрднреА рднреА рд╕реАрдзреЗ рдордд рдмрджрд▓реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж setState() рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рдореНрдпреВрдЯреЗрд╢рди рдХреЛ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рдРрд╕реЗ рд╕рдордЭреЗрдВ рдХрд┐ рдпрд╣ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИред

рдпрд╣ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ this.state рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдорд╛рдирддреА рд╣реИред рд░рд┐рдПрдХреНрдЯ this.state рдХреЗ _properties_ рдХреЛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдирд╣реАрдВ рдорд╛рдирддрд╛ (рдЬреЛ рдХрд┐ рд░реЗрдбрдХреНрд╕ рдзрд╛рд░рдгрд╛ рд╣реИ)ред рдЖрдк рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВ:

this.state.user.name = "foo";

рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВред

рдореЗрд░реА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдПрдкреАрдЖрдИ рдХреЛ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреА рдУрд░ рд╣реИ (рдЬрд┐рд╕рдХрд╛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдорддрд▓рдм рд╣реИ Readonly ) рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЯреАрдо рдХреЗ рд╕рднреА рдЗрдирд╡реЗрд░рд┐рдПрдВрдЯ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдирд╛ред

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

@amoreland рдЕрд╕рд╣рдорддред рдкреНрд░рддрд┐: https://facebook.github.io/react/docs/state-and-lifecycle.html#do -not-modify-state-directly

рд░рд╛рдЬреНрдп рдХреЛ рд╕реАрдзреЗ рд╕рдВрд╢реЛрдзрд┐рдд рди рдХрд░реЗрдВ

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдПрдХ рдШрдЯрдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛:

// Wrong
this.state.comment = 'Hello';

рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╕реЗрдЯрд╕реНрдЯреЗрдЯ () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:

// Correct
this.setState({comment: 'Hello'});

рдПрдХрдорд╛рддреНрд░ рд╕реНрдерд╛рди рдЬрд╣рд╛рдВ рдЖрдк рдЗрд╕реЗ рдЕрд╕рд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕реНрдЯреЗрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реИред

@johnnyreilly рдореИрдВрдиреЗ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛ред рдпрд╣ рддреЛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рд╕реНрд░реЛрдд?

рд╣рд╛рд▓рд┐рдпрд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдореНрдореЗрд▓рди рдореЗрдВ рдПрдХ рд╡рд╛рд░реНрддрд╛ рдореЗрдВ рдЗрд╕реЗ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рдпреВрдЯреНрдпреВрдм рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд▓рд┐рди рдХреНрд▓рд╛рд░реНрдХ рдХреА рдмрд╛рдд рд░рд╣реА рд╣реЛред 1 рджрд┐рди рдХреА рдкрд╣рд▓реА рд╡рд╛рд░реНрддрд╛ рдореЗрдВ рд╕реЗ рдПрдХ - v16 тАЛтАЛрдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧрд╛рдореА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рдирд╛ред рдлрд╛рдЗрдмрд░ рдЖрджрд┐

https://www.reddit.com/r/reactjs/comments/5zqgsb/react_fiber_functional_setstate/ рдпрд╣рд╛рдВ @gaeron рджреНрд╡рд╛рд░рд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

рд╕реЙрд░реА @gaearon рдореЗрд░рд╛ рдорддрд▓рдм рдерд╛

рдореЛрдмрдХреНрд╕ рд░рд╛рдЬреНрдп рдкрд░рд┐рд╡рд░реНрддрди рдХреНрдпреЛрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗрдзрд╢рд╛рд▓рд╛рдПрдВ рд░рд┐рдПрдХреНрдЯ рдЕрдкрдбреЗрдЯ рдЪрд▓рд╛ рд░рд╣реА рд╣реИрдВ, рд░рд╛рдЬреНрдп рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ _replaceing_ рдХреЗ рдмрдЬрд╛рдп, рд░рд╛рдЬреНрдп рдПрдХ рдЗрдВрдЬрди рдмрди рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЛ рд╕рдВрдЪрд╛рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП this.state.updating = true; рдЬреИрд╕рд╛ рдХреБрдЫ рдХрд░рдХреЗ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд░рд╛рдЬреНрдп рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рдмрд░рд╛рдмрд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд░рд╛рдЬреНрдп рдЗрддрдирд╛ рд╕реНрдорд╛рд░реНрдЯ рд╣реИ рдХрд┐ рдШрдЯрдХ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдХреЗ рдПрдХ рдирдпрд╛ рд░реЗрдВрдбрд░ рдЯреНрд░рд┐рдЧрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд░рд╛рдЬреНрдп рдЕрдкрдиреА рдкрд┐рдЫрд▓реА рд╕рд╛рдордЧреНрд░реА рд╕реЗ рдмрджрд▓ рдЧрдпрд╛ рд╣реИред рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ _рдкрд░рдВрдкрд░рд╛рдЧрдд_ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЕрдзрд┐рдХ рд╡реНрдпрд╛рдкрдХ рдФрд░ рдЙрдЪреНрдЪ рд╕реНрддрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реИред рдореЗрд░рд╛ рддрд░реНрдХ рд╣реИ рдХрд┐ рдкрд╛рд░рдВрдкрд░рд┐рдХ рд░рд┐рдПрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдореБрдЯреНрдареА рднрд░ рдШрдЯрдХреЛрдВ рд╡рд╛рд▓реА рдЫреЛрдЯреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИред рдЬрдм рдЖрдк 100 рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рдХрдИ рджрд░реНрдЬрдиреЛрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рдбреНрд░рд╛рдЗрд╡рд░ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрдм рдкрд╛рд░рдВрдкрд░рд┐рдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реНрдерд┐рддрд┐ рдкрд░рд┐рд╡рд░реНрддрди (рдпрд╛рдиреА, рд╕реЗрдЯрд╕реНрдЯреЗрдЯ) рдХрд╛ рдордЬрд╝рдмреВрддреА рд╕реЗ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡рд╛рд╕реНрддреБрд╢рд┐рд▓реНрдк рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдордиреЛрд░рдВрдЬрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдореЗрдВ _smart_ рд░рд╛рдЬреНрдп рд╢рд╛рдорд┐рд▓ рд╣реИ (рдЬреЛ рдХрд┐ рдореЛрдмрдХреНрд╕ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдХрд░рддрд╛ рд╣реИ) )

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

@Iezious рдЕрдЧрд░ рдЖрдкрдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рддреНрд╡рд░рд┐рдд рд╕рдорд╛рдзрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЛ рдмрдврд╝рд╛рдХрд░ рдЗрд╕рд╕реЗ рджреВрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдиреЗ рдШрдЯрдХреЛрдВ рдХреЛ React.Component рдкреНрд░рдХрд╛рд░ defs рдХреЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреБрди: рд╕рдХреНрд░рд┐рдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

import * as React from 'react';
declare module 'react' {
  class MutableStateComponent<P, S> extends React.Component<P, S> {
    state: S;
  }
}
(React as any).MutableStateComponent = React.Component;

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

export class MyComponent extends React.MutableStateComponent<MyProps, MyState> {
  // this.state.name is writable
}

@patsissons рд╣рд╛рдБ, рдпрд╣реА рдХрд╛рд░рдг рд╣реИред

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

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЕрдкрдирд╛ рдШрдЯрдХ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реВрдВ, рдореИрдВ рдЕрдкрдиреЗ рдПрдирдкреАрдПрдо рд╕рд░реНрд╡рд░ рдореЗрдВ рднреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдЬреЛ рд╣рдореЗрд╢рд╛ рд╣рдорд╛рд░реА рдХрдВрдкрдиреА рдХреЗ рд▓рд┐рдП рдЗрд╕ рдмрджрд▓рд╛рд╡ рдХреЛ рд╡рд╛рдкрд╕ рд▓рд╛рдПрдЧрд╛ред рдореИрдВ "this.state.state.updated" рдЬреИрд╕реЗ рд╣реИрдХ рдФрд░ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рд╣реИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

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

рд╢рд╛рдпрдж рдореЗрд░реЗ рд╕реБрдЭрд╛рдП рдЧрдП MutableStateComponent рдХреЗ рдмрдЬрд╛рдп рд╣рдо рдЗрд╕реЗ ObservableComponent рдХрд╣рддреЗ рд╣реИрдВ рдЬреЛ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рд░рд┐рдПрдХреНрдЯ рдкреИрдЯрд░реНрди рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рд╕рдВрд░реЗрдЦрд┐рдд рд╣реИред

рдпрджрд┐ рдЖрдк Readonly рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ рддреЛ рдЬреЛ рд▓реЛрдЧ рдирд┐рдпрдорд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ (рдФрд░/рдпрд╛ mobx рд╕реЗ рдЕрд▓рдЧ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рд░рд╛рдЬреНрдп-рдкреНрд░рдмрдВрдзрди рдкреНрд░рдгрд╛рд▓реА) рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рдВрдкрд░реНрдХ рдореЗрдВ рд╣реИрдВред рдореИрдВ рдЕрдкрдиреЗ рд╡рд┐рд╢рд╛рд▓ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ mobx рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЬрдм рдХреЛрдИ рдЯрд╛рдЗрдкреЛ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЧрд▓рддреА рд╕реЗ this.state.foo = bar рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рддреЛ рдореИрдВ рдХрдВрдкрд╛рдЗрд▓рд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВред

рдпрджрд┐ рдорд╛рдирдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ рдЧреИрд░-рдорд╛рдирдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЙрдкрдпреЛрдЧ рдХреЗ рдмреАрдЪ рдПрдХ рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рдЯреНрд░реЗрдбрдСрдлрд╝ рд╣реИ, рддреЛ рдорд╛рдирдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рдХрд╛рд░ рдкреВрд░реНрд╡ рдХреА рдУрд░ рдЭреБрдХрдирд╛ рдЪрд╛рд╣рд┐рдПред

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

рдпрджрд┐ рдЖрдк рд░реАрдб рдУрдирд▓реА рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ рддреЛ рдЬреЛ рд▓реЛрдЧ рдирд┐рдпрдорд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ (рдФрд░/рдпрд╛ рдореЛрдмрдХреНрд╕ рд╕реЗ рдЕрд▓рдЧ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рд░рд╛рдЬреНрдп-рдкреНрд░рдмрдВрдзрди рдкреНрд░рдгрд╛рд▓реА) рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рдВрдкрд░реНрдХ рдореЗрдВ рд╣реИрдВред рдореИрдВ рдЕрдкрдиреЗ рд╡рд┐рд╢рд╛рд▓ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ mobx рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рдФрд░ рдЬрдм рдХреЛрдИ рдЯрд╛рдЗрдкреЛ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЧрд▓рддреА рд╕реЗ this.state.foo = bar рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рддреЛ рдореИрдВ рдХрдВрдкрд╛рдЗрд▓рд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВред

рддреЛ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ - рдЖрдк рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╕рд┐рдЦрд╛ рд░рд╣реЗ рд╣реИрдВ

рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╕рд┐рдЦрд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЬреЗрдПрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рдореМрдЬреВрджрд╛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╕реАрдорд╛ рдореВрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдмрд╕ рдЗрддрдирд╛ рд╣реАред

@patsissons

рдпрджрд┐ рдЖрдкрдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рддреНрд╡рд░рд┐рдд рд╕рдорд╛рдзрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЛ рдмрдврд╝рд╛рдХрд░ рдЗрд╕рд╕реЗ рджреВрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдиреЗ рдШрдЯрдХреЛрдВ рдХреЛ React.Component рдкреНрд░рдХрд╛рд░ defs рдХреЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреБрди: рд╕рдХреНрд░рд┐рдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

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

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

@ericanderson рдиреЗ рд▓рд┐рдЦрд╛ рд╣реИ рдХрд┐

this.state.state.value = 1 

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

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

@Iezious

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

рдпрджрд┐ рдЖрдкрдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рддреЛ рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рдП рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдпрд╛ рддреЛ @types/react рдХреЛ 15.0.1 $ рдкрд░ рдкрд┐рди рдХрд░реЗрдВ, рдпрд╛ рдХреЗрд╡рд▓ @types/react рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдмрдирд╛рдП рд░рдЦреЗрдВ defs рдЯрд╛рдЗрдк рдХрд░реЗрдВ рдФрд░ рдмрд╕ state рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЛ Component рдХреЗ рд▓рд┐рдП рдмрджрд▓ рджреЗрдВред рдореБрдЭреЗ рд╕рдЪ рдореЗрдВ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕реА рдХреЛ рднреА рдмрджрд▓рд╛рд╡ рдХреЛ рд╡рд╛рдкрд╕ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдордирд╛рдиреЗ рдореЗрдВ рдХреЛрдИ рд╕рдлрд▓рддрд╛ рдорд┐рд▓реЗрдЧреАред

forceUpdate рдореМрдЬреВрдж рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдЖрдВрддрд░рд┐рдХ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд╕реНрдерд┐рддрд┐ рд╕рдВрд╢реЛрдзрд┐рдд рд╣реЛрдиреЗ рдкрд░ рдбреНрд░рд╛рдЗрд╡рд┐рдВрдЧ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд╢рдВрд╕рд┐рдд рдХреЛрдб рдкрде рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд▓реЗрдЦрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдпрд╛ рдЬрдм render() рд░рд╛рдЬреНрдп рдХреЗ рдмрд╛рд╣рд░ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рд╣реИ)ред forceUpdate рдХрд╛ рдЙрдкрдпреЛрдЧ рдареАрдХ рдЙрд╕реА рдЙрдкрдпреЛрдЧ рдкреИрдЯрд░реНрди рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореЗрд░реА рдЯреАрдо рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рдХрд░рддреА рд╣реИред

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

рдПрдХ рдмрд╛рд░ рдлрд┐рд░, рд╣реИ:

this.state.state.value = 1 

рд╡реИрдз рдпрд╛ рдирд╣реАрдВ?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реА рд░рд╛рдп рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдкрд╖реНрдЯ рд╣реИ ...

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓рддрд╛/рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдпрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рддрдЪреАрдд рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ _рдЕрднреА рддрдХред рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде рд╕рдВрдпреБрдХреНрдд TS рдХрдВрдкрд╛рдЗрд▓рд░ ( Readonly рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ) рдореЗрдВ рдмрдЧ рд╕рд╛рдорд╛рдиреНрдп рдШрдЯрдХреЛрдВ рдХреЛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд╕рдВрднрд╡ рдмрдирд╛ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдореМрдЬреВрджрд╛ рдХреЛрдб рдЯреВрдЯ рдЬрд╛рддреЗ рд╣реИрдВред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд░реВрдк рд╕реЗ рд╕реНрд╡реАрдХреГрдд рд╡реИрдз рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓рд╛ рд╣реИ рдФрд░ рдЕрднреА рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╡рд╛рдкрд╕ рд░реЛрд▓ рдХрд░рдиреЗ рдХрд╛ рдкрд░реНрдпрд╛рдкреНрдд рдХрд╛рд░рдг рд╣реИ ???

interface test1 {
    num: number;
}

function add<T extends test1>(initial: T, add: number) {
    var copy: Readonly<T> = initial;

    //ERROR HERE: [ts] Operator '+' cannot be applied to types 'T["num"]' and 'number'.
    return copy.num + add;
}

рдХреНрдпрд╛ рдХрд┐рд╕реА рдХреЛ рдкрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЯреАрдо рдХреЗ рд╕рд╛рде рдХреЛрдИ рдЦреБрд▓рд╛ рдореБрджреНрджрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ? рдореБрдЭреЗ рдЙрдирдХреЗ рдЯреНрд░реИрдХрд░ рдкрд░ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣реА рд╣реИред

@caesay рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлреНрдЯ/рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рджреЗрдЦреЗрдВ#15501

рдореБрдЭреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рд░рд╛рдЬреНрдп рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди tslint рджрд┐рдЦрд╛рддрд╛ рд╣реИ "рд░рд╛рдЬреНрдп рдХреЗрд╡рд▓ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ" ....

constructor(props) {
  super(props);
  this.state = {
     value: props.defaultValue,
  };
}

рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдпрд╣ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ...............

рд╕реЗрдЯрд╕реНрдЯреЗрдЯ рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВ

рд╕реЗрдЯрд╕реНрдЯреЗрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ

рдпрд╛ рдХрдВрдкреЛрдиреЗрдВрдЯрд╡рд┐рд▓рдорд╛рдЙрдВрдЯ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ w/setState

рдзрдиреНрдпрд╡рд╛рдж

рдирдорд╕реНрддреЗ,

рдореИрдВрдиреЗ рдкреВрд░рд╛ рд╕реВрддреНрд░ рдкрдврд╝рд╛ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ @alanwei0 рдкрд░рд┐рджреГрд╢реНрдп рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдХреЛрдИ рдпреЛрдЬрдирд╛ рд╣реИ?

рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ state рдХреЛ ReadOnly $ рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦрдирд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдХрд╣рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдиреЗ рд╕реЗ рдЪреАрдЬреЗрдВ рдХрд╛рдлреА рдЬрдЯрд┐рд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ render рдХреЛ componentDidMount рд╕реЗ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

@pawelpabich рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ this.state = { рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рдЖрдк рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ readonly рд╡реИрд░рд┐рдПрдмрд▓ рдЕрд╕рд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ Readonly<T> рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ (рдХрднреА рднреА!) рдХреЛ рдирд╣реАрдВ рд░реЛрдХрддрд╛ рд╣реИред

interface TInterface {
    test: string;
}

class TClass {
    readonly blah: Readonly<TInterface>;
    constructor() {
        this.blah = { test: "constructor" };
    }

    fn = () => {
        this.blah = { test: "fn" };
    }
}

рдпрд╣рд╛рдВ рдПрдХрдорд╛рддреНрд░ рддреНрд░реБрдЯрд┐ fn рдХреЗ рдЕрдВрджрд░ рд╣реЛрдЧреА - Readonly<T> рдХреЗ рдХрд╛рд░рдг рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ readonly рдХреАрд╡рд░реНрдб рдХреЗ рдХрд╛рд░рдгред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХрд╛ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг readonly рдХреАрд╡рд░реНрдб рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд░рд╛рдЬреНрдп рдХреЛ рдХрд╣реАрдВ рднреА рдЕрд╕рд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд╕ рд░рд╛рдЬреНрдп рдХреЗ рдЕрдВрджрд░ рдЧреБрдг рдирд╣реАрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред

рдЬрд┐рд╕ рдореБрджреНрджреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдо рдпрд╣рд╛рдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рдереЗ рд╡рд╣ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдмрдЧ рдерд╛ рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг рд░рд╛рдЬреНрдп рдХреЗ рдЧреБрдг рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реЗ рдШрдЯрдХреЛрдВ рдореЗрдВ рдЕрдкрдиреЗ рдкреНрд░рдХрд╛рд░ рдЦреЛ рджреЗрддреЗ рдереЗред рдпрд╣ рддрдм рд╕реЗ рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ, рдФрд░ рдпрджрд┐ рдРрд╕рд╛ рд╣реИ рддреЛ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрдВрдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

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

рдЖрдк рд╣рдореЗрд╢рд╛ рд╕реЗрдЯрд╕реНрдЯреЗрдЯ (рдШрдЯрдХрд╡рд┐рд▓рдорд╛рдЙрдВрдЯ рдореЗрдВ) рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@pawelpabich рдлрд┐рд░, рдпрд╣ рдХреЛрдИ рдореБрджреНрджрд╛ рдирд╣реАрдВ рд╣реИ :) рдЖрдк рдЙрджреНрджреЗрд╢реНрдп рдкрд░ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рд╕реЗ рд░рд╛рдЬреНрдп рдХреЛ рдЕрд╕рд╛рдЗрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдЖрдк рд╡реНрдпреБрддреНрдкрдиреНрди рдШрдЯрдХ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдкреНрд░реЛрдк рдЕрдиреБрдмрдВрдз рдХреЛ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВред

interface BaseCompState {
    baseState1?: string;
}

class BaseComp<TState extends BaseCompState> extends React.Component<any, TState> {
    constructor(props) {
        super(props);
        this.state = {
            baseState1: "fromBase",
        };
    }
}

interface TopCompState extends BaseCompState {
    topState1?: string;
}

class TopComp extends BaseComp<TopCompState> {
    constructor(props) {
        super(props);
        this.state = {
            baseState1: "fromTop",
            topState1: "fromTop",
        };
    }
}

рдпрд╣ рдПрдХ рд╡реНрдпреБрддреНрдкрдиреНрди рдШрдЯрдХ рдХрд╛ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╣реИ (рдЫреЛрдбрд╝реЗ рдЧрдП рдкреНрд░реЛрдк, рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╡рд┐рдЪрд╛рд░)ред рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдореЗрдВ this.state = рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ TState рдХреНрдпрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдЧрд░ рдпрд╣ _did_ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдХреЗрд╡рд▓ рдорд╛рддрд╛-рдкрд┐рддрд╛ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд░рд╛рдЬреНрдп рдХреЛ рдУрд╡рд░-рд░рд╛рдЗрдЯ рдХрд░ рджреЗрдЧрд╛ред рдЕрдВрддрд┐рдо рд╕реНрдерд┐рддрд┐ { baseState1: "fronBase" } рд╣реЛрдЧреАред рдЯреЙрдкрд╕реНрдЯреЗрдЯ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдХреНрдпрд╛ рд╣реБрдЖ?

рдпрджрд┐ рдЖрдк рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЖрд╢реНрд╡рд╕реНрдд рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдореВрд▓ рдШрдЯрдХ рдореЗрдВ рд░рд╛рдЬреНрдп рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рд░рд╛рдЬреНрдп рдХреЛ рд╡реНрдпреБрддреНрдкрдиреНрди рдШрдЯрдХ рд╕реЗ рдореВрд▓ рдШрдЯрдХ рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ( TState рддрд╛рдХрд┐ рдЖрдк рдЗрд╕реЗ рдЕрд╕рд╛рдЗрди рдХрд░ рд╕рдХреЗрдВ) - рдРрд╕рд╛ рдХреБрдЫ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ рдпрд╣:

interface BaseCompState {
    baseState1?: string;
}

class BaseComp<TState extends BaseCompState> extends React.Component<any, TState> {
    constructor(props, state: TState) {
        super(props);
        this.state = Object.assign({
            baseState1: "fromTop",
        }, state);
    }
}

interface TopCompState extends BaseCompState {
    topState1?: string;
}

class TopComp extends BaseComp<TopCompState> {
    constructor(props) {
        super(props, {
            topState1: "fromTop",
        });
    }
}

рдпрд╛ рдФрд░ рднреА рд╕рд░рд▓, рдЖрдк рдЕрдкрдиреЗ рдореВрд▓ рдШрдЯрдХ рдХреЗ рднреАрддрд░ рд╕реЗ this.setState( рдкрд░ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рд╣рд╛рдБ, рдЖрдк рдЗрд╕реЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ!)

рдпрд╣рд╛рдВ рдХреЛрдИ рдореБрджреНрджрд╛ рдирд╣реАрдВ рд╣реИред

@caesay рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдпрджрд┐ рдХреЛрдИ рдмрд╛рдзрд╛ рдирд╣реАрдВ рд╣реИ рддреЛ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдЕрднреА рднреА рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рдВрдХрд▓рдХ рдХреЗ рдкрд╛рд╕ рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рд╣реИ рдХрд┐ рдХреЛрдб рд╕рд╣реА рд╣реИред

import * as React from "react";

/* tslint:disable:max-classes-per-file*/

interface BaseProps {
    baseProp: string;
}

interface BaseState {
    baseState: string;
}

class Base<TProps extends BaseProps, TState extends BaseState> extends React.Component<TProps, TState> {
    constructor(props) {
        super(props);

        this.state = {
            baseState: props.baseProp
        };
    }

    render() {
        return <div>{this.state.baseState}</div>;
    }
}

interface DerivedProps extends BaseProps {
    derivedProp: string;
}

interface DerivedState extends BaseState {
    derivedState: string;
}

export class Derived extends Base<DerivedProps, DerivedState> {
    constructor(props) {
        super(props);

        this.state = {
            derivedState: props.derivedProp
        };
    }

    render() {
        return <div>{this.state.derivedState}</div>;
    }
}

рддреНрд░реБрдЯрд┐рдпрд╛рдБ

webpack: Compiled successfully.
ERROR at Test.tsx(17,9):
TS2322: Type '{ baseState: any; }' is not assignable to type 'Readonly<TState>'.

ERROR at Test.tsx(39,9):
TS2322: Type '{ derivedState: any; }' is not assignable to type 'Readonly<DerivedState>'.
  Property 'baseState' is missing in type '{ derivedState: any; }'.

Version: typescript 2.4.1

рдкреНрд░рдердоред рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдмреЗрд╕ рдореЗрдВ рдЖрдкрдХрд╛ рдкреНрд░реЙрдкреНрд╕ рдЯрд╛рдЗрдк рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░ props.baseProp any рд╣реИ, рдЬреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИ!

рджреВрд╕рд░рд╛, Derived рдореЗрдВ рдЖрдкрдХреЗ рдкреНрд░реЙрдкреНрд╕ рдореЗрдВ рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ рдФрд░ рдЖрдк baseState рдХреЛ рдпрд╛рдж рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд░реАрдбреЛрдирд▓реА рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рдХреМрди рд╕рд╛ рдкрд╛рдареНрдпрдХреНрд░рдо рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛

TProps extends BaseProps рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ TProps рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рд╡рд╣реА рд╕рджрд╕реНрдп рд╣реИрдВ рдЬреЛ BaseProps рдХреЗ рд╣реИрдВред рддреЛ рдпрд╣ рдХреИрд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИ? рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рд╕рдВрдХрд▓рдХ рдЗрд╕рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╣рдирд╛ рдХрд┐ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИ, рд╕рд╣реА рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред Derived рдкрд░ рднреА рдпрд╣реА рд╕реЛрдЪ рд▓рд╛рдЧреВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред

@caesay setState рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд┐рдзрд┐ async рд╣реИ рдФрд░ рдЖрдк рдЕрднреА рднреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рддрд┐ рд╕реЗрдЯ рдХреЗ рдмрд┐рдирд╛ render рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдПрдХрдорд╛рддреНрд░ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╕рдорд╛рдзрд╛рди рдЬреЛ рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рд╡рд╣ рд╣реИ рдкреВрд░реЗ рд░рд╛рдЬреНрдп рдХреЛ рд╡реНрдпреБрддреНрдкрдиреНрди рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рд╕реЗрдЯ рдХрд░рдирд╛ред рдЗрд╕рдХрд╛ рдПрдХ рд╕реНрдкрд╖реНрдЯ рджреЛрд╖ рд╣реИ рдХрд┐:

  1. рдЗрд╕реЗ рд╣рд░ рд╡реНрдпреБрддреНрдкрдиреНрди рд╡рд░реНрдЧ рдореЗрдВ рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП
  2. рд╡реНрдпреБрддреНрдкрдиреНрди рд╡рд░реНрдЧреЛрдВ рдХреЛ рдЙрд╕ рд░рд╛рдЬреНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдЬрд┐рд╕рдХреА рдЙрдиреНрд╣реЗрдВ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИред

рдореИрдВрдиреЗ рдКрдкрд░ рдЬреЛ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рдпрд╛ рд╣реИ рд╡рд╣ C# рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдпрд╣ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХреЗред

  1. ~рд╕реЗрдЯрд╕реНрдЯреЗрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ~
  2. рд╡реНрдпреБрддреНрдкрдиреНрди рд╡рд░реНрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдорд╛рдорд▓рд╛ рдЬреЛ рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рд╡рд╣ рд╣реИ setState рдХреЛ рдЕрдкрдиреЗ componentWillMount рдореЗрдВ рдХреЙрд▓ рдХрд░рдирд╛ред рдЖрдкрдХрд╛ рдЖрдзрд╛рд░ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдЙрд╕рдХреЗ рдмрдЪреНрдЪреЗ рдХреЗ рд▓рд┐рдП рд░рд╛рдЬреНрдп рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕рдВрднрд╡рддрдГ рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ this.state рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЖрдкрдХрд╛ рдЙрдкрд╡рд░реНрдЧ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ componentWillMount рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рд╡рд╣ рдЬреЛ рднреА рд░рд╛рдЬреНрдп рд╕реЛрдЪрддрд╛ рд╣реИ рдЙрд╕реЗ рднреА рд╕реЗрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
  3. рдХрдИ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рднрд╛рд╖рд╛ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ рдЬреЛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдХреБрдЫ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд╣реИрдВред рдЕрдиреНрдп рдирд╣реАрдВ рд╣реИрдВред рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдпрд╣ рдЙрдирдХреЗ рд╢рд╛рдорд┐рд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рдХрд╛ рддрд░реНрдХ рдирд╣реАрдВ рд╣реИред
  4. рдЖрдк рдЬреЛ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ рд╡реЗ рд╕рдордЭ рдореЗрдВ рдЖрддреА рд╣реИрдВред рд╡реЗ рдЯрд╛рдЗрдкрдкреНрд░рддрд┐ рдФрд░ рди рд╣реА рдЯрд╛рдЗрдкрд┐рдВрдЧ рдореЗрдВ рдмрдЧ рдХрд╛ рд╕реБрдЭрд╛рд╡ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдк рд╕рдЪрдореБрдЪ this.state рдХреЛ рдЙрд╕ рд╡рд╕реНрддреБ рдХреЗ рд╕рд╛рде рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдЕрдкреЗрдХреНрд╖рд┐рдд рдкреНрд░рдХрд╛рд░ рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛ рд╣реИред

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

@ericanderson рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдо рдпрд╣рд╛рдВ рдХреЛрдИ рдкреНрд░рдЧрддрд┐ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдореИрдВрдиреЗ рдЖрдкрдХреЛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рдпрд╛ рдФрд░ рдЕрдЧрд░ рдЖрдк рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░ рд╕рдХреЗрдВ рддреЛ рдореИрдВ рдЖрднрд╛рд░реА рд░рд╣реВрдВрдЧрд╛ред рдЕрдиреНрдпрдерд╛ рдЪрд░реНрдЪрд╛ рдХрд░рдирд╛ рдХрдард┐рди рд╣реИред

рдкреБрди: setState рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИред рдпрд╣ рдПрдХ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рдлреЗрдВрдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд░реЗрдВрдбрд░ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ рд░рд╛рдЬреНрдп рдХреЛ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдореЗрд░реЗ рдкрд╛рд╕ рдХреЛрдб рд╣реИ рдЬреЛ рдЙрд╕рдХреЗ рдХрд╛рд░рдг рдЯреВрдЯ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд░рд┐рдПрдХреНрдЯ рдбреЙрдХреНрд╕ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд╣рд╛рдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

@pawelpabich рдирд╣реАрдВ, рдпрд╣ рддрд░реНрдХ рд░рдЦрдиреЗ рдХреА рдЬрдЧрд╣ рдирд╣реАрдВ рд╣реИред рдЖрдк рднрд╛рд╖рд╛ рдХреА рдЕрдкрдиреА рд╕рдордЭ рдореЗрдВ рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЧрд▓рдд рд╣реИрдВред рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЖрдкрдиреЗ рд░рд╛рдЬреНрдп рдХреЛ рдЕрдкрдиреЗ рдХрд┐рд╕реА рднреА рдХрд╛рд░реНрдп рдореЗрдВ "рд░рд╛рдЬреНрдп" рдЕрдиреБрдмрдВрдз рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдЖрдк рдХрд░рддреЗ рд╣реИрдВ

this.state = { baseState: props.baseProp };
// now the state is exactly { baseState: props.baseProp }

рд░рд╛рдЬреНрдп рдмрд┐рд▓реНрдХреБрд▓ { baseState: props.baseProp } рд╣реИ рдФрд░ рдпрд╣ TProps extends BaseProps рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ TProps рдХреНрдпрд╛ рд╣реИ! рдЗрд╕рдореЗрдВ рдХреЛрдИ рдЧреБрдг рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ)ред

рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдк рдПрдХ _ SEPARATE _ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

this.state = { derivedState: props.derivedProp };
// now the state is exactly {  derivedState: props.derivedProp }

рд░рд╛рдЬреНрдп рдЕрдм рдмрд┐рд▓реНрдХреБрд▓ { derivedState: props.derivedProp } рд╣реИ (рдЖрдкрдиреЗ рдЕрдкрдиреЗ рдореВрд▓ рд░рд╛рдЬреНрдп рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЛ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░ рджрд┐рдпрд╛ рд╣реИ !!) рдФрд░ рдпрд╣ DerivedState рдпрд╛ BaseProps рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

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

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

рдореИрдВ рд╢рд╛рдпрдж рд╣реА рдЖрдкрдХреЗ рд╕рд╛рде рдЗрд╕ рдкрд░ рдмрд╣рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрдврд╝рдиреЗ рд╕реЗ рджреВрд░ рд╣рдЯрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЕрдлрд╕реЛрд╕...

рдореИрдВ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ setState () рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╣реА рдЦрдбрд╝рд╛ рд░рд╣реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕реЗ componentWillMount рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕рд╛ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реВрдВред

рдпрд╣ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдп рдЙрджрд╛рд╣рд░рдг:
https://github.com/ericanderson/set-state-example

рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, index.tsx:

import * as React from "react";
import * as ReactDOM from "react-dom";

/* tslint:disable:max-classes-per-file*/

interface BaseProps {
  baseProp: string;
}

interface BaseState {
  baseState: string;
}

class Base<TProps extends BaseProps, TState extends BaseState> extends React.Component<TProps, TState> {
  public componentWillMount() {
    this.setState({
      baseState: this.props.baseProp,
    });
  }

  public render() {
    return (
      <p>
        <code>this.state.baseState: </code>
        {this.state.baseState}
      </p>
    );
  }
}

interface DerivedProps extends BaseProps {
  derivedProp: string;
}

interface DerivedState extends BaseState {
  derivedState: string;
}

export class Derived extends Base<DerivedProps, DerivedState> {
  public componentWillMount() {
    super.componentWillMount();
    this.setState({
      derivedState: this.props.derivedProp,
    });
  }

  public render() {
    return (
      <div>
        <p>
          <code>this.state.derivedState: </code>
          {this.state.derivedState}
        </p>
        {super.render()}
      </div>
    );
  }
}

ReactDOM.render(<Derived derivedProp="its derived" baseProp="its basic" />, document.getElementById("main"));

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

рд░рд╛рдЬреНрдп рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдЪрд┐рдВрддрд╛рдУрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде, рдЖрдкрдХрд╛ рдЙрджрд╛рд╣рд░рдг рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреЙрд▓рд┐рдореЙрд░реНрдлрд┐рдХ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЧрдпрд╛ рд╣реИ:

interface BaseProps {
  baseProp: string;
}

interface BaseState {
  baseState: string;
}

abstract class Base<TProps extends BaseProps, TState extends BaseState> extends React.Component<TProps, TState> {
  constructor(props: TProps) {
      super(props);

      this.state = this.getInitialState();
  }

  protected abstract getInitialState(): TState;

  protected getBaseState() {
    return this.props.baseProp;
  }

  render() {
      return <div>{this.state.baseState}</div>;
  }
}

interface DerivedProps extends BaseProps {
  derivedProp: string;
}

interface DerivedState extends BaseState {
  derivedState: string;
}

export class Derived extends Base<DerivedProps, DerivedState> {
  getInitialState(): DerivedState {
    return {
      baseState: this.getBaseState(),
      derivedState: this.props.derivedProp,
    };
  }

  render() {
      return <div>{this.state.derivedState}</div>;
  }
}

@patsissons рдзрдиреНрдпрд╡рд╛рдж!

@ рдХреИрд╕реЗ рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рдЧрд▓рдд рдерд╛ рдФрд░ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдпрд╣ рдирд╣реАрдВ рджреЗрдЦрд╛ рдХрд┐ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдПрдХ-рджреВрд╕рд░реЗ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░реЗрдВрдЧреЗред рдХрд╣рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдХрд┐ CAPS рдФрд░ ! рдХреЗ рдЙрдкрдпреЛрдЧ рдиреЗ рдореБрдЭреЗ рдЕрдкрдиреЗ рдЫреЗрдж рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдореЗрдВ рдорджрдж рдирд╣реАрдВ рдХреАред

@patsissons рдФрд░ @ericanderson рдиреЗ рд╕рдорд╕реНрдпрд╛ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд┐рдпрд╛ рдФрд░ рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЕрдиреНрдп рд▓реЛрдЧ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@pawelpabich рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдореЗрд░реЗ рддрд░реАрдХреЗ рдкреЗрд╢реЗрд╡рд░ рд╕реЗ рдХрдо рдереЗ - рд▓реЗрдХрд┐рди рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЖрдкрдХреЛ рдХрдИ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг, рдирдореВрдиреЗ рдЖрджрд┐ рджрд┐рдП рд╣реИрдВ, рдФрд░ рдЖрдк рдореЗрд░реА рдмрд╛рдд рдирд╣реАрдВ рд╕реБрдирдирд╛ рдЪреБрдирддреЗ рд╣реИрдВред

рддреЛ рдпрд╣ рд╕рд┐рд░реНрдл рдорд╛рддрд╛-рдкрд┐рддрд╛ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд░рд╛рдЬреНрдп рдХреЛ рдУрд╡рд░-рд░рд╛рдЗрдЯ рдХрд░ рд░рд╣рд╛ рд╣реЛрдЧрд╛ред

[_рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐_] рдЕрдкрдиреЗ рдореВрд▓ рдШрдЯрдХ рдореЗрдВ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрднрд╛рд▓реЗрдВ, рддреЛ рдЖрдк рд░рд╛рдЬреНрдп рдХреЛ рд╡реНрдпреБрддреНрдкрдиреНрди рдШрдЯрдХ рд╕реЗ рдореВрд▓ рдШрдЯрдХ рдирд┐рд░реНрдорд╛рддрд╛ рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

[_рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рд╡реНрдпреБрддреНрдкрдиреНрди рдШрдЯрдХ рдореЗрдВ рд░рд╛рдЬреНрдп рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ_] рдЖрдк рдПрдХ рд╕рдВрд░рдХреНрд╖рд┐рдд рд╕рджрд╕реНрдп getBaseState() рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЬрдм рдЖрдк рд░рд╛рдЬреНрдп рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЗрд╕реЗ рд╡реНрдпреБрддреНрдкрдиреНрди рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╕реЗ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@patsissons рдиреЗ рдЬреЛ рдХрд┐рдпрд╛ рд╡рд╣ рдпрд╣рд╛рдВ рдкрд╣рд▓реЗ рд╕реЗ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдПрдХ рдХреЛрдб рдирдореВрдирд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ - рдЬреЛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ред рдпрд╣ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╣рдо рдЕрдХреНрд╕рд░ рд╡рд╣рд╛рдВ рддреИрдпрд╛рд░ рдХреЛрдб рдирдореВрдиреЗ рднреА рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

рдореИрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдирдпрд╛ рд╣реВрдВ, рд╢рд╛рдпрдж рдореИрдВ sth рдирд╣реАрдВ рдЬрд╛рдирддрд╛, рд▓реЗрдХрд┐рди рднрд▓реЗ рд╣реА рдРрдк рдмрд┐рдирд╛ рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐, рдЪреЗрддрд╛рд╡рдиреА рдФрд░ рд╕рдВрдХреЗрдд рдХреЗ рд╕рдВрдХрд▓рд┐рдд рд╣реЛ, рдореБрдЭреЗ рд░рдирдЯрд╛рдЗрдо рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИред рдиреАрдЪреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдШрдЯрдХ рд╣реИред рдореИрдВ рддреНрд░реБрдЯрд┐ рдХрд╛ рд╢реНрд░реЗрдп Readonly рд╕реНрдерд┐рддрд┐ рдХреЛ рджреЗрддрд╛ рд╣реВрдВред рдпрджрд┐ рдРрдк рдиреЗ Readonly рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рдкрд╣рд▓реЗ рдХрд╛рдо рдХрд┐рдпрд╛, рддреЛ рдЗрд╕ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рдж рдЗрд╕рдиреЗ рдХрд╛рдо рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдФрд░ рдпрд╣ рдХреЛрдИ рд╕рдВрдХрд▓рди рд╕рдордп рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред

import * as React from 'react';

export default class HomePage extends React.Component<any, Map<string, string>> {

  public componentWillMount() {
    const map = new Map<string, string>();
    map.set('aKey', 'aValue');
    this.setState(map);
  }

  public render() {

      return (
        <div className="home">
          <div className="greeting">
            Home page: {this.state.get('aKey')} // <-- I get an error here
          </div>
        </div>
      );
  }
}

рддреНрд░реБрдЯрд┐:

homePage.tsx:12 Uncaught TypeError: this.state.get is not a function
    at HomePage.render (homePage.tsx:12)
    at eval (ReactCompositeComponent.js:793)
    at measureLifeCyclePerf (ReactCompositeComponent.js:73)
    at ReactCompositeComponentWrapper._renderValidatedComponentWithoutOwnerOrContext (

рд░рд╛рдЬреНрдп рд╣рдореЗрд╢рд╛ рдПрдХ рд╕рд╛рджреЗ рдХреБрдВрдЬреА рд╡рд╛рд▓реА рд╡рд╕реНрддреБ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд░рд╛рдЬреНрдп рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ
рдХреБрдЫ рдЗрд╕ рддрд░рд╣: { values: Map <string, string> } рдФрд░ рдкрдврд╝реЗрдВ
this.state.values.get('aKey')

рдСрдк рд╡реАрдЖрд░ 29 рд╕рд┐рддрдВрдмрд░ред 2017 рдмрдЬреЗ 09:01 рд╢реНрд░рд╛рдл рдЬрд╛рдиреВрд╕ рдмрд┐рдпрд╛рд▓реЛрдмреНрд░рдЬрд╝реЗрд╡рд╕реНрдХреА <
рд╕реВрдЪрдирд╛рдПрдВ@github.com>:

рдореИрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдирдпрд╛ рд╣реВрдБ, рд╢рд╛рдпрдж рдореИрдВ sth рдирд╣реАрдВ рдЬрд╛рдирддрд╛, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдБ рддрдХ рдХрд┐
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдРрдк рдмрд┐рдирд╛ рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐, рдЪреЗрддрд╛рд╡рдиреА рдФрд░ рд╕рдВрдХреЗрдд рдХреЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдореБрдЭреЗ рд░рдирдЯрд╛рдЗрдо рдорд┐рд▓рддрд╛ рд╣реИ
рддреНрд░реБрдЯрд┐ред рдиреАрдЪреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдШрдЯрдХ рд╣реИред рдореИрдВ рддреНрд░реБрдЯрд┐ рдХрд╛ рд╢реНрд░реЗрдп рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рджреЗрддрд╛ рд╣реВрдВ
рд░рд╛рдЬреНрдпред рдпрджрд┐ рдРрдк рд░реАрдбреЛрдирд▓реА рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рдкрд╣рд▓реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рдмрд╛рдж
рдЗрд╕реЗ рдмрджрд▓реЗрдВ рдХрд╛рдо рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдФрд░ рдпрд╣ рдХреЛрдИ рд╕рдВрдХрд▓рди рд╕рдордп рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред

рдЖрдпрд╛рдд * 'рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛' рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ;
рдирд┐рд░реНрдпрд╛рдд рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡рд░реНрдЧ рд╣реЛрдордкреЗрдЬ React.Component рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИ> {

рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдШрдЯрдХ рд╡рд┐рд▓рдорд╛рдЙрдВрдЯ () {
рдХрд╛рд╕реНрдЯ рдирдХреНрд╢рд╛ = рдирдпрд╛ рдирдХреНрд╢рд╛();
map.set ('aKey', 'aValue');
рдпрд╣.рд╕реЗрдЯрд╕реНрдЯреЗрдЯ (рдорд╛рдирдЪрд┐рддреНрд░);
}

рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░реЗрдВрдбрд░ () {

  return (
    <div className="home">
      <div className="greeting">
        Home page: {this.state.get('aKey')} // <-- I get an error here
      </div>
    </div>
  );

}
}

рддреНрд░реБрдЯрд┐:

рд╣реЛрдордкреЗрдЬред tsx :12 рдЕрдирдХреЙрдЯреЗрдб рдЯрд╛рдЗрдк рдПрд░рд░: this.state.get рдХреЛрдИ рдлрдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реИ
HomePage.render рдкрд░ (homePage.tsx:12)
eval рдкрд░ (ReactCompositeComponent.js:793)
рдорд╛рдк рдкрд░ LifeCyclePerf (ReactCompositeComponent.js:73)
ReactCompositeComponentWrapper._renderValidatedComponentWithOwnerOrContext рдкрд░ (

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/DefinitelyTyped/DefinitelyTyped/issues/14250#issuecomment-333047367 ,
рдпрд╛ рдереНрд░реЗрдб рдХреЛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/ABvGhM5hDyRNyUeZuIiGeTZk1N-rfuA4ks5snJW5gaJpZM4LuDWV
.

рдзрдиреНрдпрд╡рд╛рдж, рд▓реЗрдХрд┐рди рдпрд╣ рд░рд╛рдЬреНрдп рдХреЛ Readonly<S> рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╡реНрдпрд░реНрде рдкреНрд░рдпрд╛рд╕ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рдиреЗрд╕реНрдЯреЗрдб рд╕рджрд╕реНрдп рд░реАрдбреЛрдирд▓реА рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред

рдпрд╣ рдПрдХ рджрд┐рди рд╕рдВрднрд╡ рд╣реИ рдХрд┐ Readonly рдкреБрдирд░рд╛рд╡рд░реНрддреА рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрднреА рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЖрдк рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдЗрд╕реЗ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрднрд╛рд▓рд╛ рд╣реИред рдЖрдкрдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ ReadonlyMap рдпрд╛ . рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП

interface State {
    readonly [key: string]: string;
}

рдпрд╛ рдиреЗрд╕реНрдЯреЗрдб:

interface State {
    map: { readonly [key: string]: string };
}

рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдбреАрдк рд░реАрдб рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

export type DeepReadonly<T> =
  T extends Array<any> ?
  ReadonlyArray<T[0]> :
  T extends Date ?
  T :
  T extends Function ?
  T :
  T extends object ?
  { readonly [P in keyof T]: DeepReadonly<T[P]> } :
  T;

export type Writable<T> =
  T extends ReadonlyArray<any> ?
  Array<WritableObject<T[0]>> :
  T extends Array<any> ?
  Array<WritableObject<T[0]>> :
  WritableObject<T>;

type WritableObject<T> =
  T extends Date ?
  T :
  T extends Function ?
  T :
  T extends object ?
  { -readonly [P in keyof T]: Writable<T[P]> } :
  T;
рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

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

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

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

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

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

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