Add regression test
This commit is contained in:
parent
64d989e4c1
commit
4f5361ab60
|
@ -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>;
|
||||
}
|
||||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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))
|
||||
}
|
||||
|
||||
|
|
|
@ -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>
|
||||
}
|
||||
|
||||
|
|
|
@ -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>;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue