Sobes.tech
Senior

Εντοπίστε το σφάλμα · TypeScript Πονηρά σφάλματα Κάθε ένα από αυτά τα οκτώ αποσπάσματα μεταγλωττίζεται, περνάει μια περιστασιακή ανασκόπηση και φαίνεται καλό. Κάθε ένα κρύβει ένα σφάλμα. Για κάθε ένα: πείτε μας τι σπάει, υπό ποιες συνθήκες — και πώς θα το εντοπίσετε. Σκεφτείτε δυνατά. Ενδιαφερόμαστε για το πώς διαβάζετε τον κώδικα, όχι για χρονόμετρο. Είναι εντάξει να μην το πετύχετε σε όλα. 01 Κάνοντας μια παραγγελία interface Notifier { send(to: string, message: string): Promise<void> } class OrderService { constructor(private readonly notifier: Notifier) {} async placeOrder(order: Order): Promise<OrderId> { const id = await this.repo.save(order) this.notifier.send(order.customerEmail, `Order ${id} confirmed`) return id } } 02 Ενημερώνοντας ένα προφίλ app.post('/profile', async (req, res) => { const profile = parseProfile(req.body) try { await db.profiles.update(req.user.id, profile) } catch (err) { logger.warn('profile update failed', err) } res.status(200).json({ status: 'saved' }) }) 03 Διαγράφοντας ένα σχόλιο app.delete('/comments/:id', requireAuth, async (req, res) => { const comment = await db.comments.findById(req.params.id) if (!comment) { return res.status(404).end() } await db.comments.delete(comment.id) res.status(204).end() }) 04 Σελιδοποίηση μιας λίστας function paginate<T>(items: T[], page: number, pageSize: number): T[] { const start = page * pageSize const end = start + pageSize return items.slice(start, end) } // καλούν const results = paginate(rows, page, 20) // η σελίδα ξεκινάει από 1 στο UI 05 Φόρτωση άρθρων με συγγραφείς async function loadArticlesWithAuthors(): Promise<ArticleView[]> { const articles = await db.query('SELECT * FROM articles WHERE published = true') const views: ArticleView[] = [] for (const article of articles) { const author = await db.query('SELECT * FROM users WHERE id = $1', [article.authorId]) views.push({ ...article, author: author[0] }) } return views } 06 Επίλυση προεπιλογών διαμόρφωσης interface Settings { retryLimit?: number displayName?: string } function resolveConfig(s: Settings) { return { retryLimit: s.retryLimit || 3, displayName: s.displayName || 'Anonymous', } } 07 Δοκιμή βοηθητικού υπολογισμού έκπτωσης function applyDiscount(price: number, percent: number): number { return price - price * (percent / 100) } describe('applyDiscount', () => { it('εφαρμόζει μια έκπτωση', () => { const spy = vi.fn().mockReturnValue(90) const result = spy(100, 10) expect(result).toBeDefined() expect(result).toBe(90) }) }) 08 Υπολογισμός κορυφαίων βαθμολογιών function topScores(scores: number[], take = 3): number[] { return scores.sort((a, b) => b - a).slice(0, take) } const results = [4, 1, 9, 2] const podium = topScores(results) // ... αργότερα, αλλού: renderRawResults(results) // αναμενόμενο [4, 1, 9, 2]