Every Nuxt job in 2026 is a TypeScript job, and the interview question is rarely "what is a generic". It is "type this API response so the wrong usage does not compile", "why does this as cast hide a bug", or "how does the type reach the template". TypeScript 7.0, the Go-based compiler, shipped on 8 July 2026 and made type checking roughly ten times faster without changing the language; knowing what it changed in configuration and what it means for Vue tooling is part of being current.
unknown at boundaries instead of any, literal types instead of stringly-typed options. A senior candidate talks about types as the API contract of a module or component.unknown until a schema validates it. The runtime validation page is where "TypeScript makes it safe" is corrected.as const, from schemas (z.infer), from framework macros (defineProps<T>). Generics exist to preserve information through a function, not to decorate it..nuxt/ (auto-imports, components, typed routes, typed $fetch from server routes, runtimeConfig augmentation), and project references that split app, server and shared type contexts.strict (plus noUncheckedIndexedAccess), verbatimModuleSyntax, moduleResolution: 'bundler', isolatedModules, erasableSyntaxOnly for Node's native type stripping, and the TS 7 defaults and removals.--checkers), new defaults (strict: true, module: esnext, types: [], rootDir: ./), removed legacy options (baseUrl, moduleResolution: node10, target: es5), and a language server rewrite. Vue template checking through the compiler API arrives with 7.1, so Vue projects still run vue-tsc on TypeScript 6 while the tooling catches up (verify).| Page | Question it answers |
|---|---|
| Type system fundamentals | Structural typing, unknown/never, narrowing, literal types, satisfies, strictness |
| Generics and inference | Constraints, infer, conditional and mapped types, template literals, NoInfer, when generics are too much |
| TypeScript with Vue and Nuxt | Macros, generic components, Nuxt's generated types, typed $fetch, augmentation |
| Modules, declarations and config | tsconfig essentials, .d.ts authoring, project references, TypeScript 7 changes |
| Runtime validation and type safety | Schemas at boundaries, z.infer, branded types, exhaustive checks, error typing |
| Typing patterns and smells | The patterns seniors use and the casts, anys and over-generic helpers they flag in review |
The interview task in miniature: an API client whose misuse does not compile.
import { z } from 'zod'
// The response contract exists once, as a schema; the type is derived.
export const productSchema = z.object({
id: z.string(),
name: z.string(),
status: z.enum(['draft', 'published', 'archived']),
price: z.object({ amount: z.number().int(), currency: z.string().length(3) }),
})
export type Product = z.infer<typeof productSchema>
// Illegal states are unrepresentable: a result is either ok with data or an error with a message, never both.
export type Result<T> = { ok: true, data: T } | { ok: false, error: { status: number, message: string } }
export async function getProduct(id: string): Promise<Result<Product>> {
try {
const raw: unknown = await $fetch(`/api/products/${id}`) // unknown until validated
return { ok: true, data: productSchema.parse(raw) }
}
catch (e) {
const status = typeof e === 'object' && e && 'status' in e ? Number((e as { status: unknown }).status) : 500
return { ok: false, error: { status, message: e instanceof Error ? e.message : 'Unknown error' } }
}
}
// Usage: the compiler forces the check before data is touched.
const result = await getProduct('1')
if (result.ok) console.log(result.data.name)
else console.error(result.error.status)
Knowing infer and keyof is not the skill; recognising that a component with type: string should be type: 'primary' | 'secondary' and that a data as Product cast after a fetch is a lie, is. Interviewers probe judgement with code review prompts far more often than with type puzzles.
as Foo), replace it with a schema parse and a Result type, and count the call sites the compiler now forces you to fix.tsc --extendedDiagnostics on a project with TypeScript 6 and, if available, tsgo (TypeScript 7), and compare check times."As the design layer of the code. I model state with discriminated unions so impossible combinations do not compile, type boundaries as unknown and validate them with a schema that also produces the type, derive types from values with as const and satisfies instead of declaring them twice, and reach for generics only when a function needs to preserve information through it. In Vue and Nuxt that means typed props, emits and slots through the macros, generic components, typed routes and $fetch from the generated types, and nuxt typecheck in CI because the build alone does not check. And I keep the compiler fast: strict but not clever, no deep conditional-type gymnastics in application code."
Nothing yet. Notes filed here show up on every page of this section.
Dates, numbers and Intl
Why Date is a trap and how to store and format time correctly across server and client, Temporal, the Intl formatters for dates, numbers, currencies, plurals, lists and relative time, floating point and money, and caching formatters.
Type system fundamentals
Structural typing, unknown versus any versus never, unions and intersections, literal types and as const, narrowing and type guards, satisfies, readonly and tuples, enums versus unions, and the strictness flags that matter.