いくつかのプラグインがにロードされた後にシステムがサポートタイピング。は、関数の戻り値は、関数の引数の文字列リテラルで選択されたタイピングを、作成することが可能ことです私は、基本コードは実際にはすべて把握していないプラグインベースのシステムのためのタイピングを実装する方法を把握しようとしてきた
私は、プラグインが周囲タイピングを宣言し、そのように元のインターフェイスを拡張することを可能にすることによってこれを実現しようとしています。しかしで、だから私は、文字列に一致する可能性の同じ種類を実装したいプラグインシステムのための
type t1 = {
type: 'foo';
test: number;
};
type t2 = {
type: 'bar';
test: string;
};
type t = t1 | t2;
const tx1: t = {
type: 'foo',
test: 1
};
const tx2: t = {
type: 'foo',
test: 'this fails, because if type = foo, then test must be a number'
};
const txbar: t = {
type: 'bar',
test: 'this works because with bar object test can be string'
};
:
は、私はいくつかの文字列に一致する魔法で私はそれがこれで少し似たように動作させることができることを望んで
interface PluginClass1 {}
interface PluginClass2 {}
interface PluginApi {
getPlugin: (pluginName: 'plug1') => PluginClass1
}
interface PluginApi {
getPlugin: (pluginName: 'plug2') => PluginClass2
}
class PluginManager implements PluginApi {
plugins = {};
getPlugin(pluginName) {
return <any> this.plugins[pluginName];
}
}
const manager = new PluginManager();
// here I would like to get correctly typed return value
// according to name string (this doesn't work though)
const plugin1 = manager.getPlugin('plug1');
const plugin2 = manager.getPlugin('plug2');
このようなタイプのスキームを動作させる方法はありますか、あるいは拡張可能なインターフェイスを入力するための良い方法がありますか?
ありがとうございます!このソリューションは、実際のケースでも私が働くことができるもののように見えます。私は決して自分自身を考え出したことはありません:)私は決して 'keyof'の宣言を見たことがありませんでした。 –