理解度
色々な個別サンプルを見てなんとか理解を深めようとしているレベルです
疑問点
JavaScriptに「型安全の思想」を取り入れたのがTypeScriptということらしいのですが
実際に「お手本」というべきサンプルでもイジる前からエラーが出ていることも多く
自分の現状の対処方法では、とりあえずの「つじつまあわせ」的にやってる感が否めず
具体的な例で、自分のやり方などの問題点をおうかがいしたいです
さわってみたサンプルコード(出所失念)
オブジェクトにゲッタをセットする関数のための型定義の例
TypeScript
1type Proxy<T> = { 2 get(): T 3} 4 5type Proxify<T> = { [P in keyof T]: Proxy<T[P]> } 6 7function proxify<T>(o: T): Proxify<T> { 8 var proxy = new Proxy(o, { 9 get: function(o: T, prop: string, receiver) { 10 var rv = o[prop] + ': prop in proxy' 11 return rv 12 }, 13 }) 14 return proxy 15} 16 17let props = { 18 name: 'Tarou', 19 age: 23, 20 gender: 'male', 21} 22let proxyProps = proxify(props) 23console.log(proxyProps.name)
Error
1型 'T' の引数を型 'object' のパラメーターに割り当てることはできません。ts(2345)
確かにProxyの型を確認すると以下のようになっておりエラーの主張ももっともだと思われます
TypeScript
1interface ProxyConstructor { 2 revocable<T extends object>(target: T, handler: ProxyHandler<T>): { proxy: T; revoke: () => void; }; 3 new <T extends object>(target: T, handler: ProxyHandler<T>): T; 4} 5declare var Proxy: ProxyConstructor;
##やってみたこと
この関数内で使っているProxyは外せないので(外せないとして)、それに合わせるために
引数 o の型をProxyの定義に合わせてみる。すると返り値のproxyの型もそれになるわけで
現時点のproxifyの返り値の型と一致しなくなる。そこもObjectとかに変えるとなると
proxify実行後の左辺のproxyPropsはProxify<T>とは全く別もの(別型)であり、
そこにはnameプロパティーがないという新たなエラーも生み出されハチャメチャ状態に陥る
TypeScript
1type Proxy<T> = { 2 get(): T 3} 4 5type Proxify<T extends object> = { [P in keyof T]: Proxy<T[P]> } 6 7function proxify<T extends object>(o: T): Proxify<T extends object> { 8 var proxy = new Proxy(o, { 9 get: function(o: T, prop: string, receiver) { 10 var rv = o[prop] + ': prop in proxy' 11 return rv 12 }, 13 }) 14 return proxy // [Error] 返り値の型が不整合 15} 16let props = { 17 name: 'Mucha', 18 age: 23, 19 gender: 'male', 20} 21let proxyProps = proxify(props) 22console.log(proxyProps.name)
##おうかがいしたいこと
この場合、どう修正してエラーを無くすべきでしょうか・
・・・対処療法的につじつまをあわせるようなやり方ではエラーが消えない上に型安全という思想も無視することになりTypeScriptである必要すらなくなってしまうのでやっていて虚しくなります。正しい考え方や手法をもっと積み上げないとと思っています
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。