IHTMLDocument is an interface which is essentially an "unbreakable" contract that represents what the object that implements it will provide.
Changing the interface when moving to a new version of the code would break that contract and in turn break the code that is relying on that contract.
Suppose you create :
public interface IMyInterface {
public int Property1 { get; set; }
}
A year later you need to add Property2 but you cannot change your interface. So one way around that is to create:
public interface IMyInterface2 {
public int Property2 { get;set; }
}
and then with your old Class that is implementing IMyInterface :
public class MyObject : IMyInterface, IMyInterface2 {
public int Property1 { get {} set {} }
public int Property2 { get {} set {} }
}
Then you will not break the older contract but can use the new interface in code such as:
if (obj is IMyInterface) {
Console.WriteLine(((IMyInterface)obj).Property1);
if (obj is IMyInterface2) {
//more
}
}
So that is what Microsoft did. The mshtml library that IHTMLDocument is in is a COM library and COM rely's heavily on interfaces. So as the library evolved Microsoft added more and more Interfaces to expose the newer functionality/code.
IHTMLTxtRange is an interface for the more commonly used TextRange object.
It exposes a bunch of functionality for parsing text "Fragments" or "Ranges".
http://www.webreference.com/js/column12/trmethods.html