Repository navigation
TS 3.9 - No overload matches this call #38241
Description
TypeScript Version: 3.9.1-rc
Search Terms:
No overload matches this call
Code
export interface SyncNgccOptions {
basePath: string;
targetEntryPointPath?: string;
async?: false;
}
export type AsyncNgccOptions = Omit<SyncNgccOptions, 'async'> & { async: true };
export function process(options: AsyncNgccOptions): Promise<void>;
export function process(options: SyncNgccOptions): void;
export function process(options: AsyncNgccOptions | SyncNgccOptions): void | Promise<void> {
return mainNgcc(options);
}
export function mainNgcc(options: AsyncNgccOptions): Promise<void>;
export function mainNgcc(options: SyncNgccOptions): void;
export function mainNgcc(options: AsyncNgccOptions | SyncNgccOptions): void | Promise<void> {
}Expected behavior:
No error as per TS 3.8
Actual behavior:
Error
No overload matches this call. Overload 1 of 2, '(options: AsyncNgccOptions): Promise', gave the following error. Argument of type 'SyncNgccOptions | AsyncNgccOptions' is not assignable to parameter of type 'AsyncNgccOptions'. Type 'SyncNgccOptions' is not assignable to type 'AsyncNgccOptions'. Type 'SyncNgccOptions' is not assignable to type '{ async: true; }'. Types of property 'async' are incompatible. Type 'false | undefined' is not assignable to type 'true'. Type 'undefined' is not assignable to type 'true'. Overload 2 of 2, '(options: SyncNgccOptions): void', gave the following error. Argument of type 'SyncNgccOptions | AsyncNgccOptions' is not assignable to parameter of type 'SyncNgccOptions'. Type 'AsyncNgccOptions' is not assignable to type 'SyncNgccOptions'. Types of property 'async' are incompatible. Type 'true' is not assignable to type 'false | undefined'.
Related Issues:
Activity
kitsonk commentedon Apr 29, 2020
It is a breaking changed covered in #37195.
async?being optional is causing your problem. It was unsound code before that is now being caught.petebacondarwin commentedon Apr 29, 2020
This convoluted typing was created because we could not work out a better way to support a function that if invoked with
async: truewould return aPromiseorvoidotherwise.Kitson Kelly (@kitsonk) - do you have a suggestion for how we can support this scenario?
gkalpak commentedon Apr 29, 2020
I think we just need to define one extra overload (although I would expect TS to be able to infer that on its own 😞):
export function mainNgcc(options: AsyncNgccOptions): Promise<void>; export function mainNgcc(options: SyncNgccOptions): void; +export function mainNgcc(options: AsyncNgccOptions | SyncNgccOptions): void | Promise<void>; export function mainNgcc(options: AsyncNgccOptions | SyncNgccOptions): void | Promise<void> { // ... }See https://www.typescriptlang.org/v2/en/play?ts=3.9.0-beta#code/KYDwDg9gTgLgBASwHY2FAZgQwMbDgZQE8lsA5Ac22wHkwYEIkBnOAbwCg4u4AjTJ4AAVMMABYAuOExhRk5ANyduMTFHLAYAURRRCgiMhjCxAfknTZSBUq79i2M3CwAbAYoC+7dqEiw4MQjA8AEEmewoqWnpGFgBeOGoAWwQYAB4iEgiaOgZmABo4AHI7EkKAPjgAMjY4EuxJGQBXPHdFb3BoeHRGkmikODAoCFwmJgAKCByYyVDwymy+pgBKSUEh5IFUgDcDABMyxR9Opx7sPoGhkfHJxckMsnmo3OXJHYRdw46-bt7ci+HgKMJlNmDMwplHiCWAAfAhzSJQlZwN67OCwtYQDbAbZ7CocbhwKAaRpQfqJTDILLAxZLDxedq+Lqnc7kynzanPMHwhbPJEYrE494HBnHH5nP6spBUm6cuEQhE0157T6Mk6-RhwSXSqFc+U8mJouUPBW8pXvQ38hCbFHCo7fZkSilS9ky6ZwWZ6p4G2H3LJe5hIlEW9ZW7E2tjsTzsbAxeBiK0ASSYADU9nB4lr2aw+AJjBIiugIBBCu5adHY-5RImU3sAEzpzVOqnZ-hCET5wqF4sFOqSFwCUuKGPMONVphJy0CBuZqhjFu59uSTtFwo98H1fxQZqDrzD6SV6up97BVwQBuDAFA+dtsRLvhQEtlvejw91k9MM-xC9XOc5m8d+9V1qdc+0wVxgB3Z8D3HJhJ2Ad9P3+H9rzzO9VCA3tN23MsgA.
DanielRosenwasser commentedon Apr 29, 2020
I'm tempted to mark
Working as Intendedbut I'm not totally clear exactly whyOmit<..., "async"> & { async: true }causes issues. Anders Hejlsberg (@ahejlsberg) care to weigh in?kitsonk commentedon Apr 29, 2020
Daniel Rosenwasser (@DanielRosenwasser) not to step on Ander's toes, but I believe it is very intentional, because #37195 was specifically to fix unsafe situations with
Omitand intersection types brought up in #36604.DanielRosenwasser commentedon Apr 29, 2020
Oh, I see - I wasn't looking at where the error was being issued. This makes sense.
George Kalpakas (@gkalpak) technically you could condense the whole thing down to
alan-agius4 commentedon Apr 30, 2020
Thanks guys for your input.
gkalpak commentedon Apr 30, 2020
Thx, Daniel Rosenwasser (@DanielRosenwasser)!
FWIW, I still find overloads more readable (and wish TypeScript would recognize the 3rd overload signature from the implementation):