Provyn Prep · 9 min read
How to pass the Provyn JavaScript/TypeScript assessment
Sixty minutes, fifteen questions mixing MCQ, short-answer, and live code execution. The assessment is language-pragmatic — it cares about runtime behaviour, not stylistic preferences.
What you will be tested on
- Closures, scope, and the module pattern
- Prototypal inheritance and class syntax
- Promises, async/await, and the event loop microtask queue
- Array/object destructuring and spread operator edge cases
- TypeScript: generics, conditional types, mapped types, type narrowing
- Error handling and structured try/catch patterns
What the assessment tests
The JS/TS assessment is not about knowing which method does what — it is about knowing what actually happens at runtime. Questions are built around common bugs: unexpected reference sharing, closure traps, Promise chaining mistakes, and TypeScript type errors that only appear when conditional paths combine.
TypeScript sections weight heavily toward discriminated unions, mapped types, and utility types (Partial, Required, Record, Exclude). If you know how to use them but not what they produce under the hood, you will lose points on the short-answer questions.
The event loop and async patterns
At least two questions on every attempt are about execution order. You will be shown a snippet mixing setTimeout, Promise.resolve, and async/await, and asked what the console output will be. The canonical answer requires knowing that microtasks (Promise callbacks) flush before macrotasks (setTimeout callbacks).
Common trap: await inside a forEach. The forEach callback is not async-aware. Each iteration fires and moves on; the awaits don't serialize the loop. Use for...of with await, or Promise.all, depending on whether you need serialisation or concurrency.
TypeScript-specific high-value areas
Discriminated unions are the most tested TS topic. If you can write a type guard that narrows a union with a literal discriminant field, you will score well on at least three questions.
Template literal types and infer are tested at the harder end. Know how to extract a string portion from a template literal type and how infer extracts types inside conditionals.
The any vs unknown distinction shows up on almost every attempt. unknown requires an explicit narrowing check before use; any skips type checking entirely. Questions phrase it as 'which type is safer' — the answer is always unknown.
Three-day prep plan
Day one: run the practice mode. Note which questions felt uncertain. Group them by topic: async execution, closure scope, TypeScript type math, or error handling.
Day two: drill your weakest area on TypeScript Playground (for TS questions) or browser console (for runtime order questions). Actually run the code — don't guess.
Day three: review the MDN page for Promise.all, Promise.allSettled, and Promise.race. Know when each is the right choice and what happens when one rejects.
Common point-losing mistakes
Forgetting that let/const are block-scoped. var is function-scoped. The assessment will have at least one question that exploits this difference in a loop.
Confusing == and ===. Even if you know the answer is 'use ===', the question might show == and ask what the output is. You still need to know what == coercion does.
Not reading the TypeScript error message. Short-answer TS questions give you a broken snippet and ask why it fails. Read the error; the answer is usually in the error message itself.
Last updated 2026-05-01.