Open
Description
openedon Jun 8, 2017
TypeScript Version: nightly (2.4.0-dev.20170608)
Code
interface IPromise<T> {
then<U>(onFulfill: (value: T) => IWhenable<U>): IPromise<U>;
}
interface QPromise<T> {
then<U>(onFulfill: (value: T) => IWhenable<U>): IPromise<U>;
}
type IWhenable<T> = IPromise<T> | T;
declare function all<A, B>(promises: IWhenable<[IWhenable<A>, IWhenable<B>]>): IPromise<[A, B]>;
declare const prom1: QPromise<[QPromise<string>, QPromise<number>]>;
const x1: IPromise<[string, number]> = all(prom1);
const prom2: IPromise<[IPromise<string>, IPromise<number>]> = prom1;
const x2: IPromise<[string, number]> = all(prom2);
Expected behavior:
Since IPromise
and QPromise
have identical bodies, I would expect these to both work.
Actual behavior:
x1
fails, x2
succeeds.
src/a.ts(14,7): error TS2322: Type 'IPromise<[QPromise<string>, QPromise<number>]>' is not assignable to type 'IPromise<[string, number]>'.
Type '[QPromise<string>, QPromise<number>]' is not assignable to type '[string, number]'.
Type 'QPromise<string>' is not assignable to type 'string'.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment