class P { x: X; } // this is like Promise type Pstar = X | Pstar>; // this is like Promise* var p: P = new P; (p.x: string); // error var pstar: Pstar = 0; // OK (pstar: number); // error, but limit potentially unbounded number of errors! // e.g., P ~/~ number, P> ~/~ number, ... pstar = p; // OK (pstar.x: string); // error pstar = (new P: P>); // OK (pstar.x: string); // error