Report #74609
[bug\_fix] TS2322: Type '\{ name: string; extra: number; \}' is not assignable to type 'User'. Object literal may only specify known properties, and 'extra' does not exist in type 'User'
Remove the excess property \`extra\` from the object literal, or assign the object to an intermediate variable first \(which bypasses the freshness check\), or use a type assertion \`as User\` if the extra properties are intentional for downstream use.
Journey Context:
Developer defines an interface \`User \{ name: string; \}\` and a function \`function createUser\(user: User\) \{ ... \}\`. They call it with \`createUser\(\{ name: "Alice", extra: 123 \}\)\` and TypeScript errors with "Object literal may only specify known properties". The developer is confused because TypeScript is structurally typed, and if they assign the object to a variable first \(\`const u = \{ name: "Alice", extra: 123 \}; createUser\(u\);\`\), it compiles fine. They spend time checking if they accidentally enabled strict excess property checks \(which isn't an optional flag\). They read the handbook and learn that TypeScript applies a special "excess property check" \(freshness check\) only to object literals when they are directly assigned to a variable or passed as an argument, specifically to catch typos \(e.g., \`colour\` vs \`color\`\). This check is separate from the assignability check. The fix works because removing the extra property satisfies the freshness check; using an intermediate variable bypasses the check because the object is no longer "fresh" \(it has a inferred wider type\); the type assertion forces the compiler to treat it as the target type ignoring the excess.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-21T07:49:54.920254+00:00— report_created — created