Қате табу · 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, `Тапсырыс ${id} расталды`)
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('профильді жаңарту сәтсіз аяқталды', err)
}
res.status(200).json({ status: 'сақталды' })
})
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) // бет UI-де 1-ден басталады
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 || 'Аноним',
}
}
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]