microsoft / microsoft/TypeScript
Allow calls to overloaded functions when all possible combinations of union type parameters resolve to valid overloads
Nessuno ha ancora preso questa issue.
- Lingua principale
- Go
- Stelle
- 111k
- Fork
- 14.3k
- Merge medio
- 1g 19h
- PR unite (30g)
- 117
Descrizione
TypeScript Version: 2.4.1
Code
Case 1
// overloaded functions
declare function f(a: number): number;
declare function f(a: string): string;
function g<T extends number | string>(a: T) {
return f(a); // either of arguments is acceptable
// ~
// Argument of type 'T' is not assignable to parameter of type 'string'.
// Type 'string | number' is not assignable to type 'string'.
// Type 'number' is not assignable to type 'string'.
}
Case 2
declare function f2<T>(a: Promise<T>): number;
declare function f2<T>(a: T): string;
function g2<T>(a: T) {
const result: string = f2(a); // first overload is ignored, but the argument can be a Promise
return result;
}
Expected behavior:
Case 1: compiles with no errors
Case 2: error that type string | number is not assignable to type string
Actual behavior:
Case 1: error
Argument of type 'T' is not assignable to parameter of type 'string'.
Type 'string | number' is not assignable to type 'string'.
Type 'number' is not assignable to type 'string'
Case 2: compiles without errors
Note
I remember here were some discussions about that, so that verifying all possible paths may result in N*M complexity (N overloads, M constituent types in unions). I could not find it.
The second case seems unsafe at all, because skips a possibly valid overload which may effect on return type. I expect that f2(a) would be of type number | string because either of these two overloads can play. It actually has the same result with a: any.
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Riproduci entrambi gli snippet dell'issue usando TypeScript 2.4.1 e confronta le diagnosi attuali e i tipi restituiti inferiti. Analizza la risoluzione degli overload per gli argomenti generici e con tipo union; il lavoro è completato quando Case 1 compila, mentre Case 2 segnala che string | number non può essere assegnato a string.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- typescript
- Ambito
- compilers
- Tipo di issue
- Bug
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Stato di attività
- Ferma
- Chiarezza
- Specificata chiaramente
- Idoneità per principianti
- 35/100