Report #9308
[bug\_fix] TS2345: Type '\(x: Specific\) => void' is not assignable to type '\(x: General\) => void'. Types of parameters 'x' and 'x' are incompatible.
Either disable \`strictFunctionTypes\` \(not recommended\), or change the expected type to match the contravariant requirement \(the function parameter type should be wider, not narrower\), or use method syntax \`handler\(x: Event\)\` instead of property function \`handler: \(x: Event\) => void\` \(methods allow bivariance for backward compatibility\).
Journey Context:
You enable \`strict: true\` in an existing codebase. Suddenly, event handler assignments fail: \`element.addEventListener\('click', \(e: MouseEvent\) => \{ ... \}\)\` gives an error when the handler expects \`Event\`. You think "MouseEvent extends Event, so it should be fine." But the error says MouseEvent is not assignable to Event in the parameter position. You learn that with \`strictFunctionTypes\` \(part of strict mode\), function parameters are checked contravariantly, not bivariantly. This means a function that accepts a specific type \(MouseEvent\) cannot be assigned to a variable expecting a function that accepts a general type \(Event\), because the assigned function might receive an Event that is not a MouseEvent and crash. The fix is either to accept the wider type in your handler \`\(e: Event\) => \{ const me = e as MouseEvent; ... \}\` or to use method syntax if defining a class interface \(methods are exempt from strict function types for backward compatibility with existing patterns like Array.forEach\). You refactor to use the wider type and the error clears.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T07:48:54.433141+00:00— report_created — created