Typescript: рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдШрдЯрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдШрдЯрдХ рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 4 рдордИ 2019  ┬╖  16рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: microsoft/TypeScript

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдВрд╕реНрдХрд░рдг: 3.4.5

рдЦреЛрдЬ рд╢рдмреНрдж:
рдбрд┐рдлреЙрд▓реНрдЯ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░реЙрдкрд░ рдбрд┐рдлреЙрд▓реНрдЯрдкреНрд░реЙрдкреНрд╕ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдШрдЯрдХ рд╕реНрдЯреЗрдЯрд▓реЗрд╕ рд╣реИ

рдХреЛрдб

import React from "react";

interface Props {
  name: string;
  optional: string;
}

const Component = ({ name, optional = "default" }: Props) => (
  <p>{name + " " + optional}</p>
);

const Test = () => <Component name="test" />;

рдЕрдкреЗрдХреНрд╖рд┐рддреН рд╡реНрдпрд╡рд╣рд╛рд░:
рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ 3.0 рд░рд┐рд▓реАрдЬрд╝ рдиреЛрдЯреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ , optional рдкреНрд░реЛрдк Test рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ ES2015 рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЖрд░рдВрднреАрдХрд░рдг рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Component рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░:
рдирд┐рдореНрди рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рд╣реИ:

рд╕рдВрдкрддреНрддрд┐ 'рд╡реИрдХрд▓реНрдкрд┐рдХ' рдЯрд╛рдЗрдк рдореЗрдВ рдЧрд╛рдпрдм рд╣реИ '{рдирд╛рдо: рд╕реНрдЯреНрд░рд┐рдВрдЧ; } 'рд▓реЗрдХрд┐рди' рдкреНрд░реЙрдкреНрд╕ 'рдЯрд╛рдЗрдк рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рд▓рд┐рдВрдХ:
рд╕рдВрдкрд░реНрдХ
рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди TSX рдХреЛ рд╕рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИред

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

27425 рд╣реИ

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

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ 3.1 рдпрд╛ рдЙрд╕рд╕реЗ рдЕрдзрд┐рдХ рдХреЗ рд╕рд╛рде рдЖрдкрдХреЛ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:

export interface Props {
    name: string;
}

function Greet(props: Props) {
    return <div>Hello {props.name.toUpperCase()}!</div>;
}
Greet.defaultProps = {
  name: "world",
} as Partial<Props>; // Good practice, without it you could use a number as default prop and TypeScript wouldn't complainтАж

const component = <Greet />; // no errors

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

рдЗрд╕ рдкрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЕрдкрдиреЗ Props рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рд╡реИрдХрд▓реНрдкрд┐рдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

interface Props {
    name: string;
    optional?: string;
}

рдпрд╣ рдкреНрд░рддреАрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рдХрд┐ рд░рд┐рд▓реАрдЬ рдиреЛрдЯ рдХреНрдпрд╛ рдХрд╣рддреЗ рд╣реИрдВ:

export interface Props {
    name: string;
}

// ...

function Greet({ name = "world" }: Props) {
    return <div>Hello {name.toUpperCase()}!</div>;
}

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

рдЙрджрд╛рд╣рд░рдг:

const wrapper = shallow(<Test/>);

// optional is string | undefined instead of string
const optional = wrapper
        .find(Component)
        .props()
        .optional;

рдпрджрд┐ optional рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдерд╛, рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ рдореМрдЬреВрдж рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ onClick рдкреНрд░реЛрдк рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╕рд┐рд░реНрдл preventDefault рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ 3.1 рдпрд╛ рдЙрд╕рд╕реЗ рдЕрдзрд┐рдХ рдХреЗ рд╕рд╛рде рдЖрдкрдХреЛ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:

export interface Props {
    name: string;
}

function Greet(props: Props) {
    return <div>Hello {props.name.toUpperCase()}!</div>;
}
Greet.defaultProps = {
  name: "world",
} as Partial<Props>; // Good practice, without it you could use a number as default prop and TypeScript wouldn't complainтАж

const component = <Greet />; // no errors

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

@tbassetto рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ TS рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:

import React from 'react';

interface Props {
  myProp: string;
}

const Comp = (props: Props) => {
  return (
    <div>
      {props.myProp.toUpperCase()}
    </div>
  );
};

Comp.defaultProps = {

} as Pick<Props, 'myProp'>;

const comp = <Comp />;

рджреВрд╕рд░реА рдХрд╖реНрдЯрдкреНрд░рдж рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдпрд╣ рдкрд╣рд▓реА рдмрд╛рд░ рдХрд░рдирд╛ рд╣реИ: рдпрджрд┐ рдореИрдВ Comp React.FC<Props> рдЯрд╛рдЗрдк рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ defaultProps рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреНрдп рд╕рдорд╕реНрдпрд╛рдПрдВ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИрдВ ред

рд╕рдм рд╕рдм рдореЗрдВ, рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрд╢рдВрд╕ JSX / React рдХрд╛ рд╕рдорд░реНрдерди рдЕрднреА рдПрдХ рдЕрдЬреАрдм рдирд╣реАрдВ-рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ (рдХрдо рд╕реЗ рдХрдо рдореЗрд░реА рдЖрдБрдЦреЛрдВ рдореЗрдВ - рдореБрдЦреНрдп рд░реВрдк рд╕реЗ, рдореБрдЭреЗ рдХреЛрдИ рдареЛрд╕ рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ рд╡рд░реНрддрдорд╛рди рдореЗрдВ 3.4.5 рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рддрд░реАрдХреЗ рд╕реЗ рд╕реНрдЯреЗрдЯрд▓реЗрд╕ рд░рд┐рдПрдХреНрдЯ рдШрдЯрдХреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП "рдЖрдзрд┐рдХрд╛рд░рд┐рдХ" рддрд░реАрдХрд╛ рдХреНрдпрд╛ рд╣реИ, рдЗрд╕ рдкрд░ рдиреЛрдЯреНрд╕)ред

рд╣рд╛рд▓рд╛рдБрдХрд┐ рдореИрдВ рд╣рд░ рдХрд┐рд╕реА рдХреЛ рдЪрд╛рд░реЛрдВ рдУрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реБрдП рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБ, рдлрд┐рд░ рднреА рдореИрдВ рдЙрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреЛ рднреА рдХрд╛рдо рдореЗрдВ рд▓реЗрдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рд╣реВрдБред

рдореИрдВ рей.рей.рей рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рд╣реВрдБ

export interface Props {
  shouldTruncateContent: boolean;
}

const Alert: React.FunctionComponent<Props> = ({
  children,
  shouldTruncateContent = false
}) => {
  return (
        <S.Content shouldTruncateContent={shouldTruncateContent} size="fill">
          {children}
        </S.Content>
  );
};

Alert.defaultProps = {
  shouldTruncateContent: false
} as Pick<Props, 'shouldTruncateContent'>;

export default Alert;

рдХрд┐рд╕реА рдХреЛ рднреА рдХреНрдпреЛрдВ рдпрд╣ рдЕрднреА рднреА рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрддрд╛ рдореЗрдВ рдХреЛрдИ рдЕрдВрддрд░реНрджреГрд╖реНрдЯрд┐ рд╣реИ

TS2741: Property 'shouldTruncateContent' is missing in type '{ children: string; }' but required in type 'Props'.

рдореИрдВрдиреЗ # 27425 рдФрд░ # 519 рдореЗрдВ рднреА рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рднреА рд╕реБрдзрд╛рд░реЛрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИред

@tomspeak рдпрд╛ рддреЛ рдореЗрд░рд╛ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдпрд╛ @Hotell рдХрд╛ рд╡рд░реНрдЬрди рд╣реИ (рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпрд╣ рд╕рднреА рдХреЛ

рд╣рд╛рд▓рд╛рдБрдХрд┐ рдореИрдВ рд╣рд░ рдХрд┐рд╕реА рдХреЛ рдЪрд╛рд░реЛрдВ рдУрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реБрдП рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБ, рдлрд┐рд░ рднреА рдореИрдВ рдЙрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреЛ рднреА рдХрд╛рдо рдореЗрдВ рд▓реЗрдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рд╣реВрдБред

рдореИрдВ рей.рей.рей рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рд╣реВрдБ

export interface Props {
  shouldTruncateContent: boolean;
}

const Alert: React.FunctionComponent<Props> = ({
  children,
  shouldTruncateContent = false
}) => {
  return (
        <S.Content shouldTruncateContent={shouldTruncateContent} size="fill">
          {children}
        </S.Content>
  );
};

Alert.defaultProps = {
  shouldTruncateContent: false
} as Pick<Props, 'shouldTruncateContent'>;

export default Alert;

рдХрд┐рд╕реА рдХреЛ рднреА рдХреНрдпреЛрдВ рдпрд╣ рдЕрднреА рднреА рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрддрд╛ рдореЗрдВ рдХреЛрдИ рдЕрдВрддрд░реНрджреГрд╖реНрдЯрд┐ рд╣реИ

TS2741: Property 'shouldTruncateContent' is missing in type '{ children: string; }' but required in type 'Props'.

рдореИрдВрдиреЗ # 27425 рдФрд░ # 519 рдореЗрдВ рднреА рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рднреА рд╕реБрдзрд╛рд░реЛрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИред

рдЖрдкрдХреЛ рдмрд╕ рдмрдирд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ TruncateContent: рдмреВрд▓рд┐рдпрди; рд╡реИрдХрд▓реНрдкрд┐рдХ shouldTruncateContent?: boolean;

рдЗрд╕ рдкрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЕрдкрдиреЗ Props рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рд╡реИрдХрд▓реНрдкрд┐рдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

interface Props {
    name: string;
    optional?: string;
}

рдореИрдВ рд╣рд░ рдЬрдЧрд╣ рдЗрд╕ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдХреНрдпреЛрдВ рдЧрд┐рд░рд╛ рд╡реЛрдЯ? рдХреЛрдИ рд╕рдордЭрд╛ рд╕рдХрддрд╛ рд╣реИ?

@ralexhassle , рдореИрдВ рдиреАрдЪреЗ рдХреЗ рд╡реЛрдЯреЛрдВ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рд╕рдордЭрд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдШрдЯрдХ рдХреА рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рдВрдкрддреНрддрд┐ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕рд╣реА рддрд░реАрдХрд╛ рд╣реИред
рдЖрдк defaultProps рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрд╣рд╛рдБ рддрдХ рдореЗрд░рд╛ рд╕рд╡рд╛рд▓ рд╣реИ, рд╡реИрдХрд▓реНрдкрд┐рдХ рдЧреБрдгреЛрдВ рдХреЛ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡рддрдГ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдареАрдХ рд╣реИ ...

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

@RyanCavanaugh рдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрдВрдж рдХреНрдпреЛрдВ рдХрд┐рдпрд╛ рд╣реИ?

рд╢рд╛рдпрдж рдореИрдВ рдЗрд╕реЗ рдпрд╛рдж рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЗ рдмрд╛рд╡рдЬреВрдж рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬрд╡рд╛рдм рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИ?

PS: рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ v4 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

рдЖрдк рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣рд╛рдВ рдкреНрд░реЙрдкреНрд╕ рдореЗрдВ рдЧреБрдг рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ рдФрд░ рдЖрдЧреЗ рдШрдЯрдХ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

interface Props {
  children: ReactNode;
  properties?: Record<string, unknown>;
}

const defaultProps: Props = {
  children: '',
  properties: {
    marginTop: 32,
    marginLeft: 0,
    marginBottom: 8,
    marginRight: 0,
  },
};

const RadioListLabel: React.FC<Props> = ({
  children,
  properties = defaultProps.properties,
}) => (
  <View
    margin={[
properties ? properties.marginTop : 0
        properties ? properties.marginLeft : 0
        properties ? properties.marginBottom : 0
        properties ? properties.marginRight : 0
      ]}
  >
    <Text size="m" variant="heading2" lineHeight="body">
      {children}
    </Text>
  </View>
  )

@lakhmeranikita рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдПрдХ рдкреНрд░реЛрдк рдкреНрд░рдХрд╛рд░ рдХреЛ рд╡реИрдХрд▓реНрдкрд┐рдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдирд╛ рд╣реИред

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

import React from "react";

type DefaultProps = { optionalProp: number };
type Props = {
  requiredProp: "some_string" | "other_string";
} & DefaultProps;

export const BaseComponent = (props: Props) => {
  const { requiredProp, optionalProp } = props;
  return (
    <div>
      {requiredProp} {optionalProp}
    </div>
  );
};

BaseComponent.defaultProps = {
  optionalProp: 0,
} as Partial<DefaultProps>;

const comp = <BaseComponent requiredProp="some_string" />;

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