Angular: рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд░реВрдкреЛрдВ рдХреЛ рджреГрдврд╝рддрд╛ рд╕реЗ рдЯрд╛рдЗрдк рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

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

[x] feature request
  • рдХреЛрдгреАрдп рд╕рдВрд╕реНрдХрд░рдг: 2

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд░реВрдкреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЬрдЯрд┐рд▓ рд░реВрдкреЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдирд┐рдпрдВрддреНрд░рдг рдХреЗ valueChanges Observable<any> , рдЬреЛ рдЬрдЯрд┐рд▓ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдЪреНрдЫреА рдкреНрд░рдерд╛рдУрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╣реИрдВред

рджреГрдврд╝рддрд╛ рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдкреНрд░рдкрддреНрд░ рдирд┐рдпрдВрддреНрд░рдг рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

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

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

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

рд╕рдВрдмрдВрдзрд┐рдд #11279

рдпрд╣ #11279 рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИред

рдХреГрдкрдпрд╛ рдмрддрд╛рдПрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИ?
рдЖрдк рдХреНрдпрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╕рд╛рд░ рдирд┐рдпрдВрддреНрд░рдг рд╕рд╛рдорд╛рдиреНрдп рдЕрдзрд┐рдХрд╛рд░ рд╣реЛ? рдпрд╣реА рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ valueChanges рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ Observable<any> рдирд╣реАрдВ рд╣реИ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХрд╛ рдХреЛрдИ рдЕрдиреНрдп рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ #5404 рдкреВрдЫ рд░рд╣рд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ #11279 . рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ
рдпрджрд┐ рдХреЛрдИ рдЕрдиреНрдп рддрд░реАрдХрд╛ рд╣реИ рддреЛ рдЗрд╕реЗ AbstractControl рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдмрдирд╛рдП рдмрд┐рдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреГрдкрдпрд╛ рдЗрд╕реЗ рд╕рдордЭрд╛рдПрдВред

## get<Type> рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬреИрд╕рд╛ рдХрд┐ #11279 рдореЗрдВ рд╣реИ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЧрд▓рдд рд╕рдорд╛рдзрд╛рди рд╣реИред рдпрджрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЬрд╛рд╡рд╛ рдЕрдирдмрд╛рдЙрдВрдбреЗрдб рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдЬреИрд╕рд╛ рдХреБрдЫ рд╣реЛрддрд╛, рддреЛ get рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛, рди рдХрд┐ any ред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЦрд╛рд▓реА рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдХреБрдЫ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ?

https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-1.html keyof ред рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ 2.1 рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рджреГрдврд╝рддрд╛ рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдкреНрд░рдкрддреНрд░ рдирд┐рдпрдВрддреНрд░рдгреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛ рд╕рдХрддреА рд╣реИрдВред

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

рдореИрдВрдиреЗ рдЕрднреА рджреЗрдЦрд╛ рдХрд┐ TS 2.2 (https://github.com/Microsoft/TypeScript/wiki/Roadmap#22-February-2017) рдореЗрдВ рдЙрдиреНрд╣реЛрдВрдиреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЬреЗрдиреЗрд░рд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдИ рд╣реИ (https://github.com/Microsoft/TypeScript/ рдореБрджреНрджреЛрдВ/2175) рдПрдХ рдмрд╛рд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдлрд┐рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо AbstractControl рдХреЛ AbstractControl<T = any> рддрд░рд╣ рд╕рд╛рдорд╛рдиреНрдп рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ T рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ valueChanges рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рдорд╛рди рдЬреЛ рдПрдХ Observable<T> ред рдЗрд╕реЗ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдЧрд╛ рд▓реЗрдХрд┐рди рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЬреЗрдирд░рд┐рдХ рдХреЗ рд╕рд╛рде, рдЬрдм рддрдХ рдХрд┐ рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдЧрд▓рдд рдирд╣реАрдВ рд╕рдордЭрддрд╛, рдпрд╣ рдПрдХ рдмреНрд░реЗрдХрд┐рдВрдЧ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рдЗрд╕ рдкрд░ рдЫреЛрдЯрд╛ рдЕрдкрдбреЗрдЯ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЬреЗрдирд░рд┐рдХ рдХреЛ TS2.3 рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рддреЛ рд╕рдВрд╕реНрдХрд░рдг 4.0 рдХреЗ рд╕рд╛рде рдХреЛрдгреАрдп рджреНрд╡рд╛рд░рд╛ рдЯреАрдПрд╕ 2.1 рдХреЗ рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдпрд╣ рдЙрд╕рдХреЗ рдмрд╛рдж рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╡реЗ рдЯреАрдПрд╕ 2.3 рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВ, рдЬреЛ рдЕрдм рд╣реИ рдЬрдм рд╣рдореЗрдВ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

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

@desfero #16707 рдкрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдмрд┐рд▓реНрдб рдХреЛ TS2.3 рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд┐рдпрд╛ рдЬрд╛рдП

+1 рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рджреЗрдЦрдирд╛ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗред рдХреЛрдИ рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ?

16828

рд╡рд░реНрддрдорд╛рди рдореЗрдВ https://github.com/Microsoft/TypeScript/issues/16229 рдкрд░ рдЕрд╡рд░реБрджреНрдз рд╣реИ

рдЗрд╕ рдкрд░ рдЫреЛрдЯрд╛ рдЕрдкрдбреЗрдЯ:
рдпрд╣рд╛рдБ рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдЕрдиреБрд╕рд╛рд░: https://github.com/angular/angular/pull/16828#issuecomment -337034655
рд╡рд░реНрддрдорд╛рди рдкреНрд░рдкрддреНрд░ API рдореЗрдВ рдЬреЗрдирд░рд┐рдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рддреЛрдбрд╝реЗ рдмрд┐рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред
рддреЛ рдпрд╛ рддреЛ рдмреНрд░реЗрдХрд┐рдВрдЧ рдмрджрд▓рд╛рд╡ рдХреА рдЬрд░реВрд░рдд рд╣реИ
рдпрд╛ рдПрдХ рдкреВрд░реНрдг рд░реВрдк рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛

рддреЛ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдореЗрд░реА рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдЧрд▓рдд рдереАред
рдореИрдВ рдЗрд╕реЗ рдореМрдЬреВрджрд╛ рдлреЙрд░реНрдо рдПрдкреАрдЖрдИ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдпрд╣рд╛рдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ #20040

@Toxicable рдЬрд┐рд╕рдореЗрдВ рдЕрднреА рднреА рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд░рд┐рдлреИрдХреНрдЯрд░ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреА рдХрдореА рдХреА рд╕рдорд╕реНрдпрд╛ рд╣реИред get('person') рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рддреАрдХ рдХрд╛ рд╣реА рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг, @rpbeukes рд╕реЗ , рдореВрд▓ рд░реВрдк рд╕реЗ рд╡рд╕реНрддреБ рдкреНрд░рддреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд░реЗрдЯреНрд░реЛрдлрд┐рдЯреЗрдб рддрд░реАрдХрд╛ рд╣реИред get(obj.person) рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ред рдЗрд╕реЗ рдХреЗрд╡рд▓ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рд░рдЦрдиреЗ рдкрд░ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреА рдЬрд╛рдПрдЧреАред

@howiemp

get('person') рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реНрд╡рдпрдВ рдкреНрд░рддреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЖрдкрдХрд╛ рдЗрд╕рд╕реЗ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ, рдЖрдк рдпрд╣рд╛рдБ рдХрд┐рд╕ рдкреНрд░рддреАрдХ рдХреА рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ?
рдореЗрд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЖрдк рдХреБрдЫ рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

let g = new FormGroup({
  'name': new FormControl('Toxicable'),
  'age': new FormControl(22),
})

g.get('name') //AbstractControl<string>
g.get('age') //AbstractControl<number>

рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ (obj.person) рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ

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

@Toxicable рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдмрджрд▓рд╛рд╡ рдХрд╛ рдорддрд▓рдм рдЪреАрдЬреЛрдВ рдХреЛ рдирд╣реАрдВ рддреЛрдбрд╝рдирд╛ рд╣реИ, рди рдХрд┐ рдЖрдкрдХреЗ рд╕рдорд╛рдзрд╛рди рдХреА рдЖрд▓реЛрдЪрдирд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ред рдЕрдиреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди (рд░реЗрдЯреНрд░реЛрдлрд┐рдЯреЗрдб) рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдмрдЬрд╛рдп рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдлрд╝реАрд▓реНрдб рдХреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдХреЗ, рдпрджрд┐ рд╡рд╣ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдирд╛рдо рдмрджрд▓рддрд╛ рд╣реИ, рддреЛ рдмреНрд░реЗрдХ рдмрдирд╛рддрд╛ рд╣реИ, рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдореИрдВ рд╕рднреА g.get('name') рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рдирд╣реАрдВ рдмрджрд▓рддрд╛, рддреЛ рдлрд╝реАрд▓реНрдб рдирд╛рдо рдХреЛ 'рдирд╛рдо' рд╕реЗ 'рдлрд░реНрд╕реНрдЯрдирд╛рдо' рдореЗрдВ рдмрджрд▓рдирд╛ рдЯреВрдЯ рдЬрд╛рдПрдЧрд╛ред рдЕрдЧрд░ рдореИрдВ рдХреБрдЫ рдРрд╕рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ

class PersonDetails {
  name: string;
  age: number;
}
let g = new FormGroup<PersonDetails>({
  name: new FormControl('Toxicable'),
  age: new FormControl(22),
})

g.get(name) //AbstractControl<string>
g.get(age) //AbstractControl<number>

рд╡реЗ рд╕рднреА рдХрдбрд╝реЗ рд╕рдВрджрд░реНрдн рд╣реЛрдВрдЧреЗред рд░реЗрдЯреНрд░реЛрдлрд┐рдЯ рд╕реЙрд▓реНрдпреВрд╢рди рдЗрд╕реЗ рдереЛрдбрд╝реЗ рд╣реИрдХреА рддрд░реАрдХреЗ рд╕реЗ рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЙрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рднреА рд╣рд▓ рдХрд░рддрд╛ рд╣реИред

@ рдкреАрдЖрд░ рдХреЗ рд▓рд┐рдП

рдореИрдВ @howiempt рд╕реЗ рд╕рд╣рдордд

g.get(x => x.name) //AbstractControl

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

рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдЬрд╛рд░реА рд░рдЦреЗрдВ рдФрд░ рддреНрд╡рд░рд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

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

рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрддрд╛ рдХрд┐ рд░рд┐рдЯрд░реНрди рдЯрд╛рдЗрдк рд╕реЗрдЯ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ "рджреГрдврд╝рддрд╛ рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЧрдпрд╛" рд╣реИ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдзреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд╣реА рджрд┐рд╢рд╛ рдореЗрдВ рдПрдХ рдХрджрдо рд╣реИред

рдирдорд╕реНрддреЗ, рдореИрдВрдиреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП https://github.com/Quramy/ngx-typed-forms рдЬрд╛рд░реА рдХрд┐рдпрд╛ рд╣реИред рдХреГрдкрдпрд╛ рдЗрд╕реЗ рджреЗрдЦреЗрдВ

@Quramy рдореИрдВрдиреЗ рдХрдИ рд╕рдкреНрддрд╛рд╣ рдкрд╣рд▓реЗ рдЖрдкрдХреЗ рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдереА рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдореБрдЭреЗ рдпрд╛рдж рд╣реИ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкреНрд░рд╡рд░реНрддрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ :(

+1ред рдЬрдм рдореИрдВ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рдорд╛рддреНрд░рд╛ рдХреА рдЧрдгрдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред

рд╡реИрд╕рд╛ рд╣реАред
рдХреЛрдгреАрдп рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд░реВрдк рдПрдХ рдРрд╕реА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдврд╛рдВрдЪреЗ рдХреЛ рдорд╛рдд рджреЗрддреА рд╣реИред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд░реВрдкреЛрдВ рдХреЛ рджреГрдврд╝рддрд╛ рд╕реЗ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рд╕реЗ рдпрд╣ рдЕрдЧрд▓реЗ рд╕реНрддрд░ рдкрд░ рдЖ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛ рдХреЗ рдЕрдВрддрд░ рдХреЛ рдФрд░ рдЪреМрдбрд╝рд╛ рдХрд░ рджреЗрдЧрд╛ :)

рдпрд╣ рд╕рд╢рд░реНрдд рдореИрдк рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░реЛрдВ рдФрд░ рд░рд┐рдХрд░реНрд╕рди рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ..... рд╕рд╢рд░реНрдд рдореИрдк рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдХреЗрд╡рд▓ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╡рд┐рд▓рдп рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЕрдЧрд░ рдЗрд╕реЗ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдордЬрдмреВрдд рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдлреЙрд░реНрдо рдХреЛ рд╕рдВрднрд╡ рдмрдирд╛рдиреЗ рдХрд╛ рдореМрдХрд╛ рд╣реИ

рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ (

@Quramy рд╕рдорд╛рдзрд╛рди рджреБрдЦ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рд╕рднреА рддрд░реНрдХреЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ FormBuilder рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╕рд╛рде рд╣реА рд╕рд╛рдорд╛рдиреНрдп FormGroup<T> , FormControll<T> рдФрд░ FormArray<T> рд╕реАрдзреЗ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдХреЗрд╡рд▓ рдРрд╕реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рд╣реИрдВ рдЬреЛ AbtractControl<T> рд╡рд┐рд╕реНрддрд╛рд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╣рдорд╛рд░реА рд╡рд░реНрддрдорд╛рди рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рдерд╛ред

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

+1 рдпрд╣ рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ ..

рдпрдерд╛рд╢реАрдШреНрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП)

рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЗрд╕реЗ рдХреЛрдбрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ

рдЗрд╕ рдУрдкрди рд╕реЛрд░реНрд╕ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ (AGPL) рдореЗрдВ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ

https://github.com/concentricsky/badgr-ui/blob/master/src/app/common/util/typed-forms.ts

рдореИрдВрдиреЗ рдЗрд╕реЗ рдЕрд╕реНрдерд╛рдпреА рдХрд╛рдордХрд╛рдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛:
рдЖрд╢рд╛ рд╣реИ рдпреЗ рдорджрдж рдХрд░реЗрдЧрд╛

import { FormControl, AbstractControl } from "@angular/forms";
export class NumberControl extends FormControl{
    _value: Number;
    get value(){ 
        return this._value;
    }
    set value(value){
        this._value = Number(value);
    }
}

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

рдореИрдВрдиреЗ рдлреЙрд░реНрдордмрд┐рд▓реНрдбрд░ рд╕реНрддрд░ рдкрд░ рдмрд╕ рдПрдХ рдХрд╕реНрдЯрдо рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдмрдирд╛рдпрд╛ рд╣реИ:

import { Injectable } from '@angular/core';
import { FormBuilder, FormGroup } from '@angular/forms';
type ExtraProperties = { [key: string]: any } | null;
interface IModelConstructor { new(...args: any[]): any }

@Injectable({
    providedIn: 'root'
})
export class TypedFormBuilder {
    array = this.formBuilder.array;
    control = this.formBuilder.control;
    group = this.formBuilder.group;

    constructor(private formBuilder: FormBuilder) {}

    typedGroup<TGroupModel extends object>(ModelType: IModelConstructor, extraProps?: ExtraProperties): FormGroup & TGroupModel {
        const formGroup: any = this.group({
            ...new ModelType(),
            ...extraProps
        });

        return new Proxy<FormGroup & TGroupModel>(formGroup, {
            get: (target: FormGroup & TGroupModel, propName: string | number | symbol) => {
                if (propName in target) {
                    return target[propName];
                } else {
                    const property = target.get(propName as string);
                    return property && property.value;
                }
            },
            set: (target: FormGroup & TGroupModel, propName: string | number | symbol, value: any, _: any) => {
                if (propName in target) {
                    target[propName] = value;
                } else {
                    target.setValue({ [propName]: value });
                }

                return true;
            }
        });
    }
}

рдпрд╣ рд╕рдорд╛рдзрд╛рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕реБрдкрд░ рдкреЙрд▓рд┐рд╢ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╢рд╛рдпрдж рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдлреЙрд░реНрдордЧреНрд░реБрдк рдиреЗ рдХрд┐рд╕реА рд╕рдВрдкрддреНрддрд┐ рдкрд░ рдореВрд▓реНрдпреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рд╛рдкреНрдд рдХреА рд╣реЛ (рдЬреИрд╕реЗ рдХрд┐ myGroup.fields, рдЬрд╣рд╛рдВ "рдлрд╝реАрд▓реНрдб" рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛)ред рд▓реЗрдХрд┐рди рдпрд╣ рдордЬрдмреВрдд рдЯрд╛рдЗрдкрд┐рдВрдЧ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдкреНрд░рдпреЗрд╛рдЧ рдХреЗ рд▓рд┐рдП:

generateFormGroup() {
    this.theGroup = builder.typedGroup<MyModel>(MyModel);
    this.theGroup.someProperty = 5;
}

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

рд▓реЗрдХрд┐рди рдореИрдВ рдЪрд░реНрдЪрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЕрдЧрд░ рдЬреЗрдирд░рд┐рдХ рдХреЛ рдореМрдЬреВрджрд╛ рдПрдкреАрдЖрдИ рдкрд░ рд░рдЦрдирд╛ рд╕рд╣реА рдирд┐рд░реНрдгрдп рд╣реИред рд╕рднреА рдкреНрд░рдкрддреНрд░ рдирд┐рдпрдВрддреНрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╕рдордп, рдореБрдЭреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХрд┐рдирд╛рд░реЗ рдХреЗ рдорд╛рдорд▓реЗ рдФрд░ рдРрд╕реА рдЪреАрдЬреЗрдВ рдорд┐рд▓реАрдВ рдЬреЛ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╕рдВрднрд╡ рдпрд╛ рдмреЛрдЭрд┐рд▓ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрд╕ рд╕рдордп рд╕реНрдерд┐рд░ рдЯрд╛рдЗрдкрд┐рдВрдЧ рд╕рдВрднрд╡ рдирд╣реАрдВ рдереА рдФрд░ рдЗрд╕рд▓рд┐рдП рд╕рдмрд╕реЗ рдмрдбрд╝реА рдЪрд┐рдВрддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдирд╣реАрдВ рдереАред
рдЕрдлрд╕реЛрд╕ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рдпрд╣ AbstractControl#value рд╕рд╛рде рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде DeepPartial<T> рдпрд╛ AbstractControl#get рдЬреИрд╕рд╛ рдХреБрдЫ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдкреАрдЫреЗ рдХреА рдУрд░ рд╕рдВрдЧрдд рд╣реЛрдиреЗ рд╕реЗ any рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЧрд┐рд░рд╛рд╡рдЯ рдХреЗ рдХрд╛рд░рдг рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рднреА рдЦреЛ рдЬрд╛рддреА рд╣реИред
рд╢рд╛рдпрдж рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд░реВрдкреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдП рдПрдкреАрдЖрдИ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рднреА рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ?

рддреЛ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдорд╛рдзрд╛рди рд╣реЛрдиреЗ рдкрд░ рдореИрдВрдиреЗ рдпрд╣реА рдХрд┐рдпрд╛ред

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

import { FormGroup } from '@angular/forms';

export class FormGroupTyped<T> extends FormGroup {
  public get value(): T {
    return this.value;
  }
}

рдФрд░ рдлрд┐рд░ рдореИрдВ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ

import { FormGroupTyped } from 'path/to/your/form-group-typed.model';

interface IAuthForm {
  email: string;
  password: string;
}

const authForm: FormGroupTyped<IAuthForm> = fb.group({
  email: ['', [Validators.required]],
  password: ['', [Validators.required]],
});

const formValues: IAuthForm = this.authForm.value;
const email: string = formValues.email; 
const invalidKeyVar: string = formValues.badBoy; // [ts] Property 'badBoy' does not exist on type 'IAuthForm'. [2339]
const invalidTypeVar: number = formValues.password; // [ts] Type 'string' is not assignable to type 'number'. [2322]

@Toxicable Lol рдЗрд╕ рд╕рдЯреАрдХ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЦреЛрдЬ рд░рд╣рд╛ рдерд╛! рд╣рд╛рд╣рд╛

@cafesanu рдпрд╣рд╛рдВ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреА рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдлреЙрд░реНрдордЧреНрд░реБрдк рдХрд╛ рдереЛрдбрд╝рд╛ рд╕реБрдзрд╛рд░ рд╣реИред

import { AbstractControl, AbstractControlOptions, AsyncValidatorFn, FormGroup, ValidatorFn } from '@angular/forms';

export class FormGroupTyped<T> extends FormGroup {
  readonly value: T;
  readonly valueChanges: Observable<T>;

  constructor(controls: { [key in keyof T]: AbstractControl; },
              validatorOrOpts?: ValidatorFn | Array<ValidatorFn> | AbstractControlOptions | null,
              asyncValidator?: AsyncValidatorFn | Array<AsyncValidatorFn> | null) {
    super(controls, validatorOrOpts, asyncValidator);
  }

  patchValue(value: Partial<T> | T, options?: {
    onlySelf?: boolean;
    emitEvent?: boolean;
  }): void {
    super.patchValue(value, options);
  }

  get(path: Array<Extract<keyof T, string>> | Extract<keyof T, string>): AbstractControl | never {
    return super.get(path);
  }
}

рдЙрдкрдпреЛрдЧ:

export class SearchModel {
  criteria: string;
}

const searchForm = new FormGroupTyped<SearchModel >({
  criteria: new FormControl('', Validators.required) // OK
  badBoy: new FormControl('', Validators.required)  // TS2345: Object┬аliteral┬аmay┬аonly┬аspecify┬аknown┬аproperties,┬аand┬а'badBoy'┬аdoes┬аnot┬аexist┬аin┬аtype┬а'{┬аcriteria:┬аAbstractControl;┬а}'.
});

рдореИрдВрдиреЗ FromControl рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЖрд╡рд░рдг рд▓рд┐рдЦрд╛ рд╣реИ рдЬреЛ рдПрдХ рдмрд┐рд▓реНрдбрд░ рдХреЛ рдХреЙрд▓ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдбреЗрдЯрд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ: https://github.com/concentricsky/badgr-ui/blob/develop/src/app/common/util/ typed-forms.ts

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

рдореИрдВ рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рдХреЛрдгреАрдп рдореЗрдВ рдРрд╕рд╛ рдХреБрдЫ рджреЗрдЦрдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред

рдЙрдкрдпреЛрдЧ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

// Create a typed form whose type is dynamically constructed by the builder calls
const group = new TypedFormGroup()
    .add("firstName", typedControl("", Validators.required))
    .add("lastName", typedControl("", Validators.required))
    .add(
        "address",
        typedGroup()
            .add("street", typedControl("2557 Kincaid"))
            .add("city", typedControl("Eugene"))
            .add("zip", typedControl("97405"))
    )
    .addArray(
        "items",
        typedGroup()
            .addControl("itemName", "")
            .addControl("itemId", 0)
    )
;

// All these are type checked:
group.value.address.street.trim();
group.controls.firstName.value;
group.untypedControls.firstName.value;
group.value.items[0].itemId;

рд╣рд╛рдп рд╕рдм рдкрд┐рдЫрд▓реЗ 3 рджрд┐рдиреЛрдВ рдореЗрдВ рдореИрдВ рдПрдХ d.ts gist рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди/рд╕рдорд╛рдзрд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

//BASIC TYPES DEFINED IN @angular/forms + rxjs/Observable
type FormGroup = import("@angular/forms").FormGroup;
type FormArray = import("@angular/forms").FormArray;
type FormControl = import("@angular/forms").FormControl;
type AbstractControl = import("@angular/forms").AbstractControl;
type Observable<T> = import("rxjs").Observable<T>;

type STATUS = "VALID" | "INVALID" | "PENDING" | "DISABLED"; //<- I don't know why Angular Team doesn't define it https://github.com/angular/angular/blob/7.2.7/packages/forms/src/model.ts#L15-L45)
type STATUSs = STATUS | string; //<- string is added only becouse Angular base class use string insted of union type https://github.com/angular/angular/blob/7.2.7/packages/forms/src/model.ts#L196)

//OVVERRIDE TYPES WITH STRICT TYPED INTERFACES + SOME TYPE TRICKS TO COMPOSE INTERFACE (https://github.com/Microsoft/TypeScript/issues/16936)
interface AbstractControlTyped<T> extends AbstractControl {
  // BASE PROPS AND METHODS COMMON TO ALL FormControl/FormGroup/FormArray
  readonly value: T;
  valueChanges: Observable<T>;
  readonly status: STATUSs;
  statusChanges: Observable<STATUS>;
  get<V = unknown>(path: Array<string | number> | string): AbstractControlTyped<V> | null;
  setValue<V>(value: V extends T ? V : never, options?: { onlySelf?: boolean; emitEvent?: boolean }): void;
  patchValue<V>(value: V extends Partial<T> ? V : never, options?: { onlySelf?: boolean; emitEvent?: boolean }): void;
  reset<V>(value?: V extends Partial<T> ? V : never, options?: { onlySelf?: boolean; emitEvent?: boolean }): void;
}

interface FormControlTyped<T> extends FormControl {
  // COPIED FROM AbstractControlTyped<T> BECOUSE TS NOT SUPPORT MULPILE extends FormControl, AbstractControlTyped<T>
  readonly value: T;
  valueChanges: Observable<T>;
  readonly status: STATUSs;
  statusChanges: Observable<STATUS>;
  get<V = unknown>(path: Array<string | number> | string): AbstractControlTyped<V> | null;
  setValue<V>(value: V extends T ? V : never, options?: { onlySelf?: boolean; emitEvent?: boolean }): void;
  patchValue<V>(value: V extends Partial<T> ? V : never, options?: { onlySelf?: boolean; emitEvent?: boolean }): void;
  reset<V>(value?: V extends Partial<T> ? V : never, options?: { onlySelf?: boolean; emitEvent?: boolean }): void;
}
interface FormGroupTyped<T> extends FormGroup {
  // PROPS AND METHODS SPECIFIC OF FormGroup
  //controls: { [P in keyof T | string]: AbstractControlTyped<P extends keyof T ? T[P] : any> };
  controls: { [P in keyof T]: AbstractControlTyped<T[P]> };
  registerControl<P extends keyof T>(name: P, control: AbstractControlTyped<T[P]>): AbstractControlTyped<T[P]>;
  registerControl<V = any>(name: string, control: AbstractControlTyped<V>): AbstractControlTyped<V>;
  addControl<P extends keyof T>(name: P, control: AbstractControlTyped<T[P]>): void;
  addControl<V = any>(name: string, control: AbstractControlTyped<V>): void;
  removeControl(name: keyof T): void;
  removeControl(name: string): void;
  setControl<P extends keyof T>(name: P, control: AbstractControlTyped<T[P]>): void;
  setControl<V = any>(name: string, control: AbstractControlTyped<V>): void;
  contains(name: keyof T): boolean;
  contains(name: string): boolean;
  get<P extends keyof T>(path: P): AbstractControlTyped<T[P]>;
  getRawValue(): T & { [disabledProp in string | number]: any };
  // COPIED FROM AbstractControlTyped<T> BECOUSE TS NOT SUPPORT MULPILE extends FormGroup, AbstractControlTyped<T>
  readonly value: T;
  valueChanges: Observable<T>;
  readonly status: STATUSs;
  statusChanges: Observable<STATUS>;
  get<V = unknown>(path: Array<string | number> | string): AbstractControlTyped<V> | null;
  setValue<V>(value: V extends T ? V : never, options?: { onlySelf?: boolean; emitEvent?: boolean }): void;
  patchValue<V>(value: V extends Partial<T> ? V : never, options?: { onlySelf?: boolean; emitEvent?: boolean }): void;
  reset<V>(value?: V extends Partial<T> ? V : never, options?: { onlySelf?: boolean; emitEvent?: boolean }): void;
}

interface FormArrayTyped<T> extends FormArray {
  // PROPS AND METHODS SPECIFIC OF FormGroup
  controls: AbstractControlTyped<T>[];
  at(index: number): AbstractControlTyped<T>;
  push<V = T>(ctrl: AbstractControlTyped<V>): void;
  insert<V = T>(index: number, control: AbstractControlTyped<V>): void;
  setControl<V = T>(index: number, control: AbstractControlTyped<V>): void;
  getRawValue(): T[];
  // COPIED FROM AbstractControlTyped<T[]> BECOUSE TS NOT SUPPORT MULPILE extends FormArray, AbastractControlTyped<T[]>
  readonly value: T[];
  valueChanges: Observable<T[]>;
  readonly status: STATUSs;
  statusChanges: Observable<STATUS>;
  get<V = unknown>(path: Array<string | number> | string): AbstractControlTyped<V> | null;
  setValue<V>(value: V extends T[] ? V : never, options?: { onlySelf?: boolean; emitEvent?: boolean }): void;
  patchValue<V>(value: V extends Partial<T>[] ? V : never, options?: { onlySelf?: boolean; emitEvent?: boolean }): void;
  reset<V>(value?: V extends Partial<T>[] ? V : never, options?: { onlySelf?: boolean; emitEvent?: boolean }): void;
}

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

рдЗрд╕ рдЯреНрд╡рд┐рдЯрд░ рдереНрд░реЗрдб рдкрд░ рдореИрдВ рдХреБрдЫ "рднрд╡рд┐рд╖реНрдп рдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ" (V8+ рдХреЗ рдмрд╛рдж) рдХреЗ @IgorMinar рдХреЗ рд╕рд╛рде рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛

рдХрд┐рд╕реА рднреА рдЯрд┐рдкреНрдкрдгреА, рд╕реБрдЭрд╛рд╡ рдФрд░ рдорджрдж рдХрд╛ рдмрд╣реБрдд рд╕реНрд╡рд╛рдЧрдд рд╣реИ !

рдореЗрд░рд╛ рд╕рдорд╛рдзрд╛рди @ng-stack/forms рдХрд╣рд▓рд╛рддрд╛ рд╣реИред рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдкреНрд░рдкрддреНрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╣реИред

рддреЛ, рдЖрдкрдХреЗ рдШрдЯрдХреЛрдВ рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ:

get userName() {
  return this.formGroup.get('userName') as FormControl;
}

get addresses() {
  return this.formGroup.get('addresses') as FormGroup;
}

рдЕрдм рдпрд╣ рдХрд░рдирд╛:

// Note here form model UserForm
formGroup: FormGroup<UserForm>;

get userName() {
  return this.formGroup.get('userName');
}

get addresses() {
  return this.formGroup.get('addresses');
}

рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП @ng-stack/forms рджреЗрдЦреЗрдВ

рдЕрд░реЗ, рд╣рдо рд╣рд╛рд▓ рд╣реА рдореЗрдВ 2 рдЪреАрдЬреЛрдВ рдкрд░ @zakhenry рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ:

  • рдкреНрд░рдкрддреНрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реБрдзрд╛рд░
  • рдЙрдк рдкреНрд░рдкрддреНрд░реЛрдВ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдореЗрдВ рд╕реБрдзрд╛рд░ (рдЙрдк рдШрдЯрдХреЛрдВ рдХреЗ рднреАрддрд░)

рд╣рдо @dmorosinotto рдХреЗ рд╕рднреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдХрд╡рд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ рд╕реБрд░рдХреНрд╖рд╛ рд╣реИ рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд░рд┐рдлреИрдХреНрдЯрд░ рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж

рдЕрдЧрд░ рдХреЛрдИ lib рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ: ngx-sub-form

рдирдорд╕реНрддреЗ @ maxime1992 рдореИрдВрдиреЗ Controls<T> рд▓реЗрдХрд┐рди рдпрд╣ AbstractControl to <T[K]> рд╕рдЦреНрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ
рдХреНрдпрд╛ рдореИрдВ рдЖрдкрд╕реЗ рдкреВрдЫ рд╕рдХрддрд╛ рд╣реВрдБ рдХреНрдпреЛрдВ? рдХреНрдпрд╛ рдЖрдк рдЗрд╕реЗ "рдЕрдирдЯрд╛рдЗрдкреНрдб" рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдлреЙрд░реНрдордХрдВрдЯреНрд░реЛрд▓ рдФрд░ рд╢рд╛рдпрдж рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдФрд░ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрдХрдВрдЯреНрд░реЛрд▓ рдпрд╛ рд░рдЬрд┐рд╕реНрдЯрд░рдХрдВрдЯреНрд░реЛрд▓ рд╡рд┐рдзрд┐рдпреЛрдВ рдЬреИрд╕реЗ рдХреБрдЫ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░рди-рдЯрд╛рдЗрдо рдкрд░ рдкреНрд░рдХрд╛рд░ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдорд╣рд╕реВрд╕ рд╣реЛрддреА рд╣реИ?
рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░рд╛ TypedForms.d.ts рдереЛрдбрд╝рд╛ рд╕рдЦреНрдд рд╣реИ рдФрд░ AbstractControlTyped to the type T<P> "рдмрд▓" рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рдкрд╕рдВрдж рдХреЗ рд╕рд╛рде рдХреБрдЫ рдРрд╕рд╛ рд▓рд╛рдЧреВ/рдЕрдХреНрд╖рдо рдХрд░реЗрдВ рдЬреЛ рдореВрд▓ ReactiveForms API рдореЗрдВ рдЕрдиреБрдордд рд╣реИ рдФрд░ рд╢рд╛рдпрдж рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреЛрдИ рдЖ...

рдХреЛрдИ рд╕реЛрдЪ? рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдорд╛рдорд▓рд╛?
рдЗрд╕ рдкрд░ рдХреЛрдИ рднреА рдЯрд┐рдкреНрдкрдгреА рдореБрдЭреЗ рдпрд╣ рддрдп рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддреА рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЬреЛ рдкрд░рд┐рднрд╛рд╖рд╛рдПрдВ рдмрдирд╛рдИ рд╣реИрдВ рдФрд░ рдЬрд┐рд╕ рдкреАрдЖрд░ рдкрд░ рдореИрдВ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЙрд╕реЗ рдХреИрд╕реЗ рдмрджрд▓рд╛ рдЬрд╛рдП ...
рдзрдиреНрдпрд╡рд╛рдж

рдкреАрдПрд╕: рдПрдирдЬреАрдПрдХреНрд╕-рд╕рдм-рдлреЙрд░реНрдо рдкрд░ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рд╕рдмрдлреЙрд░реНрдо рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП ControlValueAccessor рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рднреА рдкреНрд░рдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛

@ рдПрдирдЬреА-рд╕реНрдЯреИрдХ/рдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╕рдорд░реНрдерди рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╕рддреНрдпрд╛рдкрдиред

рдХрдХреНрд╖рд╛рдПрдВ FormControl , FormGroup , FormArray рдФрд░ FormBuilder рд╕рднреА рддрд░реАрдХреЗ
рдЬреЗрдиреЗрд░рд┐рдХ рдХреЗ рд▓рд┐рдП рджреВрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ "рддреНрд░реБрдЯрд┐ рд╕рддреНрдпрд╛рдкрди рдореЙрдбрд▓" рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ:

class ValidationModel {
  someErrorCode: { returnedValue: 123 };
}
const control = new FormControl<string, ValidationModel>('some value');
control.getError('someErrorCode'); // OK
control.errors.someErrorCode; // OK
control.getError('notExistingErrorCode'); // Error: Argument of type '"notExistingErrorCode"' is not...
control.errors.notExistingErrorCode; // Error: Property 'notExistingErrorCode' does not exist...

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ ValidatorsModel рдирд╛рдордХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

const control = new FormControl('some value');
control.getError('required'); // OK
control.getError('email'); // OK
control.errors.required // OK
control.errors.email // OK
control.getError('notExistingErrorCode'); // Error: Argument of type '"notExistingErrorCode"' is not...
control.errors.notExistingErrorCode // Error: Property 'notExistingErrorCode' does not exist...

ValidatorsModel рдореЗрдВ typeof Validators рд╕реЗ рдирд┐рдХрд╛рд▓реА рдЧрдИ рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рдФрд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

class ValidatorsModel {
  min: { min: { min: number; actual: number } };
  max: { max: { max: number; actual: number } };
  required: { required: true };
  requiredTrue: { required: true };
  email: { email: true };
  minLength: { minlength: { requiredLength: number; actualLength: number } };
  maxLength: { requiredLength: number; actualLength: number };
  pattern: { requiredPattern: string; actualValue: string };
}

@dmorosinotto рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж рд▓реЗрдХрд┐рди рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реВрдБ
Validators.compose([Validators.required, Validators.maxLength(20), Validators.minLength(3)])

рд╣рд╛рдп @youssefsharif рдХреНрдпрд╛ рдЖрдк рдореБрдЭреЗ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рджреЗ рд╕рдХрддреЗ рд╣реИрдВ? .d.ts рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдкрдХреЛ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐/рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдкрддрд╛ рдЪрд▓рд╛?

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

@ng-stack/forms рд▓рд┐рдП input[type="file"] рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд

рд╕реНрдЯреИрдХрдмреНрд▓рд┐рдЯреНрдЬ рдкрд░ рднреА

рдореИрдВрдиреЗ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП FormData рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде "рдХреНрд▓рд╛рд╕рд┐рдХ" рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдХрдИ рд▓рд╛рдн рд╣реИрдВ:

  • рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдлреЙрд░реНрдо рдЗрдирдкреБрдЯ рдирд╛рдо рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП <input type="file" name="someName"> -> formControl.value someName рдлрд╝реАрд▓реНрдб рдирд╛рдо рдХреЗ рд╕рд╛рде;
  • рдлрд╝реАрд▓реНрдб рдирд╛рдо рдХреЛ рдареАрдХ рд╕реЗ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде multiple рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВ (рдпрд╣рд╛рдВ userpic[] рдиреЛрдЯ рдХрд░реЗрдВ)
<input type="file" multiple name="userpic" [formControl]="formControl">

```ts
formData.append('userpic[]', myFileInput.files[0]);
formData.append('userpic[]', myFileInput.files[1]);

- `Validators` have four static methods for files
```ts
import { Validators } from '@ng-stack/forms';

Validators.fileRequired;
Validators.fileMaxSize(1024);
Validators.filesMaxLength(10);
Validators.filesMinLength(2);

@KostyaTretyak рдореИрдВрдиреЗ рдЕрдм рддрдХ рдЖрдкрдХреЗ рдкреИрдХреЗрдЬ рдХреЛ рдЬреЛ рджреЗрдЦрд╛ рд╣реИ, рд╡рд╣

рд╣рдо рд▓рдЧрднрдЧ рдХреЛрдгреАрдп 8 рдореЗрдВ рд╣реИрдВ рдФрд░ рдЕрднреА рднреА 100% рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдХреЛрдИ рдЖрдЙрдЯ-рдСрдл-рдж-рдмреЙрдХреНрд╕ рдЯрд╛рдЗрдк рдирд╣реАрдВ рд╣реИ рдЬреЛ рдореБрдЭреЗ рдмрд╣реБрдд рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИред

@kroeder , рдореИрдВ рд╕рд┐рд░реНрдл рдпрд╣ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореБрджреНрджрд╛ рджреЛ рд╕рд╛рд▓ рд╕реЗ рдЕрдзрд┐рдХ рдкрд╣рд▓реЗ (рд▓рдЧрднрдЧ рдХреЛрдгреАрдп 2 рдХреЗ рд░рд┐рд▓реАрдЬ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж) рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕реА рддрд░рд╣ рдХрд╛ рдкреБрд▓ рдЕрдиреБрд░реЛрдз 1.5 рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдмрд┐рдирд╛ рдорд░реНрдЬ рдХреЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ ...

рд▓реЗрдХрд┐рди рдЕрдЧрд░ @ng-stack/forms рд▓реЛрдХрдкреНрд░рд┐рдп рдФрд░ рдХреЛрдгреАрдп 8+ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реЛрдЧрд╛, рддреЛ рд╢рд╛рдпрдж рдореИрдВ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдмрдирд╛рдЙрдВрдЧрд╛ред

@KostyaTretyak рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИ :) рдореИрдВ https://github.com/no0x9d/ngx-strongly-typed-forms рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрд┐рд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдЗрд╕ рдереНрд░реЗрдб рдореЗрдВ рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ @no0x9d рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЖрдкрдХреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА

@ZNS , рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛, рд▓реЗрдХрд┐рди рдПрдХ рддреНрд╡рд░рд┐рдд рд╕рдореАрдХреНрд╖рд╛ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ ngx-strongly-typed-forms рдореЗрдВ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИ, рд╕рд╛рде рд╣реА рдлрд╝реЙрд░реНрдо рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ

@ZNS @KostyaTretyak рдирдорд╕реНрддреЗред рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдореИрдВ ngx-рджреГрдврд╝рддрд╛ рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рд░реВрдкреЛрдВ рдХрд╛ рд▓реЗрдЦрдХ
рдореИрдВрдиреЗ @ng-stack/forms рдХреЗ рдлреАрдЪрд░ рд╕реЗрдЯ рдХреА рддреНрд╡рд░рд┐рдд рд╕рдореАрдХреНрд╖рд╛ рдХреА рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдЫреЛрдЯреЗ рдЕрдВрддрд░ рд╣реИрдВред

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

рдкреНрд░рддреНрдпрдХреНрд╖ рддреБрд▓рдирд╛ рдореЗрдВ рдореЗрд░реЗ рдкрд╛рд╕ ValidationModel рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ FormGroups рдФрд░ Arrays рд╕реЗ FormArrays рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдмрдирд╛рдиреЗ рдФрд░ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рддрд░реНрдХ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП AbstractControl#get рдХреБрдЫ рд╡рд┐рдЪрд╛рд░реЛрдВ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд┐рдпрд╛ рд╣реИред

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

+1 рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рджреЗрдЦрдирд╛ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗред рдХреЛрдИ рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ?

рдХреЛрдгреАрдп рдЯреАрдо рдХреЗ рд▓рд┐рдП рдЯрдХреНрдХрд░?

рдЙрдиреНрд╣реЗрдВ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИред рдЙрдирдХрд╛ рдЕрдкрдирд╛ рдмреИрдХрд▓реЙрдЧ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд▓рд╛рдареА рдФрд░ рднрдпрд╛рдирдХ-5%-рдХрдореА-рдмрдВрдбрд▓-рдЖрдХрд╛рд░ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВред

@ рд▓реЛрдирд▓реА-рд▓реЛрдХрд▓реА

рдЙрдиреНрд╣реЗрдВ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИред

рдЖрд▓реЛрдЪрдирд╛ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдХреНрдпрд╛ рдЖрдк рдЕрдиреНрдп рджреЗрд╡реЛрдВ рдХреА рдЕрдзрд┐рдХ рдкрд░рд╡рд╛рд╣ рдХрд░рддреЗ рд╣реИрдВ?
рдлрд╝реЙрд░реНрдо рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рдЖрдкрд╕реЗ рдХреЛрдИ рдкреАрдЖрд░ рдирд╣реАрдВ рджреЗрдЦрд╛ рдФрд░ рди рд╣реА рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рд░рдЪрдирд╛рддреНрдордХ рдЯрд┐рдкреНрдкрдгреА рдпрд╛ рдЪреАрдЬреЛрдВ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд░рдПрдлрд╕реА рджреЗрдЦрд╛ :man_shrugging:

рдЙрдирдХрд╛ рдЕрдкрдирд╛ рдмреИрдХрд▓реЙрдЧ рд╣реИ

рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ :рднрдпрднреАрдд :!
рд▓реЛрдЧ рдЙрди рдЪреАрдЬрд╝реЛрдВ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рдирдХреА рдХрдВрдкрдиреА _[рдЙрдиреНрд╣реЗрдВ рднреБрдЧрддрд╛рди рдХрд░ рд░рд╣реА рд╣реИ]_ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ?
рдХрд┐рддрдиреА рд╢рд░реНрдо рдХреА рдмрд╛рдд рд╣реИ!
image

рднрдпрд╛рдирдХ-5%-рдХрдореА-рдмрдВрдбрд▓-рдЖрдХрд╛рд░ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВред

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

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

рдЕрдм рдореИрдВ рдЗрд╕ рдмрд╣рд╕ рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛ рдЧрдпрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЧреИрд░-рдЙрддреНрдкрд╛рджрдХ рдЪреАрдЬреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЗрд╕ рдзрд╛рдЧреЗ рдкрд░ рдПрдХрд╛рдзрд┐рдХрд╛рд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ред *рдЙрдбрд╝ рдЬрд╛рдирд╛*

@ рдореИрдХреНрд╕рд┐рдореЗ-рдПрд▓реЗрдХреНрд╕
рдХрдИ рдЕрдиреНрдп рдкреАрдЖрд░ рд╣реИрдВ (рдЕрднреА рддрдХ 386), рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдФрд░ рдХреБрдЫ рдмрджрд▓реЗрдЧрд╛?
рдЗрд╕ рдореБрджреНрджреЗ рдХреА рдмрд╛рдд рдХрд░реЗрдВ рддреЛ, рдпрд╣ рд╕рдВрдмрдВрдзрд┐рдд рдкреАрдЖрд░ (https://github.com/angular/angular/pull/20040) рдЕрднреА рднреА рд╡рд┐рд▓рдп рдирд╣реАрдВ рд╣реБрдЖ рд╣реИред

рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдХреА рдмрд╛рдд рдХрд░реЗрдВ рддреЛ рдЖрдЗрд╡реА рдХрд╛ рдЬрд┐рдХреНрд░ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рднреА рдЗрд▓рд╛рдЬ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдореБрдЦ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореИрдВ рдпрд╣ рджреЗрдЦрдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЬрд┐рддрдиреЗ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдиреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдлрд┐рдХреНрд╕ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред
https://github.com/angular/angular/issues?utf8=%E2%9C%93&q=is%3Aissue+is%3Aopen+sort%3Areactions-%2B1-desc

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

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

рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдП рдЧрдП рдХреБрдЫ рдЕрдиреНрдп рдореБрджреНрджреЛрдВ рдореЗрдВ рдХрд┐рд╕реА рднреА рд╕рдВрдкрддреНрддрд┐ рдкрд░ рдЕрдкрдбреЗрдЯ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдФрд░ рдПрдХ рд╕реЗрд╡рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рдпрдВрддреНрд░рдг рдХреЛ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реВрдк рд╕реЗ рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ (рдмрдЬрд╛рдп asyncValidator )ред рдЖрдк #31963 рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ!

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдерд╛ , рдореИрдВрдиреЗ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдмрдирд╛рдпрд╛ред рдЗрд╕ рдкреАрдЖрд░ рдореЗрдВ @ng-stack/forms рдлреАрдЪрд░ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ (рдмрд┐рдирд╛: рд╕рддреНрдпрд╛рдкрди, рдСрдЯреЛ рдбрд┐рдЯреЗрдХреНрдЯ рдлреЙрд░реНрдо рдХрдВрдЯреНрд░реЛрд▓ рдФрд░ рд╕рдкреЛрд░реНрдЯ рдЗрдирдкреБрдЯ [рдлрд╛рдЗрд▓])ред

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

рдУрд╣!!!!! рдирд┐рдХрд▓ рд░рд╣рд╛ рд╣реИ!

рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рдЦрдмрд░ рд╣реИ, рдПрдВрдЧреБрд▓рд░ рдЯреАрдо, рдереИрдВрдХреНрд╕!
рдЬреИрд╕реЗ рд╣реА рдХреЛрдИ рд░рд┐рд▓реАрдЬрд╝ рд╣реЛрдЧреА, рдореИрдВ angular-typesafe-reactive-forms-helper рдХреЛ рд╣рдЯрд╛

рд╣рд╛рдБ!!!!

рдореИрдВ рдмрд╣реБрдд рдЙрддреНрд╕рд╛рд╣рд┐рдд рд╣реВрдБ!! рдзрдиреНрдпрд╡рд╛рдж, рдХреЛрдгреАрдп рдЯреАрдо !!

рдХреНрдпрд╛ рд╣рдо рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реНрдкреИрдо рдХреЗ рд╕рд╛рде рд░реБрдХ рд╕рдХрддреЗ рд╣реИрдВ?
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЗрдореЛрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ https://github.blog/2016-03-10-add-reactions-to-pull-requests-issues-and-comments/ рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдкреНрд░реЗрдд рд╣реИрдВ - рдзрдиреНрдпрд╡рд╛рджред

рдЬреИрд╕рд╛ рдХрд┐ рдПрдВрдЧреБрд▓рд░ рдЯреАрдо рдиреЗ рджреГрдврд╝рддрд╛ рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рд░рд┐рдПрдХреНрдЯрд┐рд╡ рдлреЙрд░реНрдо рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдкреБрд╖реНрдЯрд┐ рдХреА рд╣реИред рдореИрдВ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЕрдкрдиреЗ рдХрд╛рд░рдгреЛрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рдПрдХ рдЪрд┐рдХрдиреА рд╕реНрдерд┐рд░ рдЯрд╛рдЗрдк рд╡рд┐рдХрд╛рд╕ рдЕрдиреБрднрд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП infer рдкреНрд░рдХрд╛рд░ рдХрд╛

рдкрд╣рд▓рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг: рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реБрдЖ

рдЬрдм рдореИрдВрдиреЗ рдлреЙрд░реНрдордЧреНрд░реБрдк рдбрд┐рдЬрд╛рдЗрди рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛, рдореИрдВрдиреЗ T рд░реВрдк рдореЗрдВ рд╕рд╣рдЬ рдЬреНрдЮрд╛рди рдпреБрдХреНрдд рд╕рд░рд▓ рдорд╛рди рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред

FormGroup<{ id: string, username: string | null }>

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

type User = { id: string, username: string | null }
const table: FormArray<User> = new FormArray([{ id: '0', username: 'gaplo917'}])

const row: FormGroup<User> = table.at(0) as FormGroup<User> // you must do a type cast

// NO way to get type-safe binding in Angular HTML
<input [formControl]="table.at(i).controls.id" />

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

рджреВрд╕рд░рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг: рдХрдВрдЯреНрд░реЛрд▓ рдЯрд╛рдЗрдк рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реБрдЖ

рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реБрдЪрд╛рд░реВ рд░реВрдк рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред рдореИрдВ KeyValueControl рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рд╡рд┐рдЪрд╛рд░ рдЖрдпрд╛ рд╣реВрдВT рдФрд░ KeyValueControl рд╕реЗ рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП infer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдкреБрдирд░рд╛рд╡рд░реНрддреА рд░реВрдк рд╕реЗред

export type KeyValueControl<V> = {
  [key in keyof V]: V[key] & AbstractControl
}

export type InferTypedForm<Type> = Type extends TypedFormControl<infer X>
  ? X
  : Type extends Array<TypedFormControl<infer X1>>
  ? X1[]
  : Type extends Array<TypedFormGroup<infer X2>>
  ? Array<InferTypedFormGroup<X2>>
  : Type extends TypedFormGroup<infer X3>
  ? InferTypedFormGroup<X3>
  : Type extends TypedFormArray<infer X4>
  ? Array<InferTypedForm<X4>>
  : never

export type InferTypedFormGroup<T> = { [key in keyof T]: InferTypedForm<T[key]> }

export type InferTypedFormArray<T> = InferTypedForm<T[]>

export class TypedFormGroup<T extends KeyValueControl<T>> extends FormGroup {
  readonly controls: T
  readonly valueChanges: Observable<InferTypedFormGroup<T>>
  readonly statusChanges: Observable<FormStatus>
  readonly value: InferTypedFormGroup<T>
  ...
}

рдирддреАрдЬрддрди,

interface Foo {
  first: TypedFormControl<string | null>
  last: TypedFormControl<string | null>
}

const table: FormArray<FormGroup<Foo>>

const row: FormGroup<Foo> = table.at(0) // typescript compile OK!

// type-safe binding in Angular HTML, all auto-complete (`id`, `username`) finally works!
<input [formControl]="table.at(0).controls.id" />

рд▓рд╛рдЗрд╡ рдбреЗрдореЛ

Edit gaplo917/angular-typed-form-codesandbox

рд▓рд╛рдЗрд╡ рдбреЗрдореЛ рдЖрдИрдбреАрдИ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ

рдпрд╣ рдПрдХ рдЬрдЯрд┐рд▓ рд░реВрдкреЛрдВ рдореЗрдВ рдПрдХ рд╕рдЪреНрдЪрд╛ рд╕реНрд╡рдд: рдкреВрд░реНрдг рдЕрдиреБрднрд╡ рд╣реИред
Screenshot 2020-06-12 at 19 02 10

рдХреЛрдгреАрдп рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдлреЙрд░реНрдо

рдореМрдЬреВрджрд╛ рд░рд┐рдПрдХреНрдЯрд┐рд╡ рдлреЙрд░реНрдо рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП 100% рд╕рдВрдЧрдд
https://github.com/gaplo917/angular-typed-forms

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

@IgorMinar , рдХреЛрдгреАрдп рдХреЛрд░ рдЯреАрдо , рдФрд░ рдХреЛрдгреАрдп рд╕рдореБрджрд╛рдп рдХреЗ рд╕рджрд╕реНрдп ред

рдпрд╣ рд▓рдВрдмреА рдЯрд┐рдкреНрдкрдгреА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рджреЛ рдмрдпрд╛рдиреЛрдВ рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИ рдЬреЛ рдЯрд┐рдХрдЯ рд▓реЗрдЦрдХ рджреНрд╡рд╛рд░рд╛ " рдкреНрд░рдерд╛рдУрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл " рдФрд░ " рджреГрдврд╝рддрд╛ рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП " рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рд╛ рдЧрдпрд╛ рд╣реИред

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

рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡

рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рд╕рднреА рдУрдУрдкреА рдкреНрд░рдерд╛рдУрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рд╡рд░реНрдЧ рд╣рдореЗрдВ рдХреЛрдб рдХреА рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛рдкрди рдФрд░ рд░рдЦрд░рдЦрд╛рд╡ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдХреБрдЫ рд▓рд╛рдн рдЬреЛ рдореИрдВ рдиреАрдЪреЗ рдмрддрд╛ рд░рд╣рд╛ рд╣реВрдБ:

  1. рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреЛ рдЕрд▓рдЧ рдХрд░реЗрдВред
  2. рд╡рд░реНрддрдорд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЗрдВрдЯрд░рдлрд╝реЗрд╕-рд╕рдВрдЪрд╛рд▓рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рдХреЛрдбред
  3. рд╣рдо рд╕рдВрдкрддреНрддрд┐ рдкрд░ рдХрд╕реНрдЯрдо рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
  4. рдХреЛрдб рдкрдардиреАрдп, рд░рдЦрд░рдЦрд╛рд╡ рдпреЛрдЧреНрдп рдФрд░ рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рд╣реИред
  5. рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, рд╣рдореЗрдВ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЬреИрд╕реЗ рд╣рдо рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рд╢рд░реНрддреЛрдВ рдХреЗ рд╕рд╛рде *ngIf рдбрд╛рд▓ рд░рд╣реЗ рд╣реИрдВред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИрдВред
  6. рдФрд░ рднреА рдмрд╣реБрдд рдХреБрдЫ...

рдореБрдЭреЗ рдЙрдкрд░реНрдпреБрдХреНрдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛрдб рдХреЛ Class рдореЗрдВ рдмрджрд▓рдиреЗ рджреЗрдВ рдФрд░ Class рдЧреБрдгреЛрдВ рдкрд░ рд╕рддреНрдпрд╛рдкрди рдбреЗрдХреЛрд░реЗрдЯрд░ рд▓рд╛рдЧреВ рдХрд░реЗрдВред рдпрд╣рд╛рдВ рд╣рдо рдПрдХрд▓ рдЙрддреНрддрд░рджрд╛рдпрд┐рддреНрд╡ рд╕рд┐рджреНрдзрд╛рдВрдд рдкреНрд░рдерд╛рдУрдВ рдХрд╛ рдкрд╛рд▓рди тАЛтАЛрдХрд░ рд░рд╣реЗ рд╣реИрдВред рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:

image

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

1. рдПрдХ рдлреЙрд░реНрдордЧреНрд░реБрдк рдмрдирд╛рдПрдВ
рдпрд╣рд╛рдБ рд╣рдо рдХрд╛ рдПрдХ рд╣реА рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ FormBuilder рдФрд░ рдХреА рдПрдХ рд╣реА рд╡рд┐рдзрд┐ group ред рд▓реЗрдХрд┐рди рдЖрдпрд╛рдд рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдирд╛рдо рдЕрд▓рдЧ рд╣реЛрдЧрд╛ рдЬреИрд╕реЗ ReactiveTypedFormsModule рдмрдЬрд╛рдп ReactiveFormsModule ред рдЖрдЗрдП рдПрдХ FormGroup рдмрдирд╛рдПрдВ:
image

рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдкреНрд░рд╢реНрди рдЖрддрд╛ рд╣реИ,

рдХреНрдпрд╛ рд╡рд░реНрддрдорд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг ReactiveTypedFormsModule рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХрд╛рдо рдХрд░реЗрдЧрд╛?
рд╣рд╛рдВ, рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛, ReactiveTypedFormsModule рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рд╛ рдЬрд╛рдПрдЧрд╛ред

рдЖрдЗрдП рдЬрд▓реНрджреА рд╕реЗ рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдХреЛ рджреЗрдЦреЗрдВ рдФрд░ рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВред

2. рдлреЙрд░реНрдордХрдВрдЯреНрд░реЛрд▓ рдХрд╛ рдорд╛рди рдмрджрд▓реЗрдВ
setValue рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рд╕реАрдзреЗ Class рд╕рдВрдкрддреНрддрд┐ рдкрд░ рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ FormControl рдорд╛рди рд╕реЗрдЯ рдХрд░ рджреЗрдЧрд╛ред

image

3. рдлреЙрд░реНрдордХрдВрдЯреНрд░реЛрд▓ рдХреЗ рдореВрд▓реНрдп рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ
рдлреЙрд░реНрдордХрдВрдЯреНрд░реЛрд▓ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдиреЗ рдХреЗ рдмрдЬрд╛рдп ValueChanges , рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ setter рд╡рд┐рдзрд┐ рдХреА рд╢рдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

image

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

@toDate() // this will convert the value before assigning the value in 'dob' property.
dob:Date;

4. рдиреЗрд╕реНрдЯреЗрдб рдлреЙрд░реНрдордЧреНрд░реБрдк рдлреЙрд░реНрдордХрдВрдЯреНрд░реЛрд▓ рдХрд╛ рдорд╛рди рдмрджрд▓реЗрдВ
рд╣рдо рдиреЗрд╕реНрдЯреЗрдб рдлреЙрд░реНрдордЧреНрд░реБрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╕рдВрдмрдВрдзрд┐рдд рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рд╕реАрдзреЗ рдореВрд▓реНрдп рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ SetValue рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

image

5. рдиреЗрд╕реНрдЯреЗрдб рдлреЙрд░реНрдордЕрд░реЗ рдореЗрдВ рдлреЙрд░реНрдордЧреНрд░реБрдк рдЬреЛрдбрд╝рдирд╛
рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдирд╣реАрдВ, рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб ЁЯШД рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред

image

HTML рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдлреЙрд░реНрдордЧреНрд░реБрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд╕рдВрджрд░реНрдн рд▓реЗрдВ

рд╕рд░рд▓ рдХреЛрдб . HTML рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ HTML рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рднреА рдЕрдзрд┐рдХ рдорд┐рд▓реЗрдЧрд╛ред рдХреГрдкрдпрд╛ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдХреЛ рджреЗрдЦреЗрдВ

<form [formGroup]="user.formGroup">
   <input type="text" formControlName="firstName"/>
   <small >{{user.formGroup.controls.firstName.errorMessage}}</small>
<!--Nested FormGroup-->
   <div [formGroup]="user.address.formGroup">...</div>
<!--Nested FormArray - Skills-->
   <div *ngFor="let skill of user.skills">
       <div [formGroup]="skill.formGroup">...</div>
   </div
</form>

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

@ajyojha , рдЕрдЧрд░ рдореИрдВ рдЧрд▓рдд рд╣реВрдВ рддреЛ рдореБрдЭреЗ

  1. рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдУрд╡рд░рд╣реЗрдб рдЦрд░рд╛рдм рд╣реИред
  2. рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреА рдорджрдж рд╕реЗ рд░рдирдЯрд╛рдЗрдо рд╕рддреНрдпрд╛рдкрди - рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИред
  3. рдпрджрд┐ рд╕реЗрдЯрд░реНрд╕/рдЧреЗрдЯрд░реНрд╕ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ setValue() рдФрд░ valueChanges() рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ?

рдореИрдВ рдХреНрдпрд╛ рд╕реЛрдЪрддрд╛ рд╣реВрдВ:

  1. рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рдХрд╛рд░ рд▓рд┐рдЦрдирд╛ рд╕реНрдерд┐рд░ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдЬреИрд╕рд╛ рд╣реИред рдХреЛрдИ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд┐рдирд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдмреБрд░рд╛ рдЕрднреНрдпрд╛рд╕ рд╣реИред
  2. рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреА рдорджрдж рд╕реЗ рд░рдирдЯрд╛рдЗрдо рд╕рддреНрдпрд╛рдкрди - рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд╕рд╣рдордд рд╣реИрдВред
  3. setValue() рдЕрд▓рд╛рд╡рд╛ patchValue() , reset() рднреА рд╣реИрдВ, рдЬреЛ рдлреЙрд░реНрдо рд╡реИрд▓реНрдпреВ рдХреЗ рд╕рд╛рде рднреА рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдХреЗрд╡рд▓ setValue() рдХреЛ рдПрдХ рд╕реЗрдЯрд░ рд╕реЗ рдмрджрд▓рдиреЗ рд╕реЗ рдХреЛрдб рдЕрд╕рдВрдЧрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрдм рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдлреЙрд░реНрдо рдореЙрдбрд▓ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд░реНрд╕ рд▓рд┐рдЦрдирд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЧреЗрдЯрд░реНрд╕ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреЛрдб рдУрд╡рд░рд╣реЗрдб рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рди рдУрд╡рд░рд╣реЗрдб рднреА рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред рдкреНрд░рдкрддреНрд░ рдирд┐рдпрдВрддреНрд░рдг рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рдкрддреНрд░ рдореЙрдбрд▓ рдЧреБрдг рдирд╛рдо рдорд┐рд▓рд╛рдирд╛ рднреА рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред

рдзрдиреНрдпрд╡рд╛рдж, @KostyaTretyak рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рдкрд░ рдЖрдкрдХреА рдЪрд┐рдВрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдЗрд╕рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреА, рдХреГрдкрдпрд╛ рдореЗрд░реА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдиреАрдЪреЗ рджреЗрдЦреЗрдВ :)ред

  1. рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдУрд╡рд░рд╣реЗрдб рдЦрд░рд╛рдм рд╣реИред

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

рдХреНрдпрд╛ рд╣рдо рд╕рд╢рдХреНрдд рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдкреНрд░рдкрддреНрд░ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╣реА рдЕрднреНрдпрд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

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

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

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

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

    • рд╕рдВрдкрддреНрддрд┐ рдХреЛ рд╢реВрдиреНрдп рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╕реЗрдЯ рдХрд░реЗрдВред рдЕрдЧрд░ рдореИрдВ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рд╢реВрдиреНрдп рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ 'рдмреА' рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдкрд╛рд▓рди рдХреНрдпреЛрдВ рдХрд░рдирд╛ рд╣реИ? рджреЛрдмрд╛рд░рд╛ рдореЗрд░реЗ рдкрд╛рд╕ рдХреЛрдИ рдЬрд╡рд╛рдм рдирд╣реАрдВ рд╣реИ :( рдореЗрд░реА рд╡рд┐рдХрд╛рд╕ рдЯреАрдо рджреЗрдиреЗ рдХреЗ рд▓рд┐рдПред

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

    • рдЕрдЧрд░ рдореИрдВ рдкреНрд░рддреНрдпреЗрдХ/рдХреБрдЫ рдЧреБрдгреЛрдВ рдХреЛ рдирд┐рд░рд░реНрдердХ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ рддреЛ рдХреЛрдб рдкрдардиреАрдпрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдореИрдВ рдХреИрд╕реЗ рддрдп рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рд╕рд░реНрд╡рд░ рдХреЛ рдореВрд▓реНрдп рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рддрдиреА рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдлрд┐рд░ рдореБрдЭреЗ рд╕рдВрдмрдВрдзрд┐рдд рдШрдЯрдХ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреА рд╣реЛрдЧреА рдФрд░ рдПрдХ рдЭрд▓рдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреА рд╣реЛрдЧреАред рдкреНрд░рдореБрдЦ рдХреЛрдб рдкрдардиреАрдпрддрд╛ рдЪрд┐рдВрддрд╛ред

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

  1. рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреА рдорджрдж рд╕реЗ рд░рдирдЯрд╛рдЗрдо рд╕рддреНрдпрд╛рдкрди - рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИред

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

  1. рдпрджрд┐ рд╕реЗрдЯрд░реНрд╕ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ setValue() рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ?

рдЬрд╣рд╛рдВ рдореИрдВрдиреЗ рдХрд╣рд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ 'рд╕реЗрдЯрд╡реИрд▓реНрдпреВ ()' рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдореБрдЭреЗ рд╕реЗрдЯрд╡реИрд▓реНрдпреВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдореИрдВрдиреЗ рдЙрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдирд╣реАрдВ рджрд┐рдЦрд╛рдпрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдореИрдВ рдХрдХреНрд╖рд╛ рд╕рдВрдЪрд╛рд▓рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рд╕реЗрдЯрд╡реИрд▓реНрдпреВ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдпрджрд┐ рдореИрдВ рдЧрд▓рдд рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдмрддрд╛рдПрдВред

  1. рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рдХрд╛рд░ рд▓рд┐рдЦрдирд╛ рд╕реНрдерд┐рд░ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдЬреИрд╕рд╛ рд╣реИред рдХреЛрдИ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд┐рдирд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдмреБрд░рд╛ рдЕрднреНрдпрд╛рд╕ рд╣реИред

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

  1. рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреА рдорджрдж рд╕реЗ рд░рдирдЯрд╛рдЗрдо рд╕рддреНрдпрд╛рдкрди - рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд╕рд╣рдордд рд╣реИрдВред

рдпрд╣ рдЬрд╛рдирдХрд░ рдЕрдЪреНрдЫрд╛ рд▓рдЧрд╛ рдХрд┐ рд╣рдо рджреЛрдиреЛрдВ рдЗрд╕ рдкрд░ рдПрдХ рд╣реА рдкреГрд╖реНрда рд╣реИрдВ :)ред

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

рдореБрдЭреЗ рдЙрдкрд░реЛрдХреНрдд рдмрд┐рдВрджреБ рдХреЛ рддреАрди рдЦрдВрдбреЛрдВ рдореЗрдВ рдХреЙрд▓рд┐рдВрдЧ рд╡рд┐рдзрд┐, рд╕реЗрдЯрд░ рдкреНрд░рджрд░реНрд╢рди рдУрд╡рд░рд╣реЗрдб, рдФрд░ рдорд┐рд╢реНрд░рдг рдлреЙрд░реНрдо рдореЙрдбрд▓ рдЧреБрдгреЛрдВ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд░рдиреЗ рджреЗрдВред

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

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

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

рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЖрдкрдХреА рд╕рднреА рдЪрд┐рдВрддрд╛рдУрдВ рдХрд╛ рдЙрддреНрддрд░ рджрд┐рдпрд╛ рд╣реИ, рдпрджрд┐ рдЖрдк рдЗрд╕ рдкрд░ рдХреЛрдИ рдЕрдиреНрдп рдЪрд┐рдВрддрд╛рдПрдВ рд╣реИрдВ рддреЛ рдмреЗрдЭрд┐рдЭрдХ рд╕рд╛рдЭрд╛ рдХрд░реЗрдВ :)ред

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдЕрдкрдиреА рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдХрд╣рд╛ рдерд╛ рдХрд┐ рд░рд┐рдПрдХреНрдЯрд┐рд╡ рдлреЙрд░реНрдо рдХреЗ рдЖрдзрд╛рд░ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреГрдердХреНрдХрд░рдг рд╕рд┐рджреНрдзрд╛рдВрдд рдкреНрд░рдерд╛рдУрдВ рдХреА рд╢рдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдорд╛рди рдЪреАрдЬреЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ @rxweb/types рдХреЗ рдкреИрдХреЗрдЬ рдХреЗ рд╕рд╛рде рдПрдВрдб-рдЯреВ-рдПрдВрдб рд░рд┐рдПрдХреНрдЯрд┐рд╡ рдлреЙрд░реНрдо рд╕реЙрд▓реНрдпреВрд╢рди рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдХрдХреНрд╖рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ :)ред

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рдж рдХреЛрдб рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ?

рд╕реНрдЯреИрдХрдмреНрд▓рд┐рдЯреНрдЬ: рдУрдкрди
рдЬреАрдердм : рдЗрдВрдЯрд░рдлреЗрд╕ рдбреНрд░рд┐рд╡реЗрди рд╕реНрдЯреНрд░реЙрдиреНрдЧрд▓реА-рдЯрд╛рдЗрдкреНрдб рд░рд┐рдПрдХреНрдЯрд┐рд╡ рдлреЙрд░реНрдо рдЙрджрд╛рд╣рд░рдг

рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдХреЛрдИ рд╕реБрдЭрд╛рд╡ рд╣реИ рддреЛ рдЙрд╕реЗ рдмреЗрдЭрд┐рдЭрдХ рд╕рд╛рдЭрд╛ рдХрд░реЗрдВред

рдЗрд╕рд▓рд┐рдП, рдПрдВрдЧреБрд▓рд░ рдирд╛рдЙ рдЕрд╡реЗрд▓реЗрдмрд▓ рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг 10 , рдпрд╣ рдПрдХ рдкреНрд░рдореБрдЦ рд░рд┐рд▓реАрдЬ рд╣реИ рдФрд░ рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд░реВрдкреЛрдВ рдХреЛ рдПрдВрдЧреБрд▓рд░ рдХреЗ рдХрдо рд╕реЗ рдХрдо рд╕рдВрд╕реНрдХрд░рдг 11 рддрдХ рджреГрдврд╝рддрд╛ рд╕реЗ рдЯрд╛рдЗрдк рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рдЧрд┐рд░рд╛рд╡рдЯ рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣рд╛рдВ рджреЗрдЦреЗ рдЧрдП рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕реБрдЭрд╛рд╡реЛрдВ/рдкреАрдЖрд░ рдореЗрдВ рдлреЙрд░реНрдо рдореЙрдбрд▓ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдкреНрд░рд╢реНрди (рдпрд╛ рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡?) рд╣реИред

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

interface Address {
  name: Name;  
}
interface Name {
  firstName: string;
  lastName: string;
}

рдЗрд╕рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ "рдЕрдиреБрд╡рд╛рджрд┐рдд" рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

const myForm = new FormGroup<Address>({
  name: new FormGroup<Name>({
    firstName: new FormControl('John'),
    lastName: new FormControl('Doe'),
  })
})

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

рд▓реЗрдХрд┐рди, рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ: рдЕрдм рдЖрдк FormControls рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред

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

рдореЗрд░рд╛ рдкреНрд░рд╢реНрди/рдкреНрд░рд╕реНрддрд╛рд╡: рдлреЙрд░реНрдо рдореЙрдбрд▓ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдЦрд┐рд▓рд╛рдл рдХреНрдпрд╛ рдмреЛрд▓реЗрдВрдЧреЗ?

interface Address {
  name: FormGroup<Name>;  
}
interface Name {
  firstName: FormControl<string>;
  lastName: FormControl<string>;
}

const myForm = new FormGroup<Address>({
  name: new FormGroup<Name>({
    firstName: new FormControl('John'),
    lastName: new FormControl('Doe'),
  })
})

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

рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЛрдбрд╕реИрдВрдбрдмреЙрдХреНрд╕ рдмрдирд╛рдпрд╛ рд╣реИ, рддрд╛рдХрд┐ рдЖрдк рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдЖрдЬрдорд╛ рд╕рдХреЗрдВ: https://codesandbox.io/s/falling-grass-k4u50?file=/src/app/app.component.ts

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

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

@MBuchalik рдореИрдВрдиреЗ рдЖрдкрдХреЗ рд╕рд╛рде рд╡рд╣реА рд░рд╛рдп рд╕рд╛рдЭрд╛ рдХреА рд╣реИ рдФрд░ рдкреАрдЖрд░ рдХреЛ рдПрдХ рд╣реА рд╕рд╡рд╛рд▓ рдЙрдард╛рдпрд╛ рд╣реИ рдФрд░ рдХреЛрдгреАрдп рдпреЛрдЧрджрд╛рдирдХрд░реНрддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ ( @KostyaTretyak ) рдиреЗ рдЙрддреНрддрд░ рджрд┐рдпрд╛ рд╣реИред

рдЖрдк рдкреАрдЖрд░ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ:
https://github.com/angular/angular/pull/37389#discussion_r438543624

рдЯреАрдПрд▓рдбреАрдЖрд░;

рдпрд╣рд╛рдВ рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ:
рдпрджрд┐ рд╣рдо рдЖрдкрдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдореЙрдбрд▓ рдмрдирд╛рдиреЗ рд╣реЛрдВрдЧреЗ - рдкреНрд░рдкрддреНрд░ рдирд┐рдпрдВрддреНрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдФрд░ рдкреНрд░рдкрддреНрд░ рдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдПред
рдкреНрд░рдкрддреНрд░ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рдореЙрдбрд▓ рдХреЛ рдкрдврд╝рдирд╛ рдХрдард┐рди рд╣реИред

рдФрд░ рдореИрдВрдиреЗ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдЖрдзреЗ рд╕рд╛рд▓ рдкрд╣рд▓реЗ fullTemplateTypeCheck рд╕рдХреНрд╖рдо рдХреЗ рд╕рд╛рде)

рдореИрдВрдиреЗ рдЗрд╕ рд╕реВрддреНрд░ рдореЗрдВ рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ "рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреНрдпреЛрдВ рдЬрд╛рддрд╛ рд╣реВрдВ" рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ рд╣реИ:
https://github.com/angular/angular/issues/13721#issuecomment -643214540

рдХреЛрдбрд╕реИрдирдмреЙрдХреНрд╕ рдбреЗрдореЛ: https://codesandbox.io/s/github/gaplo917/angular-typed-form-codesandbox/tree/master/?fontsize=14&hidenavigation=1&theme=dark

рдЖрдкрдХреА рдЕрдВрддрд░реНрджреГрд╖реНрдЯрд┐ @KostyaTretyak рдФрд░ @ gaplo917 рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдореИрдВ

рдЕрдЧрд░ рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдордЭрд╛, рддреЛ рд╣рдо рдЗрд╕реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдпрджрд┐ рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рдПрдХрд▓ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ @KostyaTretyak рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рд╕рдорд╛рдзрд╛рди рдЬреИрд╕реЗ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдирдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдм рд╣рдо рдЕрдм рдлреЙрд░реНрдордХрдВрдЯреНрд░реЛрд▓ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред (рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдПрдХ "рд╣реИрдХ" рд╣реИ рдЬреЛ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╣рдорд╛рд░рд╛ рдореЙрдбрд▓ рдлрд┐рд░ рд╕реЗ "рдХреНрд▓реАрди" рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ 2 рдореЙрдбрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред)

рдпрджрд┐ рд╣рдо рдлреЙрд░реНрдордХрдВрдЯреНрд░реЛрд▓ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрднрд╡рддрдГ (!) рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рд╣реИ I (рдпрд╛ @ gaplo917) рд╕рдЪрд┐рддреНрд░ред рдирдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдореВрд▓ рд░реВрдк рд╕реЗ 2 рдореЙрдбрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрд╛ рдлреЙрд░реНрдо рд╡реИрд▓реНрдпреВ рдореЙрдбрд▓ рдХреЛ "рдирд┐рдХрд╛рд▓рдиреЗ" рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рд╕рд╣рд╛рдпрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

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

рдЖрдкрдХреА рдЕрдВрддрд░реНрджреГрд╖реНрдЯрд┐ @KostyaTretyak рдФрд░ @ gaplo917 рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдореИрдВ

рдЕрдЧрд░ рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдордЭрд╛, рддреЛ рд╣рдо рдЗрд╕реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдпрджрд┐ рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рдПрдХрд▓ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ @KostyaTretyak рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рд╕рдорд╛рдзрд╛рди рдЬреИрд╕реЗ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдирдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдм рд╣рдо рдЕрдм рдлреЙрд░реНрдордХрдВрдЯреНрд░реЛрд▓ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред (рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдПрдХ "рд╣реИрдХ" рд╣реИ рдЬреЛ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╣рдорд╛рд░рд╛ рдореЙрдбрд▓ рдлрд┐рд░ рд╕реЗ "рдХреНрд▓реАрди" рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ 2 рдореЙрдбрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред)

рдпрджрд┐ рд╣рдо рдлреЙрд░реНрдордХрдВрдЯреНрд░реЛрд▓ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрднрд╡рддрдГ (!) рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рд╣реИ I (рдпрд╛ @ gaplo917) рд╕рдЪрд┐рддреНрд░ред рдирдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдореВрд▓ рд░реВрдк рд╕реЗ 2 рдореЙрдбрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрд╛ рдлреЙрд░реНрдо рд╡реИрд▓реНрдпреВ рдореЙрдбрд▓ рдХреЛ "рдирд┐рдХрд╛рд▓рдиреЗ" рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рд╕рд╣рд╛рдпрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

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

@MBuchalik рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдпрджрд┐ рдЖрдк рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ "рдЯрд╛рдЗрдк рдЗрдВрдЯреНрд░реЗрдВрд╕" рдлреАрдЪрд░ рдкрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рднрд░реЛрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ 2 рдореЙрдбрд▓ рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╣рдорд╛рд░реА рдЖрдВрддрд░рд┐рдХ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ 60+ рд░реВрдк рд╣реИрдВ, рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ 3 рдЧрд╣рд░рд╛рдИ рд╕реНрддрд░ FormArray-FormGroup-FormArray рд╕рд╛рде рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд╣реИрдВ рдФрд░ рд╣рдореЗрдВ рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдореЙрдбрд▓ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдЦреЗрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ 2 рдкреНрд░рдХрд╛рд░ рдХреЗ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рд╣реИрдВ:

  • рдПрдкреАрдЖрдИ рдбреЗрдЯрд╛ рдЕрдиреБрд░реЛрдз/рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЙрдбрд▓
  • рдлреЙрд░реНрдордХрдВрдЯреНрд░реЛрд▓ рдореЙрдбрд▓

99.9% рд╕рдордп, рд╣рдо

  1. рдкреНрд░рддреНрдпреЗрдХ рдЬрдЯрд┐рд▓ рд░реВрдк рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдирдХреИрдкреНрд╕реБрд▓реЗрд╢рди рдмрдирд╛рдПрдВ
  2. рд░рд┐рдореЛрдЯ рдбреЗрдЯрд╛ рдХреЛ рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдо рдХрд░реЗрдВ -> рдлреЙрд░реНрдо рдбреЗрдЯрд╛
  3. рдкреНрд░рдкрддреНрд░ рдбреЗрдЯрд╛ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ -> рджреВрд░рд╕реНрде рдкреЗрд▓реЛрдб

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдЪрд┐рддреНрд░рдг рд╣реИ:

interface FooApiData {
   id: string
   age: number
   dob: string | null
   createdAt: string
}

interface FooFormControlType {
  id: TypedFormControl<string>
  age: TypedFormControl<number>

  // calendar view required JS date form control binding
  dob: TypedFormControl<Date | null>
} 

interface FooApiUpdateRequest {
   id: string
   dob: string | null
   age: number
}

class FooForm extends TypedFormGroup<FooFormControlType> {
    constructor(private fb: TypedFormBuilder, private initialValue: FooApiData) {
      super({
          id: fb.control(initialValue.id, Validators.required),
          dob: fb.control(initialValue.dob === null ? new Date(initialValue.dob) : null),
          age: fb.number(initialValue.age, Validators.required)
       })
   }
   toRequestBody(): FooApiUpdateRequest {
       const typedValue = this.value
       return {
          id: typedValue.id,
          dob: typedValue.dob !== null ? moment(typedValue.dob).format('YYYYMMDD') : null,
          age: typedValue.age
       }
   }
}

const apiData = apiService.getFoo()

const form = new FooForm(new TypedFormBuilder(), apiData)

// assume some UI changes the form value
function submit() {
   if(form.dirty && form.valid){
     const payload = form.toRequestBody()
     apiService.updateFoo(payload)
   }
}

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

рдпрджрд┐ рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рдПрдХрд▓ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ @KostyaTretyak рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рд╕рдорд╛рдзрд╛рди рдЬреИрд╕реЗ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдирдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдм рд╣рдо рдЕрдм рдлреЙрд░реНрдордХрдВрдЯреНрд░реЛрд▓ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред (рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдПрдХ "рд╣реИрдХ" рд╣реИ рдЬреЛ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╣рдорд╛рд░рд╛ рдореЙрдбрд▓ рдлрд┐рд░ рд╕реЗ "рдХреНрд▓реАрди" рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ 2 рдореЙрдбрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред)

рдпрд╣рд╛рдВ рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдЕрднреА рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХрд┐рддрдиреА рдмрд╛рд░ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ FormControl ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЕрдиреБрдорд╛рди рдХрд╣реАрдВ рди рдХрд╣реАрдВ 5-30% рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдЕрдЧрд░ рд╣рдо рдПрдХ рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо FormControl рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ 70-95% рдорд╛рдорд▓реЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдмрд╛рдХреА рдХреЗ рд▓рд┐рдП - рдмрд╕ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдХреЗрдд рджреЗрдВ (рджреЗрдЦреЗрдВ Control<T> , рдЗрд╕реЗ "рджреВрд╕рд░рд╛ рдореЙрдбрд▓" рдХрд╣рдирд╛ рд╕рд╣реА рдирд╣реАрдВ рд╣реИ):

interface FormModel {
  date: Control<Date>;
}

рдХреНрдпрд╛ Control<T> рдкреНрд░рдХрд╛рд░ рдХреЛ рд╣реИрдХ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? - рд╣рд╛рдБ, рдпрд╣ рд╢рд╛рдпрдж рдПрдХ рд╣реИрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдореЛрдЯрд╛ рд╣реИрдХ рдирд╣реАрдВ рд╣реИред рдореИрдВ рдРрд╕реЗ рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдЬрд╣рд╛рдВ рдпрд╣ рдкреНрд░рдХрд╛рд░ рдЗрд░рд╛рджреЗ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╛ рдЗрд╕рдХреЗ рджреБрд╖реНрдкреНрд░рднрд╛рд╡ рд╣реИрдВред

рдУрд╣, рдореБрдЭреЗ Control<T> рдХреЗ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдпрд╛рдж рдЖ рдЧрдП рдЬрдм рд╣рдореЗрдВ рдлреЙрд░реНрдо рд╡реИрд▓реНрдпреВ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдмрд╛рд╣рд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рджреЛ рдореЙрдбрд▓реЛрдВ рдХреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ:

import { FormBuilder, Control } from '@ng-stack/forms';

// External Form Model
interface ExternalPerson {
  id: number;
  name: string;
  birthDate: Date;
}

const formConfig: ExternalPerson = {
  id: 123,
  name: 'John Smith',
  birthDate: new Date(1977, 6, 30),
};

interface Person extends ExternalPerson {
  birthDate: Control<Date>;
}


const fb = new FormBuilder();
const form = fb.group<Person>(formConfig); // `Control<Date>` type is compatible with `Date` type.

const birthDate: Date = form.value.birthDate; // `Control<Date>` type is compatible with `Date` type.

рд▓реЗрдХрд┐рди рдЗрд╕ рдХреЛрдб рдореЗрдВ, рдУрд╡рд░рд╣реЗрдб рдХреЗрд╡рд▓ рдпрд╣рд╛рдБ рд╣реИ:

interface Person extends ExternalPerson {
  birthDate: Control<Date>;
}

@ArielGueta рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, Control<T> рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдореБрджреНрджрд╛ рдЕрдм рдЬреНрдЮрд╛рдд рд╣реЛ рдЧрдпрд╛ рд╣реИред рд╣реИ рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐, рдореИрдВ рднреА рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ Control<T> , рдХреЛрдгреАрдп рдХреЗ рд▓рд┐рдП рднрд╡рд┐рд╖реНрдп рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдореЗрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдореИрдВ рдкрд╣рд▓реЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдИред

@ArielGueta рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, Control<T> рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдореБрджреНрджрд╛ рдЕрдм рдЬреНрдЮрд╛рдд рд╣реЛ рдЧрдпрд╛ рд╣реИред рд╣реИ рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐, рдореИрдВ рднреА рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ Control<T> , рдХреЛрдгреАрдп рдХреЗ рд▓рд┐рдП рднрд╡рд┐рд╖реНрдп рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдореЗрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдореИрдВ рдкрд╣рд▓реЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдИред

@KostyaTretyak рдпрд╣ рд╕рдЪ рдирд╣реАрдВ рд╣реИред рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдорд╕реНрдпрд╛ рдХреЗрд╡рд▓ рдпрд╣ рджрд░реНрд╢рд╛рддреА рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ "рдХрдВрдЯреНрд░реЛрд▓ рдЯрд╛рдЗрдк" рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд▓рдд рд╣реИред

рдПрдХ рдкреВрд░реНрдг "рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рдХрд╛рд░" рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред

рд▓рд╛рдЗрд╡ рдбреЗрдореЛ: https://codesandbox.io/s/lucid-bassi-ceo6t?file=/src/app/demo/forms/type -test.ts

Screenshot 2020-07-01 at 00 35 11

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

рдареАрдХ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдкреАрдЖрд░ (рдФрд░ рд▓рдЧрд╛рддрд╛рд░ рд╡рд╛рд▓реЗ) рдХрднреА рднреА рдлреЙрд░реНрдордХрдВрдЯреНрд░реЛрд▓ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ?

@MBuchalik , рдЗрд╕ рд╕рдордп (рдХреЛрдгреАрдп v10), рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рдореНрди рдкреНрд░рдкрддреНрд░ рдореЙрдбрд▓ рд╣реИ:

interface FormModel {
  date: Date;
}

рдФрд░ рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдШрдЯрдХ рдореЗрдВ рд╣рдо date рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

get date() {
  return this.formGroup.get('date') as FormControl;
}
// ...
this.date.value as Date;

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

get date() {
  return this.formGroup.get('date') as FormControl<Date>;
}
// ...
this.date.value; // Here Date type

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

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

рд▓реЗрдХрд┐рди рд╡реЗ рд╕рднреА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ

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

рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ, рдкрд┐рдЫрд▓реА рд╕рдВрдЧрддрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╕реБрдЭрд╛рд╡: рдореЗрд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреАрдЫреЗ рдХреА рдУрд░ рд╕рдВрдЧрдд рдмрдирд╛рдирд╛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдХрдард┐рди рд╣реИред рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ, рд╣рдо рд╢рд╛рдпрдж рдирд┐рдореНрди рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рд╣рдо рдлреЙрд░реНрдордХрдВрдЯреНрд░реЛрд▓, рдлреЙрд░реНрдордЧреНрд░реБрдк рдФрд░ рдлреЙрд░реНрдордЕрд░реЗ рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдирд╣реАрдВ рдмрджрд▓рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдирдП рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдЙрдирд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ (рд╢рд╛рдпрдж рдЙрдиреНрд╣реЗрдВ StrictFormControl<T> рдФрд░ StrictFormGroup<T> рдпрд╛ рдЬреЛ рднреА рдЖрдкрдХреЛ рдкрд╕рдВрдж рд╣реЛ)ред рдпреЗ рддрдм рд╣реИрдВ рдЬрдм рд╣рдо рдЯрд╛рдЗрдк рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рдмрдирд╛рддреЗ рд╣реИрдВред рд▓рд╛рдн: рд╣рдо 100% рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реИрдВ рдХрд┐ рдХреЛрдИ рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред :)

рдореЗрд░реЗ рдЪрд┐рддреНрд░рдг рдкрд░ рдХреБрдЫ рдШрдВрдЯреЗ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЙрдореНрдореАрдж рдирд╣реАрдВ рдереА рдХрд┐ рдпрд╣ рд╕рд╣реА рд╣реЛрдЧрд╛;)

рдореИрдВрдиреЗ рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдХреБрдЫ рджрд┐рдиреЛрдВ рддрдХ рдХрд╛рдо рдХрд┐рдпрд╛, рдФрд░ рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рд░реВрдкреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдХрд┐рддрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛ред

  1. рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдорд╣рддреНрд╡рдкреВрд░реНрдг рдУрд╡рд░рд╣реЗрдб рдФрд░ рджреЛ рдореЙрдбрд▓ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
  2. рджреВрд╕рд░реЗ, рдпрд╣ рд╕рдорд╛рдзрд╛рди рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ Control<T> рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдореЗрд░реЗ рд╕рдорд╛рдзрд╛рди рд╕реЗ рдмреЗрд╣рддрд░ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрд╕реА рддрд░рд╣ рдлреЙрд░реНрдо рдореЙрдбрд▓ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдкреБрди: рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред
  3. рдиреЗрд╕реНрдЯреЗрдб рдкреНрд░рдкрддреНрд░ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдп рдХрд░реЗрдВред рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рдореНрди рдлреЙрд░реНрдо рдореЙрдбрд▓ рд╣реИ:
interface FormModel {
  one: FormGroup<{two: FormControl<string>}>;
}

рдФрд░ рдЕрдЧрд░ рд╣рдореЗрдВ formGroup.controls.one.value , рддреЛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рд╢рд░реНрдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╕рдВрдХреЗрдд рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рди рдХрд┐ {two: string} рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде (рдЬреИрд╕рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред рддреЛ рдЖрдИрдбреАрдИ рд╕реЗ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдард┐рди рдореВрд▓реНрдпред

рдФрд░ рдЕрдЧрд░ рд╣рдореЗрдВ formGroup.controls.one.value рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рд╢рд░реНрдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╕рдВрдХреЗрдд рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рди рдХрд┐ {рджреЛ: рд╕реНрдЯреНрд░рд┐рдВрдЧ} рдкреНрд░рдХрд╛рд░ (рдЬреИрд╕рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП) рдХреЗ рд╕рд╛рдеред рддреЛ рдЖрдИрдбреАрдИ рд╕реЗ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдард┐рди рдореВрд▓реНрдпред

рдареАрдХ рд╣реИ рддреЛ рдмрд╕ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдореИрдВ рд╕рдм рдХреБрдЫ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдордЭ рдЧрдпрд╛ рд╣реВрдВред рдпрджрд┐ рдЖрдк рдореЗрд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

interface FormModel {
  one: FormGroup<Two>;
}
interface Two {
  two: FormControl<string>;
}

const myForm = new FormGroup<FormModel>({
  one: new FormGroup<Two>({
    two: new FormControl('')
  })
});

(рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рдФрд░ рд╡рд░реНрдмреЛрдЬрд╝ рдмрдирд╛ рджрд┐рдпрд╛;))

рдЕрдЧрд░ рдореИрдВ рдЕрдм myForm.controls.one.value рддрд▓рд╛рд╢ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ:

grafik

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

рддреЛ рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐, рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, "рджреЛ" рд╡реИрдХрд▓реНрдкрд┐рдХ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?

рдХреНрдпрд╛? рдирд╣реАрдВред

рдЖрдкрдХреЗ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдореЗрд░рд╛ рдкрд░реАрдХреНрд╖рдг:

interface FormModel {
  one: FormGroup<{two: FormControl<string>}>;
}

let formGroup: FormGroup<FormModel>;
const some = formGroup.controls.one.value;

value рдкрд░ рдорд╛рдЙрд╕ рд╣реЛрд╡рд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдореИрдВ codesandbox рдкрд░ рдХреНрдпрд╛ рджреЗрдЦрддрд╛ рд╣реВрдВ:

(property) FormGroup<FormGroupControls<{ two: FormControl<string>; }>>.value: PartialFormGroupValue<FormGroupControls<{
    two: FormControl<string>;
}>>

рдпрд╣рд╛рдВ PartialFormGroupValue рд╕рд╢рд░реНрдд рдкреНрд░рдХрд╛рд░ PartialFormValue рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред

рдЖрд╣, рдареАрдХ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдорд┐рд▓ рдЧрдпрд╛ред рддреЛ рдЖрдкрдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЯрд╛рдЗрдк рдкрдврд╝рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рд╣реИ рдирд╛? рдореИрдВрдиреЗ рдореВрд▓ рд░реВрдк рд╕реЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдЖрдк рдХрд┐рд╕реА рдмрдЧ рдпрд╛ рдЙрд╕ рддрд░рд╣ рдХреЗ рдХреБрдЫ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рдереЗред

рдареАрдХ рд╣реИ, рдПрдХ рдмрд╛рд░ рдЯрд╛рдЗрдк рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рдмрд╛рдж, рдЕрдзрд┐рдХрд╛рдВрд╢ рдЖрдИрдбреАрдИ рдЕрднреА рднреА рдЙрдкрд▓рдмреНрдз рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реБрдЭрд╛рд╡ рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдВрдЧреЗред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣рд╛рдВ рдХреЛрдИ рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣реА рд╣реИред (рдмреЗрд╢рдХ, рдпрд╣ рдкрдврд╝рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдпрд╣ рд╕рд┐рд░реНрдл {two?: string} ред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдпрд╣ рдХрдо рд╕реЗ рдХрдо рдореЗрд░реА рд░рд╛рдп рд╣реИред)

рдпрджрд┐ рдЖрдкрдиреЗ рдЕрдкрдирд╛ Control<T> , рддреЛ рдЖрдк рдЗрд╕реЗ sth рдХрд┐рдП рдмрд┐рдирд╛ рдлреЙрд░реНрдо рд╡реИрд▓реНрдпреВ рдХреЗ рдЯрд╛рдЗрдкрд┐рдВрдЧ рд╕реЗ рдХреИрд╕реЗ рд╣рдЯрд╛рдПрдВрдЧреЗ рдЬреИрд╕реЗ рдореИрдВрдиреЗ рдХрд┐рдпрд╛ рдерд╛? рдФрд░ рдЖрдк рдПрдХ рд╕рд╣рд╛рдпрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдлреЙрд░реНрдо рд╡реИрд▓реНрдпреВ рдХреЛ рд░рд┐рдХрд░реНрд╕рд┐рд╡ рдЖрдВрд╢рд┐рдХ рдХреИрд╕реЗ рдмрдирд╛рдпреЗрдВрдЧреЗ?

рдпрджрд┐ рдЖрдкрдиреЗ рдЕрдкрдирд╛ рдирд┐рдпрдВрддреНрд░рдг рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ sth рдХрд┐рдП рдмрд┐рдирд╛ рдлреЙрд░реНрдо рд╡реИрд▓реНрдпреВ рдХреЗ рдЯрд╛рдЗрдкрд┐рдВрдЧ рд╕реЗ рдХреИрд╕реЗ рд╣рдЯрд╛рдПрдВрдЧреЗ рдЬреИрд╕реЗ рдореИрдВрдиреЗ рдХрд┐рдпрд╛ рдерд╛? рдФрд░ рдЖрдк рдПрдХ рд╕рд╣рд╛рдпрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдлреЙрд░реНрдо рд╡реИрд▓реНрдпреВ рдХреЛ рд░рд┐рдХрд░реНрд╕рд┐рд╡ рдЖрдВрд╢рд┐рдХ рдХреИрд╕реЗ рдмрдирд╛рдпреЗрдВрдЧреЗ?

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореЗрд░рд╛ рд╕рдорд╛рдзрд╛рди рдмреЗрд╣рддрд░ рдирд╣реАрдВ рд╣реИ:

(property) FormGroup<FormGroup<{ two: FormControl<string>; }>>.value: ExtractGroupValue<FormGroup<{
    two: FormControl<string>;
}>>

рдореИрдВрдиреЗ рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдЗрд╕рд▓рд┐рдП рджрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдерд╛:

рдХреНрдпрд╛ рдЖрдк рдЙрди рдЪреАрдЬреЛрдВ рдкрд░ рдЙрджрд╛рд╣рд░рдг рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреА рд╣реИрдВ? (рдЦрд╛рд╕рддреМрд░ рдкрд░ рдРрд╕реЗ рд╕рд╛рдорд╛рди рдкрд░, рдЬреЛ рдЖрдкрдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рддрдп рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?)

рд╡реИрд╕реЗ, рдореИрдВрдиреЗ Control<T> рд╕рд╛рде рдЧрдВрднреАрд░ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░ рджрд┐рдпрд╛ рд╣реИред

рдХреЛрдгреАрдп 10 рдФрд░ [formControl] рд╕рд╛рде HTML рдмрд╛рдзреНрдпрдХрд╛рд░реА рдореБрджреНрджреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╡рд╣ рдорд╛рд░реНрдЧ рд╣реИ рдЬреЛ рдореИрдВ рдЧрдпрд╛ рдерд╛:

рдЬреИрд╕рд╛ рдХрд┐ рдПрдХ рдЕрдиреНрдп рдЕрдВрдХ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (https://github.com/angular/angular/issues/36405#issuecomment-655110082), рдореЗрд░реЗ рд░реВрдкреЛрдВ рдХреЗ рд▓рд┐рдП рдореИрдВ рдЖрдо рддреМрд░ рдкрд░ рдРрд╕реЗ рд╡рд░реНрдЧ рдмрдирд╛рддрд╛ рд╣реВрдВ рдЬреЛ рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп рдФрд░ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдЖрд╕рд╛рдиреА рдХреЗ рд▓рд┐рдП FormGroup рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ . рдЙрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде, рдореИрдВ рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░рдХреЗ рдЕрднреА рдХреЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛:

class UserFormGroup extends FormGroup {
  constructor() {
    super({
      id: new FormControl(null, Validators.required),
      name: new FormControl(null, Validators.required),
    });
}

рдЗрд╕рдХреЗ рд▓рд┐рдпреЗ:

// everything will extend these two
export class EnhancedFormGroup<T extends { [key: string]: AbstractControl }> extends FormGroup
{
  controls!: T;
}
export class EnhancedFormArray<T extends AbstractControl> extends FormArray 
{
  controls!: T[];
}

// reworked form from above
function formDefinition() {
   return {
      id: new FormControl(null, Validators.required),
      name: new FormControl(null, Validators.required),
    };
}

class UserFormGroup extends EnhancedFormGroup<ReturnType<typeof formDefinition>> {
  constructor() {
    super(formDefinition());
}

рдЙрд╕ рд╕рдордп form.controls рдПрдЪрдЯреАрдПрдордПрд▓ рдореЗрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдмрд╛рдзреНрдпрдХрд╛рд░реА, { id: FormControl, name: FormControl } рд░реВрдк рдореЗрдВ рдЕрдкрдиреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рджрд┐рдЦрд╛рдПрдЧрд╛, рдФрд░ рдЕрдЧрд░ рдлреЙрд░реНрдо рдиреЗрд╕реНрдЯреЗрдб рдлреЙрд░реНрдордЧреНрд░реБрдк рдпрд╛ рд╕рд░рдгреА рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдерд╛ рддреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдПрдХрддреНрд░рд┐рдд рд╣реЛрдЧрд╛ред

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

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЖрдк FormGroup рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдмрд┐рдирд╛ рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ (рдареАрдХ рд╣реИ, рдпрд╣ рдЙрди рд░реВрдкреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдЪ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдирд┐рдпрдВрддреНрд░рдг рдЬреЛрдбрд╝рддреЗ/рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ; рд╡реЗ controls рдореЗрдВ рдирд╣реАрдВ рджрд┐рдЦрд╛рдПрдВрдЧреЗ

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдФрд░ рднреА рдЖрд╕рд╛рди рд╣реИ рдпрджрд┐ рдЖрдкрдХреЛ рдРрд╕реЗ рд╡рд░реНрдЧ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ FormGroup рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ; рдЖрдк рдПрдХ рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдп рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ:

function createEnhancedFormGroup<T extends { [key: string]: AbstractControl }>(controls: T) {
  return new EnhancedFormGroup<T>(controls);
}

const form = createEnhancedFormGroup({
  id: new FormControl(null, Validators.required),
  name: new FormControl(null, Validators.required),
});

2 рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ
... рдпрд╛ рдЖрдк рдЗрд╕реЗ FormGroup рд╡рд░реНрдЧ рдореЗрдВ рд╣реА рд╕реЗрдВрдХ рд╕рдХрддреЗ рд╣реИрдВ ( FormBuilder рд╢рд╛рдпрдж?)

export class EnhancedFormGroup<T extends { [key: string]: AbstractControl }> extends FormGroup
{
  controls!: T;

  static create<T extends { [key: string]: AbstractControl }>(controls: T) {
    return new EnhancedFormGroup<T>(controls);
  }
}

const form = EnhancedFormGroup.create({
  id: new FormControl(null, Validators.required),
  name: new FormControl(null, Validators.required),
});

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ 3
рдореИрдВрдиреЗ рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ value s рдкрд░ рдЯрд╛рдЗрдкрд┐рдВрдЧ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдврд╝рд╛рдпрд╛ рд╣реИ рдФрд░ рд╕рдм рдХреБрдЫ рд╕рдореЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓реЗрдЦ рдмрдирд╛рдпрд╛ рд╣реИ:

https://medium.com/youngers-consulting/angular-typed-reactive-forms-22842eb8a181

рдЗрд╕реЗ рдЕрдм рднрд╡рд┐рд╖реНрдп рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд░реЛрдбрдореИрдк рдкрд░ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: https://angular.io/guide/roadmap#better -developer-ergonomics-with-strict-typing-for-angularforms

@pauldraper рдХреНрдпрд╛ рдЖрдк рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ ~ 2 рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ рдХреЗ рд░реЛрдбрдореИрдк рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреНрдпрд╛ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ? рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдкрд░рд┐рд╡рд░реНрддрди рдЬреЛ рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБ рд╡рд╣ рд╣реИ рд╢реАрд░реНрд╖рдХ рдХреА рд╢рдмреНрджрд╛рд╡рд▓реАред рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА "рднрд╡рд┐рд╖реНрдп" рдЦрдВрдб рдореЗрдВ рд╣реИред рдареАрдХ рд╡реИрд╕реЗ рд╣реА рдЬреИрд╕реЗ 2 рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ рдерд╛ред

@MBuchalik рд╢рд╛рдпрдж 2 рдорд╣реАрдиреЗ рд╕реЗ рд╣реИред

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

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

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

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

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

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

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