interface List { data: T; next: List; owner: List>; } interface MyList { data: T; next: MyList; owner: MyList>; } var l: List; var m: MyList; l == m; // should error var l2: List; l == l2; // should error; l == l; // should not error