アプリをtypescriptに移行しようとしています。基本ライブラリオブジェクトである基本クラスがあります。私のクラスは基本クラスに依存して作成されました。以下は私の問題を垣間見ることです。
以下のコードは機能しますが、オートコンプリートは機能しません。のタイプに対して何を定義する必要があるかを理解できませんでしたModel
。
const map = new WeakMap();
function weakRef<T>(context: T): T {
// @ts-ignore
if (!map.has(context)) { map.set(context, {}); }
// @ts-ignore
return map.get(context);
}
function getModel(provider: Provider) {
return class Model {
getSomething(key: string) {
return weakRef(provider).configuration(key);
}
};
}
class Provider {
configuration: (key: string) => string;
constructor() {
weakRef(this).configuration = (key: string) => {
return key;
};
weakRef(this).Model = getModel(this);
}
get Model(): any {
return weakRef(this).Model;
}
set Model(model: any) {
weakRef(this).Model = model;
}
}
const provider = new Provider();
const obj = new (provider.Model)();
console.log(obj.getSomething('test')); // This works, but autocomplete doesn't
ベースモデルのコンストラクターにプロバイダーを渡したくありません。どんな助けでもありがたいです、ありがとう。
関数型の戻り値の型はReturnType<T>
。で取得できます。
この場合、ReturnType<typeof getModel>
トリックを行う必要があります。
オブジェクトタイプに//@ts-ignore
制約T
することで、行を修正することもできます。
const map = new WeakMap();
function weakRef<T extends object>(context: T): T {
if (!map.has(context)) { map.set(context, {}); }
return map.get(context);
}
そうは言っても、このアーキテクチャは不必要に複雑だと思います。にthis
関連付けられた値の代わりに使用しないのはなぜthis
ですか?
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加