概要
以下のようなコードでProxyインスタンスオブジェクトの型がObject型になってしまって対象のオブジェクトをラップしたものとして機能しないので困っています
TypeScript
1let target = { 2 name: 'Mike', 3 age: 17, 4} 5const handler: ProxyHandler<Object> = { 6 set: function(target, p: PropertyKey, value: any, receiver: any): boolean { 7 console.log(`${String(p)} is forbidden to change`) 8 return false 9 }, 10} 11let proxy = new Proxy(target, handler) 12proxy.age = 99 // Error プロパティ 'age' は型 'Object' に存在しません。
上記の 'proxy'の型がObjectなのでエラーは当然なのですが、なぜこのインスタンスの型が対象オブジェクトのtargetの型になってくれないのでしょうか?Proxyの型定義を見る限りではコンストラクタの返す型はそのまま対象オブジェクトの型が返るように見えるのですが
TypeScript
1// lib.es2015.proxy.d.ts 2interface ProxyConstructor { 3 revocable<T extends object>(target: T, handler: ProxyHandler<T>): { proxy: T; revoke: () => void; }; 4 new <T extends object>(target: T, handler: ProxyHandler<T>): T; 5} 6declare var Proxy: ProxyConstructor;
以下に修正して解決
TypeScript
1let target = { 2 name: 'Mike', 3 age: 17, 4} 5const handler: ProxyHandler<typeof target> = { 6 set: function(target, p: PropertyKey, value: any, receiver: any): boolean { 7 console.log(`${String(p)} is forbidden to change`) 8 return false 9 }, 10} 11let proxy = new Proxy(target, handler) 12proxy.age = 99
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。