Definitelytyped: ts 2.0 рд╕рдЦреНрдд рдЕрд╢рдХреНрдд рдЬрд╛рдБрдЪ рдХреЗ рд╕рд╛рде defaultProps рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 30 рд╕рд┐рддре░ 2016  ┬╖  50рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: DefinitelyTyped/DefinitelyTyped

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЧреБрдг рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рдЦреНрдд рдирд▓рдЪреЗрдХ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

interface TestProps { x?: number}

class Test extends React.Component<TestProps, null> {

    static defaultProps =  {x: 5};

    render() {
        const x: number = this.props.x;
        return <p>{x}</p>;
    }
}

error TS2322: Type 'number | undefined' is not assignable to type 'number' рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐рдпрд╛рдВ, рднрд▓реЗ рд╣реА рдпрд╣ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реЛред

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

рдХреБрдЫ рдРрд╕рд╛ рд╣реЛрддрд╛ рддреЛ рдХреНрдпрд╛ рд╣реЛрддрд╛...

class ComponentWithDefaultProps<P, D, S> {
    props: P & D & {children?: React.Children};
}

рдЬреЛ рдореМрдЬреВрджрд╛ рд░рд┐рдПрдХреНрдЯ рдХреЗ рд╕рдорд╛рди рд╣реИред рдкреНрд░реЛрдк рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдХреЙрдореНрдкреЛрдиреЗрдВрдЯ рдЯрд╛рдЗрдкрд┐рдВрдЧ?

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

рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдкреНрд░рдХрд╛рд░ рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯрдкреНрд░реЙрдк рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ, рддреЛ рдореИрдВ рд╕рднреА рдХрд╛рди рд╣реВрдВред рд╣рдо рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ:

interface Props {
  firstName: string;
  lastName?: string;
}

interface DefaultProps {
  lastName: string;
}

type PropsWithDefaults = Props & DefaultProps;

export class User extends React.Component<Props> {
  public static defaultProps: DefaultProps = {
    lastName: 'None',
  }

  public render () {
    const { firstName, lastName } = this.props as PropsWithDefaults;

    return (
      <div>{firstName} {lastName}</div>
    )
  }
}

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

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

рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЗрд╕реЗ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

interface TestProps { x?: number}

class Test extends React.Component<TestProps, null> {

    static defaultProps =  {x: 5};

    render() {
        const x: number = (this.props.x as number);
        return <p>{x}</p>;
    }
}

рджреЗрдЦреЗрдВ https://www.typescriptlang.org/docs/handbook/basic-types.html#type -assertions

рдЕрдЧрд░ рдЗрд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рд╢рд╛рдирджрд╛рд░ рддрд░реАрдХрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рдЗрд╕реЗ рд╕реБрдирдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛ред

рдЕрд╕реНрд╡реАрдХрд░рдг: рдореИрдВ рд▓рдЧрднрдЧ рддреАрди рджрд┐рдиреЛрдВ рд╕реЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдореИрдВ рдердХ рдЧрдпрд╛ рд╣реВрдВ, рдФрд░ рд╢рд╛рдпрдж рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдореИрдВ рдХрд┐рд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рддреАрди рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рдбреЗрдлрд┐рдирд┐рд╢рди рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдкрд░ +1000ред

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

рд╕рдЦреНрдд рдЕрд╢рдХреНрдд рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдБрдЪ рдХреА рдкреНрд░рдХреГрддрд┐ рдХреЗ рдХрд╛рд░рдг рдкреНрд░рд╡рд╛рд╣ рд╕рдорд╛рди рд╡рд░реНрдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рднреА рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред
https://github.com/facebook/flow/blob/master/lib/react.js#L16
https://github.com/facebook/flow/blob/master/lib/react.js#L104 -L105

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рддреАрд╕рд░реЗ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП https://github.com/Microsoft/TypeScript/issues/2175 рдХреЗ рд╣рд▓ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣рд╛рдВ рдЕрдзрд┐рдХ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИрдВред
рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ (рдмреНрд░реЗрдХрд┐рдВрдЧ) рдкрд░рд┐рд╡рд░реНрддрди (рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ class Component<P, S, D> ) рдХреЛ рд╕рдореАрдХреНрд╖рдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдореЛрджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
@johnnyreilly @bbenezech @pzavolinsky рдХреНрдпрд╛ рдЖрдк рд▓реЛрдЧреЛрдВ рдХреА рдЙрд╕ рдкрд░ рдХреЛрдИ рд░рд╛рдп рд╣реИ?

@ r00ger рд╕рд╣рдордд рд╣реБрдПред рдкрд░рд┐рднрд╛рд╖рд╛ рдмрджрд▓рдирд╛ рдмрд╣реБрдд рд╡рд┐рдШрдЯрдирдХрд╛рд░реА рд╣реИред

рдХреНрдпрд╛ рдХрд┐рд╕реА рдиреЗ Partial рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ?

рдЬреИрд╕реЗ рдХреА:

    interface ComponentClass<P> {
-        defaultProps?: P;
+        defaultProps?: Partial<P>;
    }

рдзреНрдпрд╛рди рди рджреЗрдВ рдХрд┐ рдКрдкрд░ Partial рд╕рд╛рдорд╛рдиред

рдЖрдВрд╢рд┐рдХ рдХреЗрд╡рд▓ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдВрд╢рд┐рдХ рдкреНрд░реЙрдкрдЯрд╛рдЗрдк рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХреИрд╕реЗ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред render рдХреЗ рдЕрдВрджрд░, lastName рдЕрднреА рднреА string | undefined рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдП рдЧрдП рдЕрдиреБрд╕рд╛рд░ as рдпрд╛ ! рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрджрд░реНрд╢ рдирд╣реАрдВ рд╣реИред

interface IUser {
    firstName: string
    lastName?: string
}
export class User extends React.Component<IUser, {}> {
    public static defaultProps: Partial<IUser> = {
        lastName: 'None',
    }

    public render () {
        const { firstName, lastName } = this.props
        // error
        lastName.toUpperCase()

        return (
            <div>{firstName} {lastName}</div>
        )
    }
}

рдореИрдВрдиреЗ рдЕрднреА TS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рд╣реИред рдХреНрдпрд╛ рдореБрдЭреЗ рдХреБрдЫ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИ?

рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдкреНрд░рдХрд╛рд░ рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯрдкреНрд░реЙрдк рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ, рддреЛ рдореИрдВ рд╕рднреА рдХрд╛рди рд╣реВрдВред рд╣рдо рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ:

interface Props {
  firstName: string;
  lastName?: string;
}

interface DefaultProps {
  lastName: string;
}

type PropsWithDefaults = Props & DefaultProps;

export class User extends React.Component<Props> {
  public static defaultProps: DefaultProps = {
    lastName: 'None',
  }

  public render () {
    const { firstName, lastName } = this.props as PropsWithDefaults;

    return (
      <div>{firstName} {lastName}</div>
    )
  }
}

+1
рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рд╕реЗ рдЬреВрдЭ рд░рд╣рд╛ рд╣реВрдВред

+1

+1

рддреАрд╕рд░реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░реЙрдкреНрд╕ рдХреЗ рдЦрд┐рд▓рд╛рдл рдкреНрд░реЙрдкреНрд╕ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЦреБрд╢реА рд╕реЗ TS 2.4 рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣ рдЕрдм рд╕рдВрднрд╡ рд╣реИ! рджреЗрдЦреЗрдВ https://github.com/Microsoft/TypeScript/issues/12215#issuecomment -319495340

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

рдореБрдЭреЗ рдЧрд▓рдд рдордд рд╕рдордЭреЛ, рдореБрдЭреЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд╕рдВрдж рд╣реИ, рд▓реЗрдХрд┐рди рдлреНрд▓реЛ 0.53 рдХреЗ рдмрд╛рдж рд╕реЗ рдореБрдЭреЗ рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ рд░рд┐рдПрдХреНрдЯ рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИ https://medium.com/flow-type/even-better-support-for-react-in-flow- 25b0a3485627

@Hotell Flow рдореЗрдВ React.Component рдХреЗ рд▓рд┐рдП рддреАрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ - рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдлрд╝реНрд▓реЛ рд╕реЗ рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рдордзреНрдпрдо рд▓реЗрдЦ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЙрдкрд╡рд░реНрдЧ рдПрдиреЛрдЯреЗрд╢рди рд╕реЗ рд╡рд░реНрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ - рдПрдХ рд╕рд╛рдл-рд╕реБрдерд░реА рднрд╛рд╖рд╛-рд╕реНрддрд░реАрдп рд╕реБрд╡рд┐рдзрд╛ TS рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ -рдШреЛрд╖рдгрд╛ рд╡рд┐рдЪрд╛рд░ AFAIKред

@aldendaniels

рд░рд┐рдПрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдлреНрд▓реЛ рдореЗрдВ рддреАрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрддреЗ рд╣реИрдВред рдХреЙрдореНрдкреЛрдиреЗрдВрдЯ

рдирд╣реАрдВ, рдпрд╣ 0.53 рд╕реЗ рдкрд╣рд▓реЗ рдРрд╕рд╛ рд╣реБрдЖ рдХрд░рддрд╛ рдерд╛, рдЕрдм рдФрд░ рдирд╣реАрдВ :)

@ рд╣реЛрдЯреЗрд▓ рдЖрд╣, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд! рдореБрдЭреЗ рд╕реБрдзрд╛рд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

AFAIK рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЯреАрдПрд╕ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░реЛрдк рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рддреАрди-рдкреНрд░рдХрд╛рд░-рдкреИрд░рд╛рдореАрдЯрд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдо рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЯреАрдо рд╕реЗ рдЕрдкрд╕реНрдЯреНрд░реАрдо рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд┐рдП рдмрд┐рдирд╛ рд╕рд╣реА рдЯрд╛рдЗрдкрд┐рдВрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗред

рдХреНрдпрд╛ рдЖрдк typeof MyComponent.defaultProps рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд░рдо рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдПрдХ рд╕реНрдерд┐рд░ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдЕрдиреБрдорд╛рдирд┐рдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ?

рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдХреЛрдИ рдЦрдмрд░? рдХреНрдпрд╛ рдХреЛрдИ рддреАрд╕рд░реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдФрд░ https://github.com/Microsoft/TypeScript/issues/12215#issuecomment -319495340 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреАрдЖрд░ рдХрд░рддрд╛ рд╣реИ?

рдЕрдкрд╡реЛрдЯрд┐рдВрдЧ рдореБрджреНрджрд╛: рд╡рд╣реА рд╕рдорд╕реНрдпрд╛

+1

рдореИрдВ рднреА рдЗрд╕рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛, рдФрд░ рдореИрдВрдиреЗ static defaultProps рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП (рдЬрдм рддрдХ рдпрд╣ рдареАрдХ рд╕реЗ рддрдп рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛) рдЪреБрдирд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╕рд╣рд╛рдпрдХ рдПрдЪрдУрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:

рдлрд╝рд╛рдЗрд▓ рдШрдЯрдХ/рд╣реЗрд▓реНрдкрд░реНрд╕/withDefaults.tsx :

import * as React from 'react'

export interface ComponentDefaulter<DP> {
  <P extends {[key in keyof DP]?: any}>(Component: React.ComponentType<P>): React.ComponentType<
    Omit<P, keyof DP> &         // Mandate all properties in P and not in DP
    Partial<Pick<P, keyof DP>>  // Accept all properties from P that are in DP, but use type from P
  >
}

export default function withDefaults<DP>(defaultProps: DP): ComponentDefaulter<DP> {
  return Component => props => <Component {...defaultProps} {...props}/>
}

рдЕрдм рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ:

рдлрд╝рд╛рдЗрд▓ рдШрдЯрдХ/Button.tsx :

import * as React from 'react'
import withDefaults from './helpers/withDefaults'

export interface ButtonProps {
  label: string
  onPress: () => any
}

export const defaultProps = {
  onPress: () => undefined
}

class Button extends React.Component<ButtonProps> {
  // ...
}

export default withDefaults(defaultProps)(Button)

рддреАрди рд╕рдВрднрд╛рд╡рд┐рдд рдбрд╛рдЙрдирд╕рд╛рдЗрдбреНрд╕ (рдЬреЛ рдореИрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВ):

  1. рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдЪрдУрд╕реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдпрд╣ рд░рд┐рдПрдХреНрдЯ рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рддрд┐рдорд╛рди рд╣реИ, рдпрд╣ рдареАрдХ рд▓рдЧрддрд╛ рд╣реИред
  2. рдЖрдкрдХреЛ рдкреНрд░реЙрдкреНрд╕ рдХреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ props рд╕рдВрдкрддреНрддрд┐ рд╕реЗ рдЕрдиреБрдорд╛рди рдкрд░ рднрд░реЛрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред
  3. defaultProps рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдХреЛрдИ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЬрд╛рдБрдЪ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди export const defaultProps: Partial<ButtonProps> = {...} рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рдЗрд╕рдХрд╛ рдЙрдкрдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

@vsaarinen рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдореИрдВ props: Props & DefaultProps рдХреЗ рд╕рд╛рде рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рд▓рд┐рдЦрддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХреЛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рдкреВрд░реА рдХрдХреНрд╖рд╛ $#$ this.props as PropsWithDefaults #$ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рд╕реАрдзреЗ this.props рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреА рд╣реИред

рдЗрд╕ рдХрджрд░:

import * as React from 'react'

export class Component<P = {}, S = {}, DP = {}> extends React.Component<P, S> {
  props: Readonly<{ children?: React.ReactNode }> & Readonly<P> & Readonly<DP>
}

export interface Props {
  firstName: string
  lastName?: string
}

export interface DefaultProps {
  lastName: string
}

export class User extends Component<Props, any, DefaultProps> {
  render() {
    const { firstName, lastName } = this.props

    // no error
    return (
      <div>{firstName} {lastName.toUpperCase()}</div>
    )
  }
}

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ @ qiu8310 рдЬреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рдерд╛, рдлрд┐рд░ рднреА рдХреЙрд▓ рд╕рд╛рдЗрдЯреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдБ рдереАрдВ рдЬреЛ рдЙрди рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░реЙрдкреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рд▓реНрд▓рд╛ рд░рд╣реА рдереАрдВ рдЬреЛ рд╡реИрдХрд▓реНрдкрд┐рдХ рдирд╣реАрдВ рдереЗред рдЗрд╕реЗ рдорд╛рдореВрд▓реА рд╕рдорд╛рдпреЛрдЬрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд┐рд▓рд╛

import * as React from 'react'

export class Component<P = {}, S = {}, DP = {}> extends React.Component<P, S> {
  // Cast the props as something where readonly fields are non optional
  props = this.props as Readonly<{ children?: React.ReactNode }> & Readonly<P> & Readonly<DP>
}

export interface Props {
  firstName: string
  lastName?: string
}

export interface DefaultProps {
  lastName: string
}

export class User extends Component<Props, any, DefaultProps> {
  render() {
    const { firstName, lastName } = this.props

    // no error
    return (
      <div>{firstName} {lastName.toUpperCase()}</div>
    )
  }
}

рдореИрдВрдиреЗ рддреАрд╕рд░реЗ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рд╛ рдФрд░ @ qiu8310 рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рд╕рдорд╛рдкреНрдд рдХрд┐рдпрд╛:

// ComponentWithDefaultProps.ts
import * as React from "react";

export declare class ComponentWithDefaultProps<P, S, DP extends Partial<P>> extends React.Component<P & DP, S> {}
type redirected<P, S, DP> = ComponentWithDefaultProps<P, S, DP>;
const redirected: typeof ComponentWithDefaultProps = React.Component as any;

export const Component = redirected;

// User.ts
import { Component } from "ComponentWithDefaultProps";
export interface Props {
  firstName: string
  lastName?: string
}
export interface DefaultProps {
  lastName: string
}

export class User extends Component<Props, {}, DefaultProps> {
  public render() {
    const { firstName, lastName } = this.props;
    return <div>{firstName} {lastName.toUpperCase()}</div>;
  }
}

рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпреЗ рджреЛрдиреЛрдВ рджреГрд╖реНрдЯрд┐рдХреЛрдг (рдореЗрд░рд╛ рдФрд░ рдКрдкрд░ рдХрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг) рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдХрд╛рд░рдг рдмрдирддреЗ рд╣реИрдВред рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рдШрдЯрдХ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:

User: React.ComponentClass<P & DP>
User["props"]: Readonly<{ children?: React.ReactNode }> & Readonly<P & DP>

рдЬрд╛рд╣рд┐рд░ рд╣реИ, User рдХрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЧрд▓рдд рд╣реИред React.ComponentClass<P & DP> рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ lastName рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддрд╛рдХрд┐

<User firstName="" />;
//    ~~~~~~~~~~~~  Property 'lastName' is missing...

@ qiu8310 рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рдХрд╛рд░ рднрд┐рдиреНрди рд╣реИрдВ:

User: React.ComponentClass<P>
User["props"]: Readonly<{ children?: React.ReactNode }> & Readonly<P> & Readonly<DP>

рд▓реЗрдХрд┐рди JSX рдХрд╛ рдПрдХ рд╣реА рдЯреБрдХрдбрд╝рд╛ рдПрдХ рд╣реА рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ tsc рдХреЗ JSX рдЪреЗрдХ props ' рдкреНрд░рдХрд╛рд░ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ ред

<User firstName="John" />;
//    ~~~~~~~~~~~~~~~~  Property 'lastName' is missing...

рдордЬреЗрджрд╛рд░ рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ <User firstName="John" /> рдХреЛ React.createElement(User, {firstName: "John"}) рдореЗрдВ рдмрджрд▓рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдХрд┐ рдПрдХ рд╡реИрдз рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реЛрдЧрд╛ред рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдБрдЪ ComponentClass рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП

<User firstName="Jonh" />; // doesn't work, but
React.createElement(User, { firstName: "John" }); // works

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рддреАрд╕рд░реА рдЬреЗрдиреЗрд░рд┐рдХ рд╣реЛрдиреЗ рдкрд░ рднреА рд╣рдореЗрдВ рд╕рд╣реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд╛рд▓реЗ рдШрдЯрдХ рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдЪрд╛рд▓ рдЬреЛрдбрд╝рдиреА рд╣реЛрдЧреА:

export const User = class extends Component<Props, {}, DefaultProps> {
    // ...
} as React.ComponentClass<Props>;

<User firstName="Jonh" />; // works

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

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ React рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рд╡рд┐рд▓рдп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЕрднреА рдХреЗ рд▓рд┐рдП рдореИрдВ ComponentWithDefaultProps рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП рдШрдЯрдХ рдХреЗ рдкреНрд░рдХрд╛рд░ рдкрд░ рдЬреЛрд░ рджреЗ рд░рд╣рд╛ рд╣реВрдВред

export interface DefaultProps {
    lastName: string;
}
export interface Props extends Partial<DefaultProps> {
    firstName: string;
}

export type PropsWithDefault = Props & DefaultProps;

export const User: as React.ComponentClass<Props> =
class extends React.Component<PropsWithDefault> {
    render() {
        // no error
        return <div>
            {this.props.firstName}
            {this.props.lastName.toUpperCase()}
        </div>;
    }
};
// Note, we've assigned `React.Component<PropsWithDefault>` to `React.ComponentClass<Props>`

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЖрдк рдШрдЯрдХ рдХреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ this.props рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣рд░ рдЙрдкрдпреЛрдЧ рдкрд░ рдЬреЛрд░ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП const { lastName } = this.props as Props & DefaultProps , рдпрд╛ рд╣рд░ рдЬрдЧрд╣ рд╡рд┐рд╕реНрдордпрд╛рджрд┐рдмреЛрдзрдХ рдЪрд┐рд╣реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ this.props.lastName!.toLowerCase() )ред

рдореБрдЭреЗ рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рдорд┐рд▓реЗ - https://github.com/gcanti/typelevel-ts#objectdiff

@rifler рддрдерд╛рдХрдерд┐рдд рдПрдЪрдУрд╕реА рджреГрд╖реНрдЯрд┐рдХреЛрдг (рдореИрдВ рдбреЗрдХреЛрд░реЗрдЯрд░ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ) рдпрд╣рд╛рдВ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рд░рд╣рд╛ рд╣реИ , рд╣рдо рдРрд╕реЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдЖрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд░рдирдЯрд╛рдЗрдо рдУрд╡рд░рд╣реЗрдб рдирд╣реАрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИ

рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ
рдЖрд╢рд╛ рд╣реИ рдЖрдкрдХреЛ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓ рдЬрд╛рдПрдЧрд╛

рдХреЛрдЗ рдкреНрд░рдЧрддрд┐?

@r00ger рджреНрд╡рд╛рд░рд╛ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рддрдХрдиреАрдХ рдкрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рднрд┐рдиреНрдирддрд╛ рд╣реИ:

interface IUser {
    name: string;
}
const User = class extends React.Component<IUser> {
    public static defaultProps: IUser = {name: "Foo"}
    public render() {
        return <div>{this.props.name}</div>;
    }
} as React.ComponentClass<Partial<IUser>>;
React.createElement(User, {}); // no error, will output "<div>Foo</div>"

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

// tslint:disable-next-line:no-shadowed-variable
const User = class User extends React.Component<IUser>

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

рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдпрд╣ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╣реИ рдХрд┐ рдЯреАрдПрд╕ 2.8 рдХреЗ рд░реВрдк рдореЗрдВ, Exclude рдкреНрд░рдХрд╛рд░ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддреМрд░ рдкрд░ рд╕рдорд░реНрдерд┐рдд рд╣реИ:

type Omit<T, K> = Pick<T, Exclude<keyof T, K>>;

https://github.com/Microsoft/TypeScript/pull/21847 рджреЗрдЦреЗрдВред

рддреЛ рд╣рдореЗрдВ рдХреЗрд╡рд▓ React.createElement() рдХреЗ рд▓рд┐рдП Props рдХреЗ рдмрджрд▓реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

Omit<Props, keyof DefaultProps>

рдПрдХрдорд╛рддреНрд░ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд░рд┐рдПрдХреНрдЯ рдШреЛрд╖рдгрд╛рдУрдВ рдореЗрдВ, рдХреЛрдИ DefaultProps рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИ - рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдпрд╛ рддреЛ рддреАрд╕рд░реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдпрд╛ рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдерд┐рд░ рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЗрд╕ рдмреАрдЪ, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ:

/**
 * The Create type allow components to implement a strongly thed create() function
 * that alows the caller to omit props with defaults even though the component expects
 * all props to be populated. The TypeScript React typings do not natively support these.
 */
export type Create<C extends BaseComponent<any, any>, D extends {} = {}> = (
  props?: typeHelpers.ObjectDiff<C['props'], D> & React.ClassAttributes<C>,
  ...children: React.ReactNode[]
) => React.ComponentElement<any, any>;

export interface DomPropsType {
  domProps?: domProps.DomProps;
}

export class BaseComponent<P, S = {}> extends React.Component<P & DomPropsType, S> {
  static create(props?: object, ...children: React.ReactNode[]) {
    return React.createElement(this, props, ...children);
  }

  constructor(props: P & DomPropsType, context?: any) {
  ...
}

рдФрд░ рд╣рдорд╛рд░реЗ рд╕рднреА рдШрдЯрдХ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреЗ рд╣реИрдВ:

export class InsertObjectMenu extends BaseComponent<Props, State> {
  static create: Create<InsertObjectMenu, typeof InsertObjectMenu.defaultProps>;
  static defaultProps = {
    promptForImageUpload: true,
  };
  ...
}

рдЕрдВрдд рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд▓рд┐рдВрдЯ рдирд┐рдпрдо рд╣реИ рдЬреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдХрд┐ create рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕рднреА рдШрдЯрдХреЛрдВ рдкрд░ рдШреЛрд╖рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред рд╣рдо JSX рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:

InsertObjectMenu.create({...})

рдЗрд╕рдХреЗ рдмрдЬрд╛рдп React.createElement() ред

рд╣рдо рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рдмрдбрд╝реЗ рдХреЛрдбрдмреЗрд╕ рдореЗрдВ рд▓рдЧрднрдЧ рдПрдХ рд╕рд╛рд▓ рд╕реЗ рдЕрдЪреНрдЫреА рд╕рдлрд▓рддрд╛ рдХреЗ рд╕рд╛рде рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо JSX рдХреЛ рдЕрдкрдирд╛рдирд╛ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗ рдФрд░ рдпрд╣реА рд╣рдореЗрдВ рдкреАрдЫреЗ рдЦреАрдВрдЪ рд░рд╣рд╛ рд╣реИред

рдЗрд╕ "рд╕рд╛рдзрд╛рд░рдг рдореБрджреНрджреЗ" рдореЗрдВ рдЗрддрдирд╛ рд╕рдордп рд▓рдЧрд╛рдпрд╛ред рдореИрдВ рдЗрд╕реЗ рдпрд╣рд╛рдБ рдЫреЛрдбрд╝рддрд╛ рд╣реВрдБ https://medium.com/@martin_hotell/ultimate -react-component-patterns-with-typescript-2-8-82990c516935

    interface Component<P = {}, S = {}, DP extends Partial<P>=P> extends ComponentLifecycle<P, S> { }
    class Component<P, S, DP extends Partial<P> = P> {
        constructor(props: P & DP, context?: any);

        // We MUST keep setState() as a unified signature because it allows proper checking of the method return type.
        // See: https://github.com/DefinitelyTyped/DefinitelyTyped/issues/18365#issuecomment-351013257
        // Also, the ` | S` allows intellisense to not be dumbisense
        setState<K extends keyof S>(
            state: ((prevState: Readonly<S>, props: P) => (Pick<S, K> | S | null)) | (Pick<S, K> | S | null),
            callback?: () => void
        ): void;

        forceUpdate(callBack?: () => void): void;
        render(): ReactNode;

        // React.Props<T> is now deprecated, which means that the `children`
        // property is not available on `P` by default, even though you can
        // always pass children as variadic arguments to `createElement`.
        // In the future, if we can define its call signature conditionally
        // on the existence of `children` in `P`, then we should  remove this.
        private __externalProps: Readonly<{ children?: ReactNode }> & Readonly<P>;
        props: Readonly<{ children?: ReactNode }> & Readonly<P> & DP;
        state: Readonly<S>;
        context: any;
        refs: {
            [key: string]: ReactInstance
        };
    }

    class PureComponent<P = {}, S = {}, DP extends Partial<P>=P> extends Component<P, S, P> { }


interface ElementAttributesProperty { __externalProps: {}; }

рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ рдХреЛ рдзреНрдпрд╛рди рд╕реЗ рджреЗрдЦреЗрдВред

рдЗрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╕рд╛рде рд╣рдо рдХрд░ рд╕рдХрддреЗ рдереЗ

interface Props {
    a: string
    b?: string
    c?: string
}

class Comp extends React.Component<Props, {}, typeof Comp.defaultProps> {
    static defaultProps = {
        b: ''
    }

    render() {
        const {a, b, c} = this.props

        let res = a.concat(b)  // ok
        let res1 = a.concat(c) //fail

        return null
    }
}



const res1= <Comp a=''/> // ok
const res3 = <Comp /> // fail

static defaultProps рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рд╣рдо рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдХреМрди рд╕рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдпрджрд┐ рд╣рдо typeof Comp.defaultProps рдХреЛ рдЫреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ ts рдЪреЗрдХрд░ рдХреЛ рдмрджрд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП)ред
рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╣рд╛ рдЧрдпрд╛ рдерд╛ - рдПрдЪрдУрд╕реА, рдЯрд╛рдЗрдк рдХрд╛рд╕реНрдЯред

https://medium.com/@martin_hotell/ultimate -react-component-patterns-with-typescript-2-8-82990c516935 рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдореЗрд░рд╛ (рдмрд╣реБрдд рдмрджрд╕реВрд░рдд) рдкреНрд░рдпрд╛рд╕ рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

type ExtractProps<T> = T extends React.ComponentType<infer Q> ? Q : never;
type ExtractDefaultProps<T> = T extends { defaultProps?: infer Q } ? Q : never;
type RequiredProps<P, DP> = Pick<P, Exclude<keyof P, keyof DP>>;
type RequiredAndPartialDefaultProps<RP, DP> = Required<RP> & Partial<DP>;

type ComponentTypeWithDefaultProps<T> =
  React.ComponentType<
    RequiredAndPartialDefaultProps<
      RequiredProps<ExtractProps<T>, ExtractDefaultProps<T>>,
      ExtractDefaultProps<T>
    >
  >;

function withDefaultProps<T extends React.ComponentType<any>>(Comp: T) {
  return Comp as ComponentTypeWithDefaultProps<T>;
}
interface IProps {
  required: number;
  defaulted: number;
}

class Foo extends React.Component<IProps> {
  public static defaultProps = {
    defaulted: 0,
  };
}

// Whichever way you prefer... The former does not require a function call
const FooWithDefaultProps = Foo as ComponentTypeWithDefaultProps<typeof Foo>;
const FooWithDefaultProps = withDefaultProps(Foo);

const f1 = <FooWithDefaultProps />;  // error: missing 'required' prop
const f2 = <FooWithDefaultProps defaulted={0} />;  // error: missing 'required' prop
const f3 = <FooWithDefaultProps required={0} />;  // ok
const f4 = <FooWithDefaultProps required={0} defaulted={0} />;  // ok

@decademoon , рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ @types/react рдкрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣реИ рдирд╛? рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ, рдЕрдЧрд░ рд╣рдо рдЖрдкрдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рд╕рд╛рдорд╛рдиреНрдп React.ComponentType рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рдЕрдЧрд░ рдРрд╕рд╛ рд╣реИ, рддреЛ рд╢рд╛рдпрдж рдЖрдк рдкреАрдЖрд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ?

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

interface IProps {
  required: number;
  notRequired?: () => void;
  defaulted: number;
}

class Foo extends React.Component<IProps> {
  public static defaultProps = {
    defaulted: 0,
  };
}

рдореИрдВрдиреЗ рдЗрд╕реЗ "рдЖрд╡рд╢реНрдпрдХ" рдХреЗ рд╕рд╛рде "рдЖрд░рдкреА" рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ RequiredAndPartialDefaultProps рдкреНрд░рдХрд╛рд░ рдХреЛ рдмрджрд▓рдХрд░ рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИред

type RequiredAndPartialDefaultProps<RP, DP> = RP & Partial<DP>;

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

рд╣реЗрд▓реЛ рд╕рдм рд▓реЛрдЧред рдмрд╕ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдФрд░ рдпрджрд┐ рдЖрдк рдЕрднреА рднреА рдЗрд╕ рдзрд╛рдЧреЗ рдХреЛ рдкрдврд╝ рд░рд╣реЗ рд╣реИрдВ: рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @JoshuaToenyes рдиреЗ рд╕рдмрд╕реЗ рд╕рд╛рд░реНрдердХ рдФрд░ рдЙрдкрдпреЛрдЧреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА рд╣реИред рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХреЛрдИ рдореБрджреНрджрд╛ рдирд╣реАрдВ рд╣реИ рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЗрд╕рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдХреЗ рджрд╛рд╡реЗ рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВред

@toiletpatrol рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, @decademoon рдХрд╛ рд╕рдорд╛рдзрд╛рди (рдореЗрд░реЗ рдорд╛рдореВрд▓реА рд╕рдВрд╢реЛрдзрди рдХреЗ рд╕рд╛рде) рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░реЛрдк рдХреЛ рдареАрдХ рд╕реЗ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИред рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рднреА рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛ рдорд╛рдирдХ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдбреАрдЯреА рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╡рд┐рд▓рдп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

@toiletpatrol @RobRendell рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЗрд╕реЗ https://github.com/Microsoft/TypeScript/issues/23812 рджреЗрдЦрд╛?

@vkrol рдореИрдВрдиреЗ рдЗрд╕реЗ рджреЗрдЦрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдирдИ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд░рд┐рд▓реАрдЬ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд┐рдП рдмрд┐рдирд╛ рдЕрднреА рдЕрдкрдиреЗ рдХреЛрдбрдмреЗрд╕ рдореЗрдВ рджрд╢рдХрдореВрди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реВрдВред

рдПрдХ рдФрд░ рд╕рдорд╛рдзрд╛рди рдЬреЛ рдореИрдВ рдЕрднреА рдореБрд╢реНрдХрд┐рд▓ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:

const restWithDefaults = { ...Component.defaultProps, ...rest };
return <Component {...restWithDefaults} />;

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рдХреБрдЫ рднреА рдЧрд▓рдд рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдпрд╣рд╛рдВ рдПрдХ рдЧрдВрджреЗ рд▓реЗрдХрд┐рди рд╕рд░рд▓ рдХрд╛рдордХрд╛рдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдЫреЛрдбрд╝ рд░рд╣рд╛ рд╣реВрдВред

TS 3.2 рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ 16.7 рдЯрд╛рдЗрдкрд┐рдВрдЧ рдЗрд╕реЗ рдареАрдХ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдХреНрдпрд╛ рд╣рдо рдмрдВрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

@Hotell рдЕрдВрддрддрдГ рдЗрд╕реЗ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? рдореИрдВ рдЕрднреА рднреА рдЗрд╕реЗ рдареАрдХ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рдкрд╛ рд░рд╣рд╛ рд╣реВрдВ

рджреВрд╕рд░реЛрдВ рдХреЛ рдХреБрдЫ рд╕рдордп рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ 3 рдХреЗ рд░рд┐рд▓реАрдЬ рдиреЛрдЯреНрд╕ рдХрд╛ рд▓рд┐рдВрдХ рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
JSX рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯрдкреНрд░реЙрдкреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди

@cbergmiller рдореБрдЭреЗ рдбрд░ рд╣реИ рдХрд┐ рд╡реЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ 3.1 рдХреЗ рд▓рд┐рдП рд░рд┐рд▓реАрдЬрд╝ рдиреЛрдЯ рд╣реИрдВ

рдЕрднреА рднреА React.FunctionComponent . рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ

@denieler рдореИрдВ defaultProps рдХреЗ рд╕рд╛рде React.FunctionComponent рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рдирд╣реАрдВ рджреВрдВрдЧрд╛, рдпрд╣ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рдирд╣реАрдВ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдлрд╝рдВрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ:

interface HelloProps {
  name?: string;
  surname?: string;
}

const HelloComponent: React.FunctionComponent<HelloProps> = ({
  name = 'John',
  surname = 'Smith',
}) => {
  return <div>Hello, {name} {surname}!</div>
};

@mgol рдпрджрд┐ рдореИрдВ рдкреНрд░реЙрдкреНрд╕ рдХреЛ рдирд╖реНрдЯ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛, рддреЛ рдЖрдк рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдлрд╝рдВрдХреНрд╢рди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдХреИрд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВрдЧреЗ?
рдореИрдВ рдХреЗрд╡рд▓ "рдбрд┐рдлрд╝реЙрд▓реНрдЯ" рдЧреБрдгреЛрдВ рдХреЛ рдирд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВ рдЬреИрд╕реЗ:

interface HelloProps {
  name?: string;
  surname?: string;
}

const HelloComponent: React.FunctionComponent<HelloProps> = ({
  name = 'John',
  surname = 'Smith',
  ...props
}) => {
  return <div>Hello, {name} {surname}! You are {props.age} years old.</div>
};

рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдХреЗрд╡рд▓ рдХреБрдЫ рдкреНрд░реЙрдкреНрд╕ рдирд┐рдХрд╛рд▓рдирд╛ рд╢рд░реНрдордирд╛рдХ рд▓рдЧрддрд╛ рд╣реИред

@gleceter рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

HelloComponent.defaultProps = {
    name: 'John',
    surname: 'Smith'
}

@Glinkis рдХреГрдкрдпрд╛, https://github.com/reactjs/rfcs/pull/107/files#diff -20b9b769068a185d90c23b58a2095a9dR184 рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред

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

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

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

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

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

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

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

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