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

рдирддреАрдЬрддрди, рд╡рд╣ рдЗрд╕ рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рдкрд╣реБрдВрдЪреЗ рдХрд┐ рдРрд╕рд╛ рди рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рдЙрд╕рдиреЗ рд╕рдВрдХрд▓рдХ рд╕реЗ рджреЛрд╕реНрддреА рдХреА, рдЙрд╕рдХреЗ рд╕рдВрдХреЗрддреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ред рд╕рдВрдХрд▓рдХ рдХреЛрдб рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдиреБрдХрд╕рд╛рди рдкрд╣реБрдВрдЪрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЙрдиреНрд╣реЗрдВ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдЦ рдХреЗ рд▓реЗрдЦрдХ рдиреЗ рдЦреБрдж рдХреЛ рдПрдХ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрддреЗ рд╣реБрдП рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ рд╕рдВрдХрд▓рдХ рдЙрд╕рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рджреЛрд╕реНрдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрд╕реЗ рдЦреБрдж рд╕реЗ рдмрдЪрд╛рддрд╛ рд╣реИред рдЕрд▓реНрдмрд╕ рдбрдВрдмрд▓рдбреЛрд░ рдХреЗ рд╢рдмреНрджреЛрдВ рдХреЛ рдХреЛрдИ рдХреИрд╕реЗ рдпрд╛рдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ: "рдЕрдкрдиреЗ рджреБрд╢реНрдордиреЛрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл рдмреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд╣рд╕ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЕрдкрдиреЗ рджреЛрд╕реНрддреЛрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл рдмреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рд╕реЗ рдХрдо рдирд╣реАрдВред"
рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд┐рддрдирд╛ рднреА рдЕрдЪреНрдЫрд╛ рдХреНрдпреЛрдВ рди рд╣реЛ, рдЙрд╕реЗ рдЦреБрд╢ рдХрд░рдирд╛ рд╣рдореЗрд╢рд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реЛрддрд╛ред рдХрднреА-рдХрднреА
any
рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдмрдЪрдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрддрд╛ рд╣реИред рдФрд░ рдХрднреА-рдХрднреА рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐
any
рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдЙрдЪрд┐рдд рд╕рдорд╛рдзрд╛рди рд╣реИред
рдпрд╣ рд╕рд╛рдордЧреНрд░реА рджреЛ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИред рдЙрдирдореЗрдВ
any
рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдмрдЪрдиреЗ рд╕реЗ, рдЖрдк рдХреЛрдб рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреА рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╕рд╣рдЬ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдЬреЗрдирд░рд┐рдХ
рдорд╛рди рд▓реАрдЬрд┐рдП рд╣рдо рдПрдХ рд╕реНрдХреВрд▓ рдХреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╣рдордиреЗ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕рд╣рд╛рдпрдХ рдлрд╝рдВрдХреНрд╢рди
getBy
рд▓рд┐рдЦрд╛ рд╣реИред рдЕрдкрдиреЗ рдирд╛рдо рд╕реЗ рдЫрд╛рддреНрд░ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╡рд╕реНрддреБ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдлреЙрд░реНрдо
getBy(model, "name", "Harry")
рдПрдХ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдЗрдП рдЗрд╕ рддрдВрддреНрд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ (рдпрд╣рд╛рдВ, рдХреЛрдб рдХреЛ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕рд░рдгреА рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред
type Student = { name: string; age: number; hasScar: boolean; }; const students: Student[] = [ { name: "Harry", age: 17, hasScar: true }, { name: "Ron", age: 17, hasScar: false }, { name: "Hermione", age: 16, hasScar: false } ]; function getBy(model, prop, value) { return model.filter(item => item[prop] === value)[0] }
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░реНрдп рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкреНрд░рдХрд╛рд░ рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЙрдирдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХрд╛ рдорддрд▓рдм рдпрд╣ рднреА рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЯрд╛рдЗрдк-рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕реЗ рдареАрдХ рдХрд░реЗрдВред
function getBy(model: Student[], prop: string, value): Student | null { return model.filter(item => item[prop] === value)[0] || null } const result = getBy(students, "name", "Hermione") // result: Student
рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░рд╛ рдлрдВрдХреНрд╢рди рдкрд╣рд▓реЗ рд╕реЗ рдХрд╛рдлреА рдмреЗрд╣рддрд░ рд▓рдЧ рд░рд╣рд╛ рд╣реИред рд╕рдВрдХрд▓рдХ рдЕрдм рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдЕрдкреЗрдХреНрд╖рд┐рдд рдкрд░рд┐рдгрд╛рдо рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИ, рдпрд╣ рдмрд╛рдж рдореЗрдВ рдХрд╛рдо рдЖрдПрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд╛рд░реНрдп рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреА рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХрд╛ рддреНрдпрд╛рдЧ рдХрд┐рдпрд╛ред рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдореЗрдВ рдХрднреА рдХреБрдЫ рдЕрдиреНрдп рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдпрд╣ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕реБрдзрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣реИред
рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ, рдЕрдиреНрдп рджреГрдврд╝рддрд╛ рд╕реЗ рдЯрд╛рдЗрдк рдХреА рдЧрдИ рднрд╛рд╖рд╛рдУрдВ рдХреА рддрд░рд╣, рд╣рдо рдЬреЗрдирд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ "рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░", "рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдкреНрд░рдХрд╛рд░", "рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг" рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдирд┐рдпрдорд┐рдд рдЪрд░ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдореВрд▓реНрдп рдХреЗ рдмрдЬрд╛рдп, рдЗрд╕рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реЛрддреА рд╣реИред рд╣рдо рдЕрдкрдиреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рддрд╛рдХрд┐
Student
рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрдЬрд╛рдп рдпрд╣ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдкреНрд░рдХрд╛рд░
T
рдЙрдкрдпреЛрдЧ рдХрд░реЗ
T
function getBy<T>(model: T[], prop: string, value): T | null { return model.filter(item => item[prop] === value)[0] } const result = getBy<Student>(students, "name", "Hermione") // result: Student
рдмреНрдпреВрдЯреА! рдЕрдм рдлрд╝рдВрдХреНрд╢рди рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ рд╣реИ, рдЬрдмрдХрд┐ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдЕрднреА рднреА рд╣рдорд╛рд░реА рддрд░рдл рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдХреА рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ рдореЗрдВ
Student
рдкреНрд░рдХрд╛рд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЬреЗрдиреЗрд░рд┐рдХ
T
ред рдпрд╣ рд╕рдВрднрд╡ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдВрдХрд▓рдХ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╣рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╢реЛрдзрди рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред
рддреЛ рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдПрдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдп рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдЕрднреА рднреА рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рджреВрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреЗ рд╕рдордп рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ рдФрд░
"name"
рдмрдЬрд╛рдп
"name"
рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ? рдлрд╝рдВрдХреНрд╢рди рдРрд╕рд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдЧрд╛ рдЬреИрд╕реЗ рдХрд┐ рдЖрдк рдЬрд┐рд╕ рдЫрд╛рддреНрд░ рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╡рд╣ рдмрд╕ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╕рдмрд╕реЗ рдЕрдкреНрд░рд┐рдп рд░реВрдк рд╕реЗ, рдпрд╣ рдХрд┐рд╕реА рднреА рддреНрд░реБрдЯрд┐ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд▓рдВрдмреА рдЕрд╡рдзрд┐ рдХреЗ рдбрд┐рдмрдЧрд┐рдВрдЧ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рдРрд╕реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдФрд░ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддреЗ рд╣реИрдВ,
P
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐
P
рдЯрд╛рдЗрдк
T
рдХреА рдПрдХ рдХреБрдВрдЬреА рд╣реЛ, рдЗрд╕рд▓рд┐рдП, рдпрджрд┐
Student
рдпрд╣рд╛рдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐
P
рд╕реНрдЯреНрд░рд┐рдВрдЧ
"name"
,
"age"
рдпрд╛
"hasScar"
ред рдпрд╣рд╛рдБ рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИред
function getBy<T, P extends keyof T>(model: T[], prop: P, value): T | null { return model.filter(item => item[prop] === value)[0] || null } const result = getBy(students, "naem", "Hermione") // Error: Argument of type '"naem"' is not assignable to parameter of type '"name" | "age" | "hasScar"'.
рдЬреЗрдиреЗрд░рд┐рдХ рдФрд░
keyof
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдПрдХ рдмрд╣реБрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЪрд╛рд▓ рд╣реИред рдпрджрд┐ рдЖрдк рдПрдХ рдЖрдИрдбреАрдИ рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬреЛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рддреЛ рддрд░реНрдХреЛрдВ рдХреЛ рджрд░реНрдЬ рдХрд░рдХреЗ, рдЖрдк рд╕реНрд╡рддрдГ рдкреВрд░реНрдгрддрд╛ рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рд▓рд╛рдн рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдордиреЗ рдЕрднреА рддрдХ
getBy
рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдЙрд╕рдХрд╛ рдПрдХ рддреАрд╕рд░рд╛ рддрд░реНрдХ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣рдордиреЗ рдЕрднреА рддрдХ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдпрд╣ рд╣рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рднреА рд╢реЛрднрд╛ рдирд╣реАрдВ рджреЗрддрд╛ред рдЕрдм рддрдХ, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рдирд╣реАрдВ рдЬрд╛рди рд╕рдХрддреЗ рдереЗ рдХрд┐ рдпрд╣ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рджреВрд╕рд░реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрдпрд╛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрдм, рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕
P
рдЯрд╛рдЗрдк рд╣реИ, рд╣рдо рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рддреАрд╕рд░реЗ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рддреАрд╕рд░реЗ рддрд░реНрдХ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдЕрдВрддрддрдГ
T[P]
ред рдирддреАрдЬрддрди, рдЕрдЧрд░
T
Student
, рдФрд░
P
рдХреА
"age"
, рддреЛ
T[P]
рдЯрд╛рдЗрдк
number
ред
function getBy<T, P extends keyof T>(model: T[], prop: P, value: T[P]): T | null { return model.filter(item => item[prop] === value)[0] || null } const result = getBy(students, "age", "17") // Error: Argument of type '"17"' is not assignable to parameter of type 'number'. const anotherResult = getBy(students, "hasScar", "true") // Error: Argument of type '"true"' is not assignable to parameter of type 'boolean'. const yetAnotherResult = getBy(students, "name", "Harry") //
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЕрдм рдЖрдкрдХреЛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЬреЗрдирд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╕рдордЭ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдпрд╣рд╛рдВ рдмрддрд╛рдП рдЧрдП рдХреЛрдб рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк
рдпрд╣рд╛рдВ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред
рдореМрдЬреВрджрд╛ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░
рдХрднреА-рдХрднреА рд╣рдо рдЙрди рдбреЗрдЯрд╛ рдпрд╛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд╣рдо рдмрджрд▓ рдирд╣реАрдВ рд╕рдХрддреЗред рдЖрдкрдХреЛ рдорд╛рдирдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ -
window
рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдХреБрдЫ рд╕рдВрдкрддреНрддрд┐ рдЬреЛрдбрд╝реЗрдВ, рдпрд╛
Express
рдЬреИрд╕реЗ рдХреБрдЫ рдмрд╛рд╣рд░реА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВред рдФрд░ рджреЛрдиреЛрдВ рд╣реА рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрдкрдХреЗ рдкрд╛рд╕ рдЙрд╕ рд╡рд╕реНрддреБ рдХреЛ рд╕реАрдзреЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЖрдк рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рд╣рдо рдЙрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдорд╛рдзрд╛рди рдкрд░ рдзреНрдпрд╛рди рджреЗрдВрдЧреЗ рдЬреЛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА
getBy
рдЧрдП
getBy
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЬреЛрдбрд╝рдХрд░ рд╣реИред рдпрд╣ рд╣рдореЗрдВ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдлрд┐рд▓рд╣рд╛рд▓, рд╣рдо рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдорд╛рдирдХ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ рдпрд╛ рдмреБрд░рд╛, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░рд╛ рдореБрдЦреНрдп рд▓рдХреНрд╖реНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рддрд╣рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рд╣реИред
рдпрджрд┐ рд╣рдо
Array
рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрдХрд▓рдХ рдХреЛ рдпрд╣ рдмрд╣реБрдд рдкрд╕рдВрдж рдирд╣реАрдВ рдЖрдПрдЧрд╛:
Array.prototype.getBy = function <T, P extends keyof T>( this: T[], prop: P, value: T[P] ): T | null { return this.filter(item => item[prop] === value)[0] || null; }; // Error: Property 'getBy' does not exist on type 'any[]'. const bestie = students.getBy("name", "Ron"); // Error: Property 'getBy' does not exist on type 'Student[]'. const potionsTeacher = (teachers as any).getBy("subject", "Potions") // ... ?
рдпрджрд┐ рд╣рдо рд╕рдордп-рд╕рдордп рдкрд░
as any
рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдХрд▓рдХ рдХреЛ рдЖрд╢реНрд╡рд╕реНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЕрдкрдиреЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдХреА рдЧрдИ рд╣рд░ рдЪреАрдЬ рдХреЛ рд╢реВрдиреНрдп рдХрд░ рджреЗрдВрдЧреЗред рдХрдВрдкрд╛рдЗрд▓рд░ рдЪреБрдк рд╣реЛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдЖрдк рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рд╕рдХрддреЗ рд╣реИрдВред
рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдХрд┐
Array
рдЯрд╛рдЗрдк рдХреЛ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛рдП, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВ рдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ рдЬрдм рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рджреЛ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛрдб рдореЗрдВ рдореМрдЬреВрдж рд╣реЛрдВред рдпрд╣рд╛рдВ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рдПрдХ рд╕рд░рд▓ рдпреЛрдЬрдирд╛ рд▓рд╛рдЧреВ рдХреА рдЧрдИ рд╣реИред рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ рд╡рд┐рдЬреНрдЮрд╛рдкрди рд╕рдВрдпреЛрдЬрд┐рдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рдпрджрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рд╕рдВрдпреЛрдЬрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рддреЛ рд╕рд┐рд╕реНрдЯрдо рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрдЧрд╛ред
рддреЛ рдпрд╣ рдХреЛрдб рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
interface Wand { length: number } interface Wand { core: string } const myWand: Wand = { length: 11, core: "phoenix feather" }
рдФрд░ рдпрд╣ рдПрдХ рдирд╣реАрдВ рд╣реИ:
interface Wand { length: number } interface Wand { length: string }
рдЕрдм, рдЗрд╕рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдПрдХ рд╕рд░рд▓ рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЕрд░реНрдерд╛рддреН, рд╣рдо рд╕рднреА рдХреЛ
Array<T>
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░
getBy
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЗрд╕рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред
interface Array<T> { getBy<P extends keyof T>(prop: P, value: T[P]): T | null; } Array.prototype.getBy = function <T, P extends keyof T>( this: T[], prop: P, value: T[P] ): T | null { return this.filter(item => item[prop] === value)[0] || null; }; const bestie = students.getBy("name", "Ron"); // ! const potionsTeacher = (teachers as any).getBy("subject", "Potions") //
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛрдб рдЖрдкрдХреЛ рдореЙрдбреНрдпреВрд▓ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП,
Array
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╡реИрд╢реНрд╡рд┐рдХ рджрд╛рдпрд░реЗ рддрдХ рдкрд╣реБрдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЖрдк
declare global
рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдВрджрд░ рдкрд░рд┐рднрд╛рд╖рд╛ рд░рдЦрдХрд░ рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:
declare global { interface Array<T> { getBy<P extends keyof T>(prop: P, value: T[P]): T | null; } }
рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдмрд╛рд╣рд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ
namespace
рддрдХ рдкрд╣реБрдБрдЪ рдХреА рд╣реЛрдЧреАред
Express
рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ
Request
рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
userId
рдлрд╝реАрд▓реНрдб рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
declare global { namespace Express { interface Request { userId: string; } } }
рдЖрдк рдЗрд╕ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдХреЛрдб рдХреЗ рд╕рд╛рде рдпрд╣рд╛рдВ рдкреНрд░рдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ
рд╣реИрдВ ред
рдкрд░рд┐рдгрд╛рдо
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдордиреЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЬреЗрдиреЗрд░рд┐рдХ рдФрд░ рдЯрд╛рдЗрдк рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрдХрдиреАрдХреЛрдВ рдХреЛ рджреЗрдЦрд╛ред рд╣рдо рдЖрд╢рд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдЬ рдЖрдкрдиреЗ рдЬреЛ рд╕реАрдЦрд╛ рд╣реИ рд╡рд╣ рдЖрдкрдХреЛ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп, рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рдФрд░ рдЯрд╛рдЗрдк-рд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред
рдкреНрд░рд┐рдп рдкрд╛рдардХреЛрдВ! рдЖрдк рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕рд╛ рдорд╣рд╕реВрд╕ рдХрд░рддреЗ рд╣реИрдВ?
