TypeScript part2 [転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
http://www.typescriptlang.org/ TypeScript lets you write JavaScript the way you really want to. TypeScript is a typed superset of JavaScript that compiles to plain JavaScript. Any browser. Any host. Any OS. Open Source. 前スレ http://peace.2ch.net/test/read.cgi/tech/1349187527/ 変数の型の参照なんて初歩の初歩なんだが教えてやるまい >>602 えっ 普通推論させるから書かないでしょ わざわざ書かなきゃならなくなるケースってどんな時よ const STR = "str"; type STRT = "str"; const ABC3: STRT=STR; "str"を2回書かずにABC3が作れればそれでいいんだけど。 >>605 const STR = "str"; const ABC3 = STR; すまん、確かに思い違いしていたようだ。ありがとう。 TypeScriptでExpressを使う場合について教えてください。 express-generatorなどのサンプルコードだと new Error したオブジェクトにstatusを 突っ込んで返していたりしますが、ここ、TypeScript的にはどうするのが普通でしょう? みなさん自前でErrorのサブクラスを定義しているんでしょうか?あるいはどこかに 定番のものがあったりするんでしょうか? 「どうでもいい」が普通じゃない? そんなもんエラーハンドラで受けて適当にトレースとエラーメッセージ出したら終わりなんだから 型なんぞ要らん 手段と目的を履き違えるな >>611 jsonとして扱えるようにインターフェース定義にしておいたほうが無難な気がする。 シリアライズしても簡単にもとに戻せるし。 そういうもんですかね? エラーを表示するだけとは言ってもstatusは正しくセットしなきゃならないわけで、 TypeScriptを使う以上そこも型安全にやりたいってのは自然だと思うんですが。 そこだけtslintの警告をネグるのも気持ち悪いし。 アプリケーションの仕様としてエラー用のクラスを定義します。Errorのサブクラスだったり新規に自前のクラスを用意するかはケースバイケース。 当然途中で変わることもあり得ます。その際はきちんと他のメンバーと情報共有します。 自分は簡単なアプリではHttpErrorみたいなクラスを定義して使ってる。 もっと複雑なアプリだと、業務エラーのコードとHTTPのエラーコードで もう一階層作ったりもするけど。 だが、これが推奨なやり方なのかは分からん。俺も知りたい。 ありがとうございます。 statusというプロパティにステータスを返すのは決まっているんだからどこかに 出来合いのものがあるかと思ったんですが、やっぱり自前なんですね。 npm linkを駆使してtypescriptでビジネスロジックを外部モジュールにしてるんだけど tsc -wで自動コンパイルはできるんだけど 定義ファイルも同時に生成するコマンドオプションってないかな? >>618 すんません -w -dですね。ホント申し訳ない TypeScriptで動的なキャストみたいなことってできるんでしょうか? // どこかで定義されたclass class X {} interface AX extends X { a: string; } func(x: X) { if ( xが a: string というプロパティを持っていれば ) { // ここではxをAXとして扱いたい } } >>620 let ax=<AX>x でキャスト出来る。 インターフェースが存在するかどうかはチェックはされないから注意。 >>621 ありがとうございました。うまくいきました。 f8appのコード読んでんだけど flowって驚くほどtypeScriptと似てるね。 んでReduxのアクションな書き方が参考になる。 type ParseObject = Object; export type Action = { type: 'LOADED_ABOUT', list: Array<ParseObject> } | { type: 'LOADED_NOTIFICATIONS', list: Array<ParseObject> } | { type: 'LOADED_MAPS', list: Array<ParseObject> } コレ普通にtypeScriptでも使えた。 interface宣言だとこういう書き方できなけどtype宣言だとできんのね。 いやーTypeScriptって本当にいいものですよね 恥ずかしいソース書いてもコンパイルすればそれなりの形になってますし 全ソースが1つにまとまったjsファイルを見るとカタルシスを覚えます javascriptを扱うのに最高の言語です minifyが出来なくて悩んでおります。 Targetをes5にしてもエラーが出る。 >>626 結局該当箇所っぽいところの構造を変えて解決した case 'Text': { let text: Text; /* ごちゃごちゃした処理*/ text = { type: 'Text', value: node.value, cache: nodeCache }; return text; } ってなってるところで なぜがtextという変数がminifyで消えずに残っていてエラーになっていたところ case 'Text': { // let text: Text; <―削除 /* ごちゃごちゃした処理*/ let text:Text = { type: 'Text', value: node.value, cache: nodeCache }; return text; } ってしたら治った。 すいませんminifyの件ですが一番の問題は 外部ライブラリとして別にパッケージを作ってnpm linkしていたんですが その外部ライブラリのtsconfigの設定でtargetをes2015にしていたのが原因のようです。 npm上で公開してるライブラリってes2015のものとes5のものが混ざってるんですかね?もしそうならminifyのとき問題でそう。 そろそろブラウザもes2015に対応してきたし外部ライブラリもes2015でいいんじゃないかと思いましたがまだまだes5のほうがいいんですかねー >>628 ちゃんと設定すれば、TypeScriptが変換してくれるんじゃないの? >>630 targetをes5にしてlibに”dom”と”es2017”を設定したら ちゃんとminifyもできつつasync await とかobject.assaignとか使えました。 typescriptの問題というよりuglify-jsの問題ってことすね。 >>629 ギャー!! 適用したらエラーだらけになった!! アンインストールしたらVSでtsファイル開いても識別子の色分けとかインテリセンスが出てこなくなってVSぶっ壊れたわ 再インストールだなこりゃ 2.3アンインストール後に再度2.3インストールしてもぶっ壊れたまま 迂闊に入れないほうがいいなこれ 相対パスでimportしようとすると from ’../../lib/a’ と書くことが多いのですが ..を何とかしようと思いtsconfigでbaseUrlを設定したところ from ‘lib/a’とかけるようになって素敵だったんですが 生成したjs側で同じように相対パスを使わない方法にできずjs側からimportできなくなりました。 どうすればいいんですかね jsonのデシリアライズ等で得られた任意のオブジェクトが指定のinterfaceに適合するかどうか 簡単に判定する方法ってないでしょうか? 実行コストがかかるのはしょうがないので、npmのライブラリでもあれば助かります。 >>642 俺は各interfaceの定義にtypeを入れてる。 >>642 あーなるほどtypesciptのinterface要件を満たしてるかチェックするライブラリかー。 interfaceに対するメタプログラミングができる仕組みってtypescript側に用意されてんのかな ランゲージサービスから情報引っ張ってコード生成するまでやればできる >>642 初心者なんで教えて欲しいんですが どう言う状況でそう言うのが必要に なるんですか? >>643-647 回答ありがとうございます。 外部から入手したany型のオブジェクトに対して、一度型チェックしたらTypeGuardの下で 扱えたら便利だと思ったんですが、そう単純なものはなさそうですね。 interface毎にUser-Defined Type Guard Functionてのを用意するのが今のところ いちばんシンプルですかね。 >>646 interfaceをparseするの簡単にできたわ ジェネレータは作れそう。後はObjectを チェックするコードをかければ、、、 そっちがよくわかんないな。 JSON限定でいいならJSON Schema生成するだけじゃね webpackでtypescript使う時にts-loaderがtypeRootsオプションを認識してくれないような。 自作の定義ファイルを読みに行ってくれない。 結局nodes_modules/@types/においたらうごくんだけど。なんだかなぁ redux のreducer書く時型付きじゃないと死ぬ。 素のjsでよく書ける人いるなぁ >>650 これやってみようかと思ったけど、class定義からschema生成するか逆にschemaから生成するか、 どっちがいいか悩ましいなぁ。 JSON Schemaの方が表現力がずっと高いから、 実用的に意味があるのは後者だろうね 型だけなら全部空文字と0とfalseでもいいんだから JSON Schemaからのdts生成は既存のツールがいくつかあるみたいだな 逆はバリデーションとしてはほぼ無意味かと 目的が上で書いているようにシリアライズ-デシリアライズされたオブジェクトの型の復元なら、 interface定義を自分で書いてschemaは裏方というのが自然だとは思うが。 ただ、schemaを生成する方のツールは技術的にハードルが高いせいか選択肢があまりないな。 そもそもシリアライズという発想自体がJavaScript的でないと思うけどね データスキーマから入るのがJSでしょ シリアライズってJSONのこと言ってるわけだろ。 言語自体にサポートの無いC++などと比べてもよっぽど馴染みがあると思うが。 で、JavaScriptだとそこまででいいんだけど、TypeScriptで型まで戻すにはどうするか?って話だろ。 バリデーションとシリアライズが別系統なのは煩雑じゃない? コードだけで全部定義するならアノテーション使うなりしてJSON Schema相当の表現力は欲しいし、 割り切って別にするならシリアライズ系の方は中途半端なバリデーションなんかいっそ無しにて ノーチェックでいいと思うよ うん、上から目線で何か言いたいという気持ちだけは伝わった。 自分でコンパイラ拡張して実装したみたいだけどこういうの本家の更新についてけずに陳腐化するのが常だから使えない ついでにビルドツールなどのエコシステムも使えない 正攻法だとanyを受け取って目的の型のオブジェクトにして返す関数を用意することになるんだろうが、 やることは同じようなものなのにそれぞれ型ごとに個別に用意しなければならないのが煩雑だな。 よっぽど重要な型でしかやりたくない感じ。 確かにこれが、型ガードの感覚で気軽に使えるようになったら便利だと思うけど。 TypeScriptの思想的にもスキーマありきで型は後付けの方が自然だと思うわ その「スキーマ」が何を指しているかよくわからんな。 まさか「JSON schemaありき」って言いたいわけじゃないだろうが。 >>666 別に実装は何でもいいんじゃない? 先にJSONドキュメントそのものを設計しろってこと objectを先に設計してstringifyの方が一般的だと思うが。 つまりtsなら型が先。 jsonに対するinterface適用にわざわざスキーマ使うのはだるいな。 やはりメンバにtypeとかを事前に追加しておいて、そこを見てキャストさせるほうが楽だわ。もちろんそのjson自体が自分で改変可能である必要はあるが。 TypeScript ⇔ JSONSchema を相互に変換するコードは既に転がってるから どちらでも好みで原本にすれば良いんじゃないの? まぁあまり自動化を頑張っても、構造が複雑になると結局手書きが必要になる分野だとは思うけど 型で記述しきれないバリデーションについてはDecoratorsを使うのがベストなんだろうけど、 interfaceには使えないんだよな まあJSONだけならそれでもいいかもしれないが interfaceがトランスパイル後に消滅しちゃうの辛いよな。 言語機能でいい感じに残す機能つけてほしいが、そういう提案ってないの? 最近ついたというプラグインで可能になる? >>662 で公式で却下されたと書いてある まあESの仕様壊すし残当 >>673 この文脈 (>>642 , 648) では、型フィールドを信用するのはノーチェックと同じ意味だぞ 外部からのデータが、内部的な制約を満たすことの保証を求めてる いや関数に隠蔽すれば壊すまではいかんか >>676 入力データの検査も値レベルの制約も手でやること 型システムに求めることじゃない 型を信じてノーチェックが型安全でありそうでなければオーバーヘッドで死ぬ 本人もタイプガードで満足してるしそれが正解 >>675 まぁESの仕様+型だけだから学習コストが低いってのはあるしね。 でも直感的にinterface定義が消えちゃうのはなんだかなぁって気はする。 こうなったらES側に頑張ってもらうしかないな。パターンマッチング付けてー >>651 コレが解決した。 悩んでいつつも暫定対処で乗り切ってただけに小骨が喉に刺さっているような気分でしたわ。 結論としてはtypeRootsオプションは/// <reference types=".." /> を使う時のpath解決でしか使わないって。 ハンドブックをどう読んでもそう書いているように見えない。 typescriptでimmutablejs使ってるけどいまいち恩恵を得づらい。 updateInとかパスが補完効いたり出来ればいいのに thisを変数に入れたいときの変数名ってみんな何してる? _thisが使えればいいんだけどなー 変数に入れた後のthisはthisなんですか・・・・? JavaScriptのクロージャにおけるthis問題の回避はselfが定番 TypeScriptで必要なケースは少ないはずだけど _thisは重複エラーになっちゃうんでやすよね 目的としては、deferredを返すfunctionがあって、その返り値のdoneで呼び元のthisを使いたいんです >>687 var testFucntion = () => { var defer = $.Deferred(); defer.resolve("a"); return defer.promise(); } var hoge: string; testFucntion() .done(function (data: string) { this.hoge(data); }) こんな感じ functionが自然な場所は、アローにしてて、 アローで解決できる箇所はfunctionなのはなぜ。 >>689 doneのほうをアロー式にしたらいいんやで あとvsで開発してる場合、デバッグ時にウォッチしたとき、そのthisにはtestFucntionが入るけど 実際にはちゃんと使いたい値が入ってるから安心しな Angular(2以降)の話題もここでよろしょうございますか? interface A{ x:string; y:string; } interface B extends A{ x:number; } が型の互換性エラーになるの何とかならない? let a={x:'hoge',y:'foo'}; let b={...a,{x:1}}; みたいな事は出来るのにbを現す型を簡単に定義出来ないのが辛い >>699 型が変わったら継承できないのは当たり前では? interface Parent { x: string | number; y: string; } interface A extends Parent { x: string; } interface B extends Parent { x: number; } こういう関係が正しい関係では? ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる