//When used as a contextual type, a union type U has those members that are present in any of
// its constituent types, with types that are unions of the respective members in the constituent types.
interface I1<T> {
>I1 : I1<T>
>T : T
commonMethodType(a: string): string;
>commonMethodType : (a: string) => string
>a : string
commonPropertyType: string;
>commonPropertyType : string
commonMethodWithTypeParameter(a: T): T;
>commonMethodWithTypeParameter : (a: T) => T
>a : T
>T : T
>T : T
methodOnlyInI1(a: string): string;
>methodOnlyInI1 : (a: string) => string
>a : string
propertyOnlyInI1: string;
>propertyOnlyInI1 : string
}
interface I2<T> {
>I2 : I2<T>
>T : T
commonMethodType(a: string): string;
>commonMethodType : (a: string) => string
>a : string
commonPropertyType: string;
>commonPropertyType : string
commonMethodWithTypeParameter(a: T): T;
>commonMethodWithTypeParameter : (a: T) => T
>a : T
>T : T
>T : T
methodOnlyInI2(a: string): string;
>methodOnlyInI2 : (a: string) => string
>a : string
propertyOnlyInI2: string;
>propertyOnlyInI2 : string
}
// Let S be the set of types in U that has a property P.
// If S is not empty, U has a property P of a union type of the types of P from each type in S.
var i1: I1<number>;
>i1 : I1<number>
>I1 : I1<T>
var i2: I2<number>;
>i2 : I2<number>
>I2 : I2<T>
var i1Ori2: I1<number> | I2<number> = i1;
>i1Ori2 : I1<number> | I2<number>
>I1 : I1<T>
>I2 : I2<T>
>i1 : I1<number>
var i1Ori2: I1<number> | I2<number> = i2;
>i1Ori2 : I1<number> | I2<number>
>I1 : I1<T>
>I2 : I2<T>
>i2 : I2<number>
var i1Ori2: I1<number> | I2<number> = { // Like i1
>i1Ori2 : I1<number> | I2<number>
>I1 : I1<T>
>I2 : I2<T>
>{ // Like i1 commonPropertyType: "hello", commonMethodType: a=> a, commonMethodWithTypeParameter: a => a, methodOnlyInI1: a => a, propertyOnlyInI1: "Hello",} : { commonPropertyType: string; commonMethodType: (a: string) => string; commonMethodWithTypeParameter: (a: number) => number; methodOnlyInI1: (a: string) => string; propertyOnlyInI1: string; }
commonPropertyType: "hello",
>commonPropertyType : string
commonMethodType: a=> a,
>commonMethodType : (a: string) => string
>a=> a : (a: string) => string
>a : string
>a : string
commonMethodWithTypeParameter: a => a,
>commonMethodWithTypeParameter : (a: number) => number
>a => a : (a: number) => number
>a : number
>a : number
methodOnlyInI1: a => a,
>methodOnlyInI1 : (a: string) => string
>a => a : (a: string) => string
>a : string
>a : string
propertyOnlyInI1: "Hello",
>propertyOnlyInI1 : string
};
var i1Ori2: I1<number> | I2<number> = { // Like i2
>i1Ori2 : I1<number> | I2<number>
>I1 : I1<T>
>I2 : I2<T>
>{ // Like i2 commonPropertyType: "hello", commonMethodType: a=> a, commonMethodWithTypeParameter: a => a, methodOnlyInI2: a => a, propertyOnlyInI2: "Hello",} : { commonPropertyType: string; commonMethodType: (a: string) => string; commonMethodWithTypeParameter: (a: number) => number; methodOnlyInI2: (a: string) => string; propertyOnlyInI2: string; }
commonPropertyType: "hello",
>commonPropertyType : string
commonMethodType: a=> a,
>commonMethodType : (a: string) => string
>a=> a : (a: string) => string
>a : string
>a : string
commonMethodWithTypeParameter: a => a,
>commonMethodWithTypeParameter : (a: number) => number
>a => a : (a: number) => number
>a : number
>a : number
methodOnlyInI2: a => a,
>methodOnlyInI2 : (a: string) => string
>a => a : (a: string) => string
>a : string
>a : string
propertyOnlyInI2: "Hello",
>propertyOnlyInI2 : string
};
var i1Ori2: I1<number> | I2<number> = { // Like i1 and i2 both
>i1Ori2 : I1<number> | I2<number>
>I1 : I1<T>
>I2 : I2<T>
>{ // Like i1 and i2 both commonPropertyType: "hello", commonMethodType: a=> a, commonMethodWithTypeParameter: a => a, methodOnlyInI1: a => a, propertyOnlyInI1: "Hello", methodOnlyInI2: a => a, propertyOnlyInI2: "Hello",} : { commonPropertyType: string; commonMethodType: (a: string) => string; commonMethodWithTypeParameter: (a: number) => number; methodOnlyInI1: (a: string) => string; propertyOnlyInI1: string; methodOnlyInI2: (a: string) => string; propertyOnlyInI2: string; }
commonPropertyType: "hello",
>commonPropertyType : string
commonMethodType: a=> a,
>commonMethodType : (a: string) => string
>a=> a : (a: string) => string
>a : string
>a : string
commonMethodWithTypeParameter: a => a,
>commonMethodWithTypeParameter : (a: number) => number
>a => a : (a: number) => number
>a : number
>a : number
methodOnlyInI1: a => a,
>methodOnlyInI1 : (a: string) => string
>a => a : (a: string) => string
>a : string
>a : string
propertyOnlyInI1: "Hello",
>propertyOnlyInI1 : string
methodOnlyInI2: a => a,
>methodOnlyInI2 : (a: string) => string
>a => a : (a: string) => string
>a : string
>a : string
propertyOnlyInI2: "Hello",
>propertyOnlyInI2 : string
};
var arrayI1OrI2: Array<I1<number> | I2<number>> = [i1, i2, { // Like i1
>arrayI1OrI2 : (I1<number> | I2<number>)[]
>Array : T[]
>I1 : I1<T>
>I2 : I2<T>
>[i1, i2, { // Like i1 commonPropertyType: "hello", commonMethodType: a=> a, commonMethodWithTypeParameter: a => a, methodOnlyInI1: a => a, propertyOnlyInI1: "Hello", }, { // Like i2 commonPropertyType: "hello", commonMethodType: a=> a, commonMethodWithTypeParameter: a => a, methodOnlyInI2: a => a, propertyOnlyInI2: "Hello", }, { // Like i1 and i2 both commonPropertyType: "hello", commonMethodType: a=> a, commonMethodWithTypeParameter: a => a, methodOnlyInI1: a => a, propertyOnlyInI1: "Hello", methodOnlyInI2: a => a, propertyOnlyInI2: "Hello", }] : (I1<number> | I2<number>)[]
>i1 : I1<number>
>i2 : I2<number>
>{ // Like i1 commonPropertyType: "hello", commonMethodType: a=> a, commonMethodWithTypeParameter: a => a, methodOnlyInI1: a => a, propertyOnlyInI1: "Hello", } : { commonPropertyType: string; commonMethodType: (a: string) => string; commonMethodWithTypeParameter: (a: number) => number; methodOnlyInI1: (a: string) => string; propertyOnlyInI1: string; }
commonPropertyType: "hello",
>commonPropertyType : string
commonMethodType: a=> a,
>commonMethodType : (a: string) => string
>a=> a : (a: string) => string
>a : string
>a : string
commonMethodWithTypeParameter: a => a,
>commonMethodWithTypeParameter : (a: number) => number
>a => a : (a: number) => number
>a : number
>a : number
methodOnlyInI1: a => a,
>methodOnlyInI1 : (a: string) => string
>a => a : (a: string) => string
>a : string
>a : string
propertyOnlyInI1: "Hello",
>propertyOnlyInI1 : string
},
{ // Like i2
>{ // Like i2 commonPropertyType: "hello", commonMethodType: a=> a, commonMethodWithTypeParameter: a => a, methodOnlyInI2: a => a, propertyOnlyInI2: "Hello", } : { commonPropertyType: string; commonMethodType: (a: string) => string; commonMethodWithTypeParameter: (a: number) => number; methodOnlyInI2: (a: string) => string; propertyOnlyInI2: string; }
commonPropertyType: "hello",
>commonPropertyType : string
commonMethodType: a=> a,
>commonMethodType : (a: string) => string
>a=> a : (a: string) => string
>a : string
>a : string
commonMethodWithTypeParameter: a => a,
>commonMethodWithTypeParameter : (a: number) => number
>a => a : (a: number) => number
>a : number
>a : number
methodOnlyInI2: a => a,
>methodOnlyInI2 : (a: string) => string
>a => a : (a: string) => string
>a : string
>a : string
propertyOnlyInI2: "Hello",
>propertyOnlyInI2 : string
}, { // Like i1 and i2 both
>{ // Like i1 and i2 both commonPropertyType: "hello", commonMethodType: a=> a, commonMethodWithTypeParameter: a => a, methodOnlyInI1: a => a, propertyOnlyInI1: "Hello", methodOnlyInI2: a => a, propertyOnlyInI2: "Hello", } : { commonPropertyType: string; commonMethodType: (a: string) => string; commonMethodWithTypeParameter: (a: number) => number; methodOnlyInI1: (a: string) => string; propertyOnlyInI1: string; methodOnlyInI2: (a: string) => string; propertyOnlyInI2: string; }
commonPropertyType: "hello",
>commonPropertyType : string
commonMethodType: a=> a,
>commonMethodType : (a: string) => string
>a=> a : (a: string) => string
>a : string
>a : string
commonMethodWithTypeParameter: a => a,
>commonMethodWithTypeParameter : (a: number) => number