рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЧреБрдг рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рдЦреНрдд рдирд▓рдЪреЗрдХ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
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 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)
рддреАрди рд╕рдВрднрд╛рд╡рд┐рдд рдбрд╛рдЙрдирд╕рд╛рдЗрдбреНрд╕ (рдЬреЛ рдореИрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВ):
props
рд╕рдВрдкрддреНрддрд┐ рд╕реЗ рдЕрдиреБрдорд╛рди рдкрд░ рднрд░реЛрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред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
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рднреА рдереЛрдбрд╝рд╛ рдЬрд╛рджреБрдИ рд▓рдЧрддрд╛ рд╣реИ рдЬрдмрдХрд┐ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдпрд╣ рд╕рднреА рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдирд╖реНрдЯ рдХрд░ рджреЗрддрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдкреНрд░рдХрд╛рд░ рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯрдкреНрд░реЙрдк рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ, рддреЛ рдореИрдВ рд╕рднреА рдХрд╛рди рд╣реВрдВред рд╣рдо рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ: