Add regression test

This commit is contained in:
Anders Hejlsberg 2021-10-24 11:48:12 -07:00
parent 64d989e4c1
commit 4f5361ab60
5 changed files with 147 additions and 3 deletions

View file

@ -46,4 +46,23 @@ tests/cases/compiler/deepComparisons.ts(4,9): error TS2322: Type 'T[K1][K2]' is
function f3<U>() {
let x: Foo1<U> = 0 as any as Bar<U>; // No error!
}
}
// Repro from #46500
type F<T> = {} & (
T extends [any, ...any[]]
? { [K in keyof T]?: F<T[K]> }
: T extends any[]
? F<T[number]>[]
: T extends { [K: string]: any }
? { [K in keyof T]?: F<T[K]> }
: { x: string }
);
declare function f<T = any>(): F<T>;
function g() {
return f() as F<any>;
}

View file

@ -17,7 +17,26 @@ type Foo2<T> = { x: Foo1<T> };
function f3<U>() {
let x: Foo1<U> = 0 as any as Bar<U>; // No error!
}
}
// Repro from #46500
type F<T> = {} & (
T extends [any, ...any[]]
? { [K in keyof T]?: F<T[K]> }
: T extends any[]
? F<T[number]>[]
: T extends { [K: string]: any }
? { [K in keyof T]?: F<T[K]> }
: { x: string }
);
declare function f<T = any>(): F<T>;
function g() {
return f() as F<any>;
}
//// [deepComparisons.js]
function f1() {
@ -31,3 +50,6 @@ function f2() {
function f3() {
var x = 0; // No error!
}
function g() {
return f();
}

View file

@ -84,3 +84,57 @@ function f3<U>() {
>Bar : Symbol(Bar, Decl(deepComparisons.ts, 6, 28))
>U : Symbol(U, Decl(deepComparisons.ts, 16, 12))
}
// Repro from #46500
type F<T> = {} & (
>F : Symbol(F, Decl(deepComparisons.ts, 18, 1))
>T : Symbol(T, Decl(deepComparisons.ts, 22, 7))
T extends [any, ...any[]]
>T : Symbol(T, Decl(deepComparisons.ts, 22, 7))
? { [K in keyof T]?: F<T[K]> }
>K : Symbol(K, Decl(deepComparisons.ts, 24, 13))
>T : Symbol(T, Decl(deepComparisons.ts, 22, 7))
>F : Symbol(F, Decl(deepComparisons.ts, 18, 1))
>T : Symbol(T, Decl(deepComparisons.ts, 22, 7))
>K : Symbol(K, Decl(deepComparisons.ts, 24, 13))
: T extends any[]
>T : Symbol(T, Decl(deepComparisons.ts, 22, 7))
? F<T[number]>[]
>F : Symbol(F, Decl(deepComparisons.ts, 18, 1))
>T : Symbol(T, Decl(deepComparisons.ts, 22, 7))
: T extends { [K: string]: any }
>T : Symbol(T, Decl(deepComparisons.ts, 22, 7))
>K : Symbol(K, Decl(deepComparisons.ts, 27, 27))
? { [K in keyof T]?: F<T[K]> }
>K : Symbol(K, Decl(deepComparisons.ts, 28, 21))
>T : Symbol(T, Decl(deepComparisons.ts, 22, 7))
>F : Symbol(F, Decl(deepComparisons.ts, 18, 1))
>T : Symbol(T, Decl(deepComparisons.ts, 22, 7))
>K : Symbol(K, Decl(deepComparisons.ts, 28, 21))
: { x: string }
>x : Symbol(x, Decl(deepComparisons.ts, 29, 19))
);
declare function f<T = any>(): F<T>;
>f : Symbol(f, Decl(deepComparisons.ts, 30, 2))
>T : Symbol(T, Decl(deepComparisons.ts, 32, 19))
>F : Symbol(F, Decl(deepComparisons.ts, 18, 1))
>T : Symbol(T, Decl(deepComparisons.ts, 32, 19))
function g() {
>g : Symbol(g, Decl(deepComparisons.ts, 32, 36))
return f() as F<any>;
>f : Symbol(f, Decl(deepComparisons.ts, 30, 2))
>F : Symbol(F, Decl(deepComparisons.ts, 18, 1))
}

View file

@ -56,3 +56,34 @@ function f3<U>() {
>0 as any : any
>0 : 0
}
// Repro from #46500
type F<T> = {} & (
>F : F<T>
T extends [any, ...any[]]
? { [K in keyof T]?: F<T[K]> }
: T extends any[]
? F<T[number]>[]
: T extends { [K: string]: any }
>K : string
? { [K in keyof T]?: F<T[K]> }
: { x: string }
>x : string
);
declare function f<T = any>(): F<T>;
>f : <T = any>() => F<T>
function g() {
>g : () => F<any>
return f() as F<any>;
>f() as F<any> : F<any>
>f() : F<any>
>f : <T = any>() => F<T>
}

View file

@ -16,4 +16,22 @@ type Foo2<T> = { x: Foo1<T> };
function f3<U>() {
let x: Foo1<U> = 0 as any as Bar<U>; // No error!
}
}
// Repro from #46500
type F<T> = {} & (
T extends [any, ...any[]]
? { [K in keyof T]?: F<T[K]> }
: T extends any[]
? F<T[number]>[]
: T extends { [K: string]: any }
? { [K in keyof T]?: F<T[K]> }
: { x: string }
);
declare function f<T = any>(): F<T>;
function g() {
return f() as F<any>;
}