=== tests/cases/conformance/types/typeParameters/typeArgumentLists/typeParameterAsTypeParameterConstraintTransitively.ts === // using a type parameter as a constraint for a type parameter is valid // no errors expected interface A { foo: number } >A : A >foo : number interface B extends A { bar: string; } >B : B >A : A >bar : string interface C extends B { baz: boolean; } >C : C >B : B >baz : boolean var a: A; >a : A >A : A var b: B; >b : B >B : B var c: C; >c : C >C : C function foo(x: T, y: U, z: V): V { return z; } >foo : (x: T, y: U, z: V) => V >T : T >U : U >V : V >x : T >T : T >y : U >U : U >z : V >V : V >V : V >z : V //function foo(x: T, y: U, z: V): V { return z; } foo(1, 2, 3); >foo(1, 2, 3) : number >foo : (x: T, y: U, z: V) => V >1 : number >2 : number >3 : number foo({ x: 1 }, { x: 1, y: '' }, { x: 2, y: '', z: true }); >foo({ x: 1 }, { x: 1, y: '' }, { x: 2, y: '', z: true }) : { x: number; y: string; z: boolean; } >foo : (x: T, y: U, z: V) => V >{ x: 1 } : { x: number; } >x : number >1 : number >{ x: 1, y: '' } : { x: number; y: string; } >x : number >1 : number >y : string >'' : string >{ x: 2, y: '', z: true } : { x: number; y: string; z: boolean; } >x : number >2 : number >y : string >'' : string >z : boolean >true : boolean foo(a, b, c); >foo(a, b, c) : C >foo : (x: T, y: U, z: V) => V >a : A >b : B >c : C foo(a, b, { foo: 1, bar: '', hm: true }); >foo(a, b, { foo: 1, bar: '', hm: true }) : { foo: number; bar: string; hm: boolean; } >foo : (x: T, y: U, z: V) => V >a : A >b : B >{ foo: 1, bar: '', hm: true } : { foo: number; bar: string; hm: boolean; } >foo : number >1 : number >bar : string >'' : string >hm : boolean >true : boolean foo((x: number, y) => { }, (x) => { }, () => { }); >foo((x: number, y) => { }, (x) => { }, () => { }) : () => void >foo : (x: T, y: U, z: V) => V >(x: number, y) => { } : (x: number, y: any) => void >x : number >y : any >(x) => { } : (x: any) => void >x : any >() => { } : () => void function foo2(x: T, y: U, z: V): V { return z; } >foo2 : (x: T, y: U, z: V) => V >T : T >A : A >U : U >V : V >x : T >T : T >y : U >U : U >z : V >V : V >V : V >z : V //function foo2(x: T, y: U, z: V): V { return z; } foo(a, a, a); >foo(a, a, a) : A >foo : (x: T, y: U, z: V) => V >a : A >a : A >a : A foo(a, b, c); >foo(a, b, c) : C >foo : (x: T, y: U, z: V) => V >a : A >b : B >c : C foo(b, b, { foo: 1, bar: '', hm: '' }); >foo(b, b, { foo: 1, bar: '', hm: '' }) : { foo: number; bar: string; hm: string; } >foo : (x: T, y: U, z: V) => V >b : B >b : B >{ foo: 1, bar: '', hm: '' } : { foo: number; bar: string; hm: string; } >foo : number >1 : number >bar : string >'' : string >hm : string >'' : string