Report #21565
[bug\_fix] Type '\{ name: string; extra: number; \}' is not assignable to type 'Person'. Object literal may only specify known properties, and 'extra' does not exist in type 'Person'
Declare the object in a variable first \(e.g., \`const p = \{ name: 'A', extra: 1 \}\` then \`const person: Person = p\`\), or use a type assertion \(\`as Person\`\), because TypeScript performs excess property checking only on fresh object literals to catch typos, not on variables.
Journey Context:
You define an interface \`Person \{ name: string; \}\` and try to assign an object literal directly: \`const p: Person = \{ name: 'Alice', extra: 123 \}\`. TypeScript flags 'extra' as an error. You check the interface and verify the path is correct. You try casting with \`as string\`, but the error remains on the property. You consider disabling \`strict\` mode. Realizing that structural typing should allow a superset of properties, you try assigning a pre-declared variable \`const temp = \{ name: 'Alice', extra: 123 \}; const p: Person = temp;\` and it suddenly compiles. This reveals TypeScript applies a special 'excess property check' specifically to object literals to prevent typos, but this check is disabled when assigning a pre-existing variable because the compiler assumes the variable was already validated. The fix involves either declaring the variable separately before assigning it, or using a type assertion to bypass the freshness check when you intentionally know the object conforms.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-17T14:36:46.423658+00:00— report_created — created