私が正しくあなたの質問を理解していれば、あなたはこれを行うことができます:
let httpClientType: typeof BrowserHTTPClient | typeof NodeHTTPClient;
if (typeof window === 'undefined') {
httpClientType = NodeHTTPClient;
} else {
httpClientType = BrowserHTTPClient;
}
var httpClient = new httpClientType();
明確化を
class BrowserHTTPClient { }
// myObject should be of the type BrowserHTTPClient
// For example an instance of BrowserHTTPClient, but not necessarily as long as it's structurally compatible with the type BrowserHTTPClient
let myObj: BrowserHTTPClient;
// myClass should be the class BrowserHTTPClient (Or rather, it should fulfill the type of the class of the type BrowserHTTPClient, hence it can be any object that has the same structure as the _class_ BrowserHTTPClient. Inception warning here, see explanation of structural typing below.)
let myClass: typeof BrowserHTTPClient;
// make a instance of myClass (BrowserHTTPClient)
myClass = BrowserHTTPClient; // Here, myClass IS the class BrowserHTTPClient.
myObj = new myClass();
クラスvsタイプ
C#のような公称言語では、class
とtype
は事実上同じです。変数が何らかの型であると言うと、変数はその特定のクラスのインスタンス以外であっても、型がインタフェースから来たものであっても、その特定のインタフェースを実装するクラスであることはできません。
これは、構造的に型指定されたTypeScriptでは同じではなく、class
とtype
の概念はさらに離れています。 typescriptでクラスを定義すると、そのクラスもタイプを作成します。しかし、その型の変数を定義すると、その型を満たすものに設定できます。
class MyClass {
public Name: string;
}
class MyOtherClass {
public Name: string;
public Age: number;
}
let obj: MyClass;
obj = new MyClass();
obj = new MyOtherClass(); // Also ok, since it fulfills the type MyClass (It has a field Name that is a string)
「HTTPClientType」はどのように使用しますか?それはあなたが望むタイプかクラスですか? – Alex
タイプなので、多くのインスタンスを作れます。 – squirly
インスタンスを作成する場合は、型ではなくクラスが必要です。 – Alex