🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
TypeScript

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

Q&A

解決済

1回答

928閲覧

エラー対処の考え方について

TOMIYASU_chan

総合スコア21

TypeScript

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

0グッド

1クリップ

投稿2019/10/03 04:21

理解度

色々な個別サンプルを見てなんとか理解を深めようとしているレベルです

疑問点

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である必要すらなくなってしまうのでやっていて虚しくなります。正しい考え方や手法をもっと積み上げないとと思っています

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

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

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

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

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

guest

回答1

0

自己解決

最初の型引数を詳細に書けばエラーでなくなりました
(当然といえば当然でした)

TypeScript

1// function proxify<T>(o: T): Proxify<T> { … 2function proxify<T extends object>(o: T): Proxify<T> {

投稿2019/12/12 00:36

TOMIYASU_chan

総合スコア21

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問