рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдЪреНрдЫ рдХреЛрдб - рднрд╛рдЧ 2

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



рдСрдмреНрдЬреЗрдХреНрдЯ рдФрд░ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдВ


рдкреНрд░рддрд┐рд░рдХреНрд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


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


рдЦрд░рд╛рдм:


 interface Config { host: string; port: string; db: string; } 

рдЕрдЪреНрдЫрд╛:


 interface Config { readonly host: string; readonly port: string; readonly db: string; } 

рдХрд┐рд╕реА рд╕рд░рдгреА рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк ReadonlyArray<T> рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ ReadonlyArray<T> -рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░рдгреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЬреЛ push() рдФрд░ fill() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк concat() рдФрд░ slice() рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╡реЗ рдорд╛рди рдирд╣реАрдВ рдмрджрд▓рддреЗ рд╣реИрдВред


рдЦрд░рд╛рдм:


 const array: number[] = [ 1, 3, 5 ]; array = []; // error array.push(100); // array will updated 

рдЕрдЪреНрдЫрд╛:


 const array: ReadonlyArray<number> = [ 1, 3, 5 ]; array = []; // error array.push(100); // error 

рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдХреЗ рддрд░реНрдХ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ 3.4 рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдирд╛ рдереЛрдбрд╝рд╛ рдЖрд╕рд╛рди рд╣реИ ред


 function hoge(args: readonly string[]) { args.push(1); // error } 

рд╢рд╛рдмреНрджрд┐рдХ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд░реАрдпрддрд╛ рдХрд╛ рджрд╛рд╡рд╛ ред


рдЦрд░рд╛рдм:


 const config = { hello: 'world' }; config.hello = 'world'; //   const array = [ 1, 3, 5 ]; array[0] = 10; //   //    function readonlyData(value: number) { return { value }; } const result = readonlyData(100); result.value = 200; //   

рдЕрдЪреНрдЫрд╛:


 //     const config = { hello: 'world' } as const; config.hello = 'world'; //  //     const array = [ 1, 3, 5 ] as const; array[0] = 10; //  //        function readonlyData(value: number) { return { value } as const; } const result = readonlyData(100); result.value = 200; //  

рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдо рдЗрдВрдЯрд░рдлреЗрд╕


рдЬрдм рдЖрдкрдХреЛ рд╕рдВрдШ рдпрд╛ рдЪреМрд░рд╛рд╣реЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рддрдм рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЬрдм рдЖрдк extends рдпрд╛ implements рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рд╕рдЦреНрдд рдирд┐рдпрдо рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдЖрдкрдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЙрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП, рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ type рдФрд░ interface рдмреАрдЪ рдЕрдВрддрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЗрди рдЙрддреНрддрд░реЛрдВ рдХреЛ рджреЗрдЦреЗрдВред


рдЦрд░рд╛рдм:


 interface EmailConfig { // ... } interface DbConfig { // ... } interface Config { // ... } //... type Shape = { // ... } 

рдЕрдЪреНрдЫрд╛:


 type EmailConfig = { // ... } type DbConfig = { // ... } type Config = EmailConfig | DbConfig; // ... interface Shape { // ... } class Circle implements Shape { // ... } class Square implements Shape { // ... } 

рдХрдХреНрд╖рд╛рдПрдВ


рдХрдХреНрд╖рд╛рдПрдВ рдЫреЛрдЯреА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП


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


рдЦрд░рд╛рдм:


 class Dashboard { getLanguage(): string { /* ... */ } setLanguage(language: string): void { /* ... */ } showProgress(): void { /* ... */ } hideProgress(): void { /* ... */ } isDirty(): boolean { /* ... */ } disable(): void { /* ... */ } enable(): void { /* ... */ } addSubscription(subscription: Subscription): void { /* ... */ } removeSubscription(subscription: Subscription): void { /* ... */ } addUser(user: User): void { /* ... */ } removeUser(user: User): void { /* ... */ } goToHomePage(): void { /* ... */ } updateProfile(details: UserDetails): void { /* ... */ } getVersion(): string { /* ... */ } // ... } 

рдЕрдЪреНрдЫрд╛:


 class Dashboard { disable(): void { /* ... */ } enable(): void { /* ... */ } getVersion(): string { /* ... */ } } //  ,       // ... 

рдЙрдЪреНрдЪ рд╕рд╛рдордВрдЬрд╕реНрдп рдХрдо рдмрдВрдзрди


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


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


рдЦрд░рд╛рдм:


 class UserManager { // :         . //   ,    ,    //      ,     , //       `emailSender`. constructor( private readonly db: Database, private readonly emailSender: EmailSender) { } async getUser(id: number): Promise<User> { return await db.users.findOne({ id }); } async getTransactions(userId: number): Promise<Transaction[]> { return await db.transactions.find({ userId }); } async sendGreeting(): Promise<void> { await emailSender.send('Welcome!'); } async sendNotification(text: string): Promise<void> { await emailSender.send(text); } async sendNewsletter(): Promise<void> { // ... } } 

рдЕрдЪреНрдЫрд╛:


 class UserService { constructor(private readonly db: Database) { } async getUser(id: number): Promise<User> { return await this.db.users.findOne({ id }); } async getTransactions(userId: number): Promise<Transaction[]> { return await this.db.transactions.find({ userId }); } } class UserNotifier { constructor(private readonly emailSender: EmailSender) { } async sendGreeting(): Promise<void> { await this.emailSender.send('Welcome!'); } async sendNotification(text: string): Promise<void> { await this.emailSender.send(text); } async sendNewsletter(): Promise<void> { // ... } } 

рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдкрд░ рд░рдЪрдирд╛ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдВ


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


рддрдм рдЖрдк рдкреВрдЫ рд╕рдХрддреЗ рд╣реИрдВ: "рдореБрдЭреЗ рд╡рд┐рд░рд╛рд╕рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдм рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?" рдпрд╣ рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд╕рднреНрдп рд╕реВрдЪреА рд╣реИ рдЬрдм рд╡рд┐рд░рд╛рд╕рдд рд░рдЪрдирд╛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ:


  1. рдЖрдкрдХрд╛ рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдПрдХ "рд╣реИ-рдПрдХ" рд╕рдВрдмрдВрдз рд╣реИ рдФрд░ "рдПрдХ" рд╕рдВрдмрдВрдз рдирд╣реАрдВ рд╣реИ (рдорд╛рдирд╡-> рдкрд╢реБ рдмрдирд╛рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-> рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рд╡рд┐рд╡рд░рдг)ред
  2. рдЖрдк рдмреЗрд╕ рдХрдХреНрд╖рд╛рдУрдВ рд╕реЗ рдХреЛрдб рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рд▓реЛрдЧ рд╕рднреА рдЬрд╛рдирд╡рд░реЛрдВ рдХреА рддрд░рд╣ рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ)ред
  3. рдЖрдк рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХреЛ рдмрджрд▓рдХрд░ рд╡реНрдпреБрддреНрдкрдиреНрди рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рд╡реИрд╢реНрд╡рд┐рдХ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред (рдЙрдиреНрд╣реЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╕рдордп рд╕рднреА рдЬрд╛рдирд╡рд░реЛрдВ рдореЗрдВ рдХреИрд▓реЛрд░реА рд╡реНрдпрдп рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди)ред

рдЦрд░рд╛рдм:


 class Employee { constructor( private readonly name: string, private readonly email: string) { } // ... } // ,   Employees ""  . EmployeeTaxData    Employee class EmployeeTaxData extends Employee { constructor( name: string, email: string, private readonly ssn: string, private readonly salary: number) { super(name, email); } // ... } 

рдЕрдЪреНрдЫрд╛:


 class Employee { private taxData: EmployeeTaxData; constructor( private readonly name: string, private readonly email: string) { } setTaxData(ssn: string, salary: number): Employee { this.taxData = new EmployeeTaxData(ssn, salary); return this; } // ... } class EmployeeTaxData { constructor( public readonly ssn: string, public readonly salary: number) { } // ... } 

рдХреЙрд▓ рдЪреЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


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


рдЦрд░рд╛рдм:


 class QueryBuilder { private collection: string; private pageNumber: number = 1; private itemsPerPage: number = 100; private orderByFields: string[] = []; from(collection: string): void { this.collection = collection; } page(number: number, itemsPerPage: number = 100): void { this.pageNumber = number; this.itemsPerPage = itemsPerPage; } orderBy(...fields: string[]): void { this.orderByFields = fields; } build(): Query { // ... } } // ... const queryBuilder = new QueryBuilder(); queryBuilder.from('users'); queryBuilder.page(1, 100); queryBuilder.orderBy('firstName', 'lastName'); const query = queryBuilder.build(); 

рдЕрдЪреНрдЫрд╛:


 class QueryBuilder { private collection: string; private pageNumber: number = 1; private itemsPerPage: number = 100; private orderByFields: string[] = []; from(collection: string): this { this.collection = collection; return this; } page(number: number, itemsPerPage: number = 100): this { this.pageNumber = number; this.itemsPerPage = itemsPerPage; return this; } orderBy(...fields: string[]): this { this.orderByFields = fields; return this; } build(): Query { // ... } } // ... const query = new QueryBuilder() .from('users') .page(1, 100) .orderBy('firstName', 'lastName') .build(); 

рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП ...

Source: https://habr.com/ru/post/hi485068/


All Articles