![](/img/trans.png)
[英]How to use computed property with getters and setters to trigger commit in Vuex
[英]“Computed property names” for getters and setters in typescript
Javascript 具有語法
class C {
get [prop]() { ... }
set [prop](v) { ... }
}
用於獲取或設置任意屬性。
在 Typescript 中有什么方法可以做到這一點嗎?
您的示例代碼實際上並沒有做您想做的事情,即使在 JavaScript 中也是如此。 計算的屬性名稱通過評估表達式以得出屬性名稱來工作。 例如:
const computed = {
["foo".toUpperCase()]: "bar"
}
console.log(computed.FOO) // bar
除非prop
已經是一個現有變量,否則將prop
用作計算屬性只會失敗。 每個計算屬性將僅用作單個屬性,而不是所有可能的屬性。
我認為攔截 JavaScript (因此在 TypeScript 中)中所有屬性獲取和設置的唯一方法是使用Proxy
。 這是一種可能的實現:
class C {
[k: string]: any;
constructor() {
return new Proxy<C>(this, {
get(thiz, prop) {
console.log(`getting ${String(prop)}`);
},
set(thiz, prop, v) {
console.log(`setting ${String(prop)} to ${v}`);
return true; }
});
}
}
我們告訴 TypeScript class C
的實例具有字符串索引簽名,因此它將接受任何屬性鍵(和any
屬性值)。 然后, constructor()
方法顯式返回一個Proxy
,這樣當您在其上調用new
運算符時,您將獲得代理而不是默認的this
。
無論如何,代理實現了一個get
處理程序和一個set
處理程序,因此它攔截了所有屬性的所有獲取和設置。 屬性鍵名稱被傳遞到處理程序方法中,因此您實際上可以獲得您正在尋找的行為:
const c = new C();
c.foo; // getting foo
c.foo = "bar"; // setting foo to bar
注意:我建議您在生產環境中使用之前小心並測試上述任何代碼; 在 class 構造函數或顯示的特定Proxy
處理程序中返回自定義對象可能會涉及邊緣情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.