microsoft / microsoft/TypeScript
bind, call and apply do not work on unions of function types with different return types.
Nessuno ha ancora preso questa issue.
- Lingua principale
- Go
- Stelle
- 111k
- Fork
- 14.3k
- Merge medio
- 2g 4h
- PR unite (30g)
- 132
Descrizione
TypeScript Version: 3.6.3
Search Terms:
call, bind, apply, function, functions, Function.prototype.call, Function.prototype.apply, Function.prototype.bind, union, return, this, strictBindCallApply
Code
type aFn = (this: string, value: string) => string;
type bFn = (this: string, value: string) => Promise<string>;
function callFn(callback: aFn | bFn): Promise<string> | string {
return callback.call("hello", "world");
}
function applyFn(callback: aFn | bFn): Promise<string> | string {
return callback.apply("hello", ["world"]);
}
function bindFn(callback: aFn | bFn): () => Promise<string> | string {
return callback.bind("hello", "world");
}
Expected behavior:
Code compiles. The types in this code are equivalent to the types in the following example, which does compile:
type cFn = (this: string, value: string) => string | Promise<string>;
function callFn1(callback: cFn): Promise<string> | string {
return callback.call("hello", "world");
}
function applyFn1(callback: cFn): Promise<string> | string {
return callback.apply("hello", ["world"]);
}
function bindFn1(callback: cFn): () => Promise<string> | string {
return callback.bind("hello", "world");
}
The only difference between the two examples is that the first uses a type union of function types aFn and bFn, which only differ in terms of return value, whereas the second uses a type union in the return value of cFn. In other words I think the union of type aFn and bFn should behave the same as type cFn.
type aFn = (this: string, value: string) => string;
type bFn = (this: string, value: string) => Promise<string>;
type cFn = (this: string, value: string) => string | Promise<string>;
Actual behavior:
example.ts(5,12): error TS2684: The 'this' context of type 'aFn | bFn' is not assignable to method's 'this' of type '(this: "hello", args_0: string) => string'.
Type 'bFn' is not assignable to type '(this: "hello", args_0: string) => string'.
Type 'Promise<string>' is not assignable to type 'string'.
example.ts(9,12): error TS2684: The 'this' context of type 'aFn | bFn' is not assignable to method's 'this' of type '(this: "hello", value: string) => string'.
Type 'bFn' is not assignable to type '(this: "hello", value: string) => string'.
Type 'Promise<string>' is not assignable to type 'string'.
example.ts(13,12): error TS2769: No overload matches this call.
Overload 1 of 6, '(this: (this: "hello", arg0: "world") => string, thisArg: "hello", arg0: "world"): () => string', gave the following error.
The 'this' context of type 'aFn | bFn' is not assignable to method's 'this' of type '(this: "hello", arg0: "world") => string'.
Type 'bFn' is not assignable to type '(this: "hello", arg0: "world") => string'.
Type 'Promise<string>' is not assignable to type 'string'.
Overload 2 of 6, '(this: (this: "hello", ...args: "world"[]) => string, thisArg: "hello", ...args: "world"[]): (...args: "world"[]) => string', gave the following error.
The 'this' context of type 'aFn | bFn' is not assignable to method's 'this' of type '(this: "hello", ...args: "world"[]) => string'.
Type 'bFn' is not assignable to type '(this: "hello", ...args: "world"[]) => string'.
Type 'Promise<string>' is not assignable to type 'string'.
Related Issues:
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
Inizia riproducendo l'esempio di union-of-function-types nel TypeScript Playground collegato, quindi confrontalo con l'esempio equivalente di union-return-type. Traccia la gestione di call, apply e bind per le union nel compilatore; il lavoro è completato quando tutti e tre gli esempi vengono compilati con i tipi restituiti attesi.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- typescript
- Ambito
- compilers
- Tipo di issue
- Bug
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Stato di attività
- Ferma
- Chiarezza
- Specificata chiaramente
- Idoneità per principianti
- 35/100