Report #9897
[bug\_fix] TS2322: Type '\{ a: string; b: number; \}' is not assignable to type '\{ a: string; \}'. Object literal may only specify known properties, and 'b' does not exist in type '\{ a: string; \}'.
Remove the extra property 'b' from the object literal, or add 'b' to the target type definition. If the extra property is intentional and you need bypass the check for a valid reason \(e.g., extending an interface for a specific use case\), assign the object to an intermediate variable first \(though this loses excess property checking protection\).
Journey Context:
You define an interface \`Config \{ apiKey: string \}\` and pass an object: \`initConfig\(\{ apiKey: 'abc', timeout: 5000 \}\)\`. TypeScript complains that 'timeout' does not exist in type 'Config'. You think "but JavaScript allows extra properties", and try \`const opts = \{ apiKey: 'abc', timeout: 5000 \}; initConfig\(opts\)\` which unexpectedly compiles. You realize TypeScript performs 'excess property checking' only on fresh object literals directly assigned to a typed parameter, to catch typos like \`apKey\` instead of \`apiKey\`. The intermediate variable bypass happens because the variable is widened. You decide to either add \`timeout\` to the Config interface or use an intersection type \`Config & \{ timeout?: number \}\` if the function actually handles that property, understanding that excess property checks are a deliberate freshness check, not a structural subtyping violation.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T09:19:37.719923+00:00— report_created — created