[英]How to create Class dynamically in a proper way in 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>
應該可以解決問題。
您還可以通過將T
約束為對象類型來修復//@ts-ignore
行。
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
?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.