interface RelationFields { x: A; y: A[]; z: A[]; } type Name = keyof RelationFields; type ShouldA = RF[N] extends A[] ? RF[N][0] : never; class A { x: A; y: A[]; z: A[]; whereRelated< // Works // Type is same as A1, but is not assignable to type A RF extends RelationFields = RelationFields, N extends Name = Name, A1 extends A = RF[N] extends A[] ? RF[N][0] : never, A2 extends A = ShouldA >(): number { return 1; } }