質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

proxy

proxy(プロキシー)は、企業などの内部コンピュータとインターネットの中間に位置し、例えば直接インターネットに接続できない内部コンピュータの代理としてインターネットに接続する等をするシステム、もしくは代理として機能を実行するソフトウェアです。内部ネットワークへのアクセスを一元管理し、内部からの特定の種類の接続以外を遮断すること、外部からの不正アクセスを拒否することなどに用いられます。

Q&A

解決済

2回答

1654閲覧

TypeScriptでのProxy利用時のエラー

TOMIYASU_chan

総合スコア21

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

proxy

proxy(プロキシー)は、企業などの内部コンピュータとインターネットの中間に位置し、例えば直接インターネットに接続できない内部コンピュータの代理としてインターネットに接続する等をするシステム、もしくは代理として機能を実行するソフトウェアです。内部ネットワークへのアクセスを一元管理し、内部からの特定の種類の接続以外を遮断すること、外部からの不正アクセスを拒否することなどに用いられます。

0グッド

0クリップ

投稿2020/08/27 03:07

編集2020/08/28 00:34

概要

以下のようなコードで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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

おそくなりました。
ありがとうございます。対象のオブジェクトの型をこのジェネリクスの部分におくのですね!その型定義を確認していれば、targetがTであることからそうすべきことがわかったかもしれません。

TypeScript

1interface ProxyHandler<T extends object> { 2 getPrototypeOf? (target: T): object | null; 3 setPrototypeOf? (target: T, v: any): boolean; 4 isExtensible? (target: T): boolean; 5 preventExtensions? (target: T): boolean; 6 getOwnPropertyDescriptor? (target: T, p: PropertyKey): PropertyDescriptor | undefined; 7 has? (target: T, p: PropertyKey): boolean; 8 get? (target: T, p: PropertyKey, receiver: any): any; 9 set? (target: T, p: PropertyKey, value: any, receiver: any): boolean; 10 deleteProperty? (target: T, p: PropertyKey): boolean; 11 defineProperty? (target: T, p: PropertyKey, attributes: PropertyDescriptor): boolean; 12 enumerate? (target: T): PropertyKey[]; 13 ownKeys? (target: T): PropertyKey[]; 14 apply? (target: T, thisArg: any, argArray?: any): any; 15 construct? (target: T, argArray: any, newTarget?: any): object; 16}

投稿2020/08/28 00:32

TOMIYASU_chan

総合スコア21

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

Proxyの型定義を見る限りではコンストラクタの返す型はそのまま対象オブジェクトの型が返るように見えるのですが

見えません。ProxyHandler<Object>handlerとして渡す以上、TObjectに決まってしまいます。

const handlerの型を、きちんとProxyHandler<typeof target>としておきましょう。

投稿2020/08/27 03:45

maisumakun

総合スコア145121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問