error TS2769: No overload matches this call. is reported when a function has more than one call signature and the arguments fit none of them. Built-ins such as new Date(), addEventListener, Array.prototype.reduce and String.prototype.replace have several, and so does any function written with @overload tags.
The message continues with one block per signature (Overload 1 of 5 ... gave the following error.). The blocks usually say the same thing in different words; find the signature you meant to call and read its reason. In the example every overload rejects undefined.
At a glance
| Code | TS2769 |
|---|---|
| Message | No overload matches this call. |
| TypeScript's category | error |
| Listed under | Types do not match |
| Turned on by | No option: every checked file reports it |
| In .js files | Reported when the file is checked: checkJs in jsconfig.json, or // @ts-check at the top of the file |
The message is TypeScript's own text from its diagnostic messages file (Apache-2.0).
What it looks like
/** @typedef {{ id: string, shippedAt?: string }} Order */
/** @param {Order} order */
export function shippedOn(order) {
return new Date(order.shippedAt).toLocaleDateString("en-US");error TS2769: No overload matches this call.
Overload 1 of 5, '(value: string | number | Date): Date', gave the following error.
Argument of type 'string | undefined' is not assignable to parameter of type 'string | number | Date'.
Type 'undefined' is not assignable to type 'string | number | Date'.
Overload 2 of 5, '(vd: VarDate): Date', gave the following error.
Argument of type 'string | undefined' is not assignable to parameter of type 'VarDate'.
Type 'undefined' is not assignable to type 'VarDate'.
Overload 3 of 5, '(value: string | number): Date', gave the following error.
Argument of type 'string | undefined' is not assignable to parameter of type 'string | number'.
Type 'undefined' is not assignable to type 'string | number'.
}jsconfig.json for this example
{
"compilerOptions": {
"checkJs": true,
"noEmit": true,
"strict": true,
"target": "es2022",
"module": "nodenext",
"types": []
},
"include": ["*.js"]
} What causes it
- An argument has a type that no signature accepts, often
undefinedfrom an optional property understrictNullChecks. - The number of arguments matches no signature.
- A callback's parameter or return type fits none of the signatures, for example a
reducecallback whose accumulator type does not match the initial value.
How to fix it
Make the argument fit one signature
Check or convert the argument before the call. Once order.shippedAt is known to be a string, the (value: string | number | Date) signature of new Date() matches.
/** @typedef {{ id: string, shippedAt?: string }} Order */
/** @param {Order} order */
export function shippedOn(order) {
if (!order.shippedAt) return "Not shipped yet";
return new Date(order.shippedAt).toLocaleDateString("en-US");
}jsconfig.json for this example
{
"compilerOptions": {
"checkJs": true,
"noEmit": true,
"strict": true,
"target": "es2022",
"module": "nodenext",
"types": []
},
"include": ["*.js"]
} For your own @overload tags, add the missing signature
If the call is legitimate and the function is yours, add an @overload for that combination of arguments, or replace the overloads with one signature that takes a union, which the handbook recommends where it is enough.
Gotchas
- The overload names in the message come from TypeScript's library files;
VarDatein theDateexample is an old Windows Script Host type you can ignore. - Your own functions with
@overloadtags report the same message; the @overload page shows how the signatures are written.
Sources
- More on Functions: Function Overloads · TypeScript handbook
- More on Functions: Writing Good Overloads · TypeScript handbook
- diagnosticMessages.json (TypeScript 5.9.3) · TypeScript on GitHub
Last reviewed 20 October 2026.