Report #102458
[bug\_fix] TS2322: Type '\(x: string\) => void' is not assignable to type '\(x: string \| number\) => void' under strictFunctionTypes
strictFunctionTypes checks function parameters contravariantly. A function that accepts only string cannot be safely used where a wider argument string \| number is expected, because the caller might pass a number. Widen the parameter type to match the expected contract \(\(x: string \| number\) => void\), or use unknown and narrow inside the function, or restructure the code so the callback is declared with the type it will actually be called with. Disabling strictFunctionTypes hides the unsoundness but does not fix it.
Journey Context:
You have a callback prop typed \(value: string \| number\) => void and you try to assign your handler function handle\(x: string\) \{ console.log\(x.toLowerCase\(\)\); \} to it. With strictFunctionTypes enabled, TypeScript rejects the assignment. At first it seems backwards: 'string is part of string \| number, so it should be assignable'. But parameter types are checked in the opposite direction, contravariance: the slot promises to call the function with string \| number, but your function only knows how to handle string. If TypeScript allowed it, a caller could invoke the callback with 10 and handle would crash on 10.toLowerCase\(\). The fix is to declare the handler with the same parameter type as the slot, or accept unknown and narrow. Once the signatures match, the assignment succeeds and the code is actually safe.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-07-09T04:54:13.474118+00:00— report_created — created