TypeScript part2 [転載禁止]©2ch.net
レス数が1000を超えています。これ以上書き込みはできません。
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/ https://twitter.com/ironshay/status/593855606747860992
Anders, father of C#, and Misko, father of angular,
on the same stage at Build2015. インストールしたら1.5 Betaが入りました。
$ tsc sample.tsでコンパイルしたjavascriptファイルを$ node sample.jsで実行すると
__.prototype = b.prototype;の箇所でエラーになるんですが
typescriptの書き方でおかしいところを教えてください
module M {
export interface aInterface {
f1(): void;
}
export interface bInterface {
f2(): void;
}
class A extends B implements aInterface {
f1() {
console.log(1);
}
}
class B implements bInterface {
f2() {
console.log(2);
}
}
} typescriptの勉強の為、型推論とanyを使わない書き方を知りたいのですが
コンパイルすると error TS2339: Property 'classList' does not exist on type 'EventTarget'.
ってエラーが出ます。
(1)と(2)の行を型指定しなければエラーが出ないのですが、どのような型を指定したらエラーがでないのでしょうか?
class A {
eventFunc(e: MouseEvent) { // (1)
var target:EventTarget = e.target; // (2)
target.classList.add('red');
}
f() {
window.addEventListener('click', this.eventFunc, false);
}
} (2)をvar target = <Element>e.target;でいいんじゃないかな
DOMの仕様でtargetがElementではないケースがあるのかどうか知らないけど、少なくとも自分で扱う範囲なら問題ないでしょ >>8
classListだから
var target = <HTMLElement>e.target;
または
var target: HTMLElement = e.target;
じゃないかな?
分からない場合はlib.d.tsを見ればいいよ 最初の頃は律儀に型指定してたけど面倒くさいからもうやってない
コンパイル速度が上がるわけでもない。 tsc --noImplicitAnyでかつ明示的にanyを使ってなくてエラーがでなければ
型安全が保たれてるから何も毎回型指定する必要はないよ
ただjquery.d.tsとかanyだらけなんで実行しないとエラーが出ない事とかよくある
単純にjQuery使う程度ならJavaScriptのままでいいとは思う やっぱ堅い仕様で書いてるとtscでインライン化して欲しくなっちゃうなぁ >>13
インライン化し始めるとjsのソースがグチャグチャになりそうだ
get,setはあるんだからそれでいいんじゃないの? >>14
うちの場合JavaScriptはただの実行ファイル扱いだからね
デバッグはソースマップなりインライン化の無効なりできればいいんじゃないかな >>16
元々の予定にはなかったDecoratorを入れたからじゃないかな
仕様の検証の為に1.5AlphaやBetaを挟んだのだと思う >>15
インライン化がもし速度の為だったら速くなるかどうかは未知数だな
JITコンパイラの高速化の癖というか挙動を予測するのはかなりむずい
あくまで主観だけど長くなった関数は高速に実行されにくくて
細かく関数に分けた方が速くなる気がする (実際にそういう事はあった)
関数単位でコンパイルするしないを決めてるっぽいし 解析によるインライン化はtscでもJITでも好きにしてくれていいけど
inlineキーワードで明示できた方が気持ち的にスッキリする ES6がいろんなブラウザで動かせるようになった頃にTypeScriptってどうなるの? ECMAScript2015(旧ES6)がリリースされたんだな
>>21
TypeScriptの最大のメリットは静的型チェックだから有用性は全く変わらない
他にもprivate指定とかも有用だし既にES7(ES2016?)の仕様も先取りしようとしてるよ newさせないようにコンストラクターを非公開にしたい
現状でも実現できるけど、そのためにインターフェースを2つも書くのは面倒くさい https://github.com/Microsoft/TypeScript/wiki/Roadmap
>1.6
>ES6 Generators
>Local types
>Generic type aliases
>Expressions in class extends clauses
>Class expressions
>exclude property in tsconfig.json
>User defined type guard functions
>async/await for ES6
>External module resolution enhancements
>JSX support
>Intersection types
>abstract classes and methods
次の仕込み進んでるね 昔はJScriptという亜種JavaScriptを作っていたMSが
今はJavaScriptの未来を作ってるんだから興味深いよ。
V8を作ってるGoogleが作ってるAngularJSが
TypeScriptを採用してるっていうんだからね。
世の中何が起こるかわからない。 ES6以降の見識とかモダン言語のたしなみがないと新機能を追いかけるのは難しくなってきてるな node.js 4.0.0 がリリースされたけど tsc 1.5.3 でのコンパイルは問題なかったよ >>32
誰かがブログで解説するだろうからそれを待て
あと1.6でオブジェクトリテラルの型チェックが厳密になって大量のエラーが…
https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes
↑ここに対処法とか書いてあるからバージョンアップする場合は見るべし typescriptって型を省略せずに書くのが王道なの?どうなのかおしえてください >>35
var a = 1;
は型を省略して書いてるように見えるが型推論されてaはnumber型に固定される
その後a = "hoge";と書くとエラーになる
型推論をあてにして型を省略するのは普通だがそういう事を聞いてんの? 関数の引数の型は書いて下さいね
あと --noImplicitAny は忘れずに --noImplicitAny を付けてれば引き数の型を書かないとエラーになるけど
戻り値の型は省略できてしまう
コンパイラは型推論で戻り値の型は分かるから補完候補の表示で型は分かるけど
戻り値の型もちゃんと書いた方がいいね
そうすると整数を返す予定だったところを文字列返しちゃった時にエラーになる >>37
対応してませんね
けれど前から提案はされていて、C#と異なる使い方も模索されているみたいです
Partial classes
https://github.com/Microsoft/TypeScript/issues/563
Suggestion: Reopen static and instance side of classes
https://github.com/Microsoft/TypeScript/issues/2957 >>41
そういうのはinterfaceとかmodule(namespace)を使えば実用上困ることは
無いと思うからいらないでしょ コードの中にnew Promiseを書くと
tsc test.tsでチェックしたら
error TS2304: Cannot find name 'Promise'
って出るんですがこれはどうしたらでなく出来ますか? --target ES6を指定します
どうもありがとうございます var i;
var l;
var a = [
{"a":1},
{"b":1},
]
for (var i = 0; i < a.length; i++) {
console.log(a[i]);
}
コンパイルすると
TS2403: Subsequent variable declarations must have the same type. Variable 'i' must be of type 'any', but here has type 'number'
ってなるんですがよく分かりませんどうかけばいいんでしょうか >>46
エラーメッセージが理解出来れば分かる事ではあるが…
var i; ← iの型がany
for (var i = 0; ← iの型がnumberだから矛盾してると言ってる
var i;を消すかvar i: number;とすればいいよ 超超初心者なんですが
仮にグローバルで宣言したiがforでなく別の関数で使われることを意図していた場合
>>46のように変数iをfor文でたまたま同じ名前の制御変数としてvar宣言すると思うのですが
このときvarが付いているにも関わらずfor文のiは一行目で宣言したiとみなされてしまうってことですか? >>48
JavaScriptのvarはブロックスコープの機能が無い (詳細はググるなりしてくれ)
直感的にしたければES6のletを使うしかない TSはES5ターゲットでもlet/const使えるからへーきへーき >>48
いや間違えた…TypeScriptは普通にletが使えるからletを使えばいい
>>46のvarをletに書き換えるだけでうまく行くよ >>49
ああ!ifやforは関数ではないからvarつけても同名のグローバルを見に行っちゃうんですね!
そこで出てくるのがlet/constか!なっとく! >>53
let使える前のjsの変数スコープは基本的に関数レベルだったんだよ。
rubyやpythonとかもそうだったりする。 issueが0になってからリリースまで1ヶ月以上掛かるし
1.6がリリースされた時は1.6.2だったからもう少し先な気がする >>57
ポリモthisって変数の受け取り側で(ダウン)キャストしないで済むって事でしょ?
そんな待ち遠しいって何か便利な使い方とかあるの? interface IEquatable {
equals(other: this): boolean
}
とかかな typescriptで使いやすいEditorでおすすめってなんですかね?
MS由来からいってVSなんでしょうけど、当方Macなので、、、、 >>60
ttps://github.com/Microsoft/TypeScript/wiki/TypeScript-Editor-Support
普段何使ってるんだよ
Vimは導入が難しいが、何するにしても特化した環境が作れるぞ >>59
class Base {
getThis(): Base { return this; }
}
class Derived extends Base {
print(): void { console.log('Derived'); }
}
let derived = new Derived();
derived.getThis().print(); // 1.6.2だとBaseにprint()がねーよと怒られる
1.7だと
getThis(): this { return this; }
にする事でコンパイル通ってちゃんと実行も出来る
って事は理解したけど、equals(other: this)のthisって自分の型名のエイリアス
として使えるから便利って事であってるの? >>60
Emacsと
https://github.com/ananthakumaran/tide
↑を使う事でVSに劣らないインテリセンス環境が出来上がるぞ(ページ内のscreencastを見るべし!)
ちなみに常用してるけどMac版Emacsは使った事ないから詳細は分からん >>59
class Base {
equals(other: this): boolean { return other.name === "Derived"; }
}
class Derived extends Base {
name = "Derived";
}
let derived = new Derived();
console.log(derived.equals(derived));
だと、1.7でも(正確には1.7.0-dev.20151016)
test.ts(3,18): error TS2339: Property 'name' does not exist on type 'Base'.
って、ポリモらないけど…なんでなん? >>63
>>61
情報ありがとうございました。結局atomに落ち着きました。
最初補完効かないじゃんとか思ってましたが、tcconfig.jsを作ったら機能したので
問題なさそうです。
emacsかvimかで言ったらvim寄りですが、設定の手間とかいろいろ考えたら
atomが一番楽です。すいません。 >>64
そういった使い方は無いと思うよ。その場合はジェネリックを使うといい
class Base {
equals<T extends { name: string; }>(other: T): boolean { return other.name === "Derived"; }
} >>66
https://github.com/Microsoft/TypeScript/pull/4910
このページのサンプルコードで>>64みたいなのがあったよ
>>62の戻り値バージョンは直感的で使い易いし良いんだけど
引き数バージョンがポリモらないのは何か変だなとは思う
ま、ジェネリックがあるから困らないけど1.7がちゃんとリリースされたら
また確認してみよう >>67
Baseがあとからどう拡張されるかなんてわかるわけないだろ
未来予知でもさせる気か >>68
コールの仕方がderived.equalsなんだから未来予知なんてしなくたって
コンパイル時にthisがDerivedなのが決まるでしょ (ジェネリックの場合はTがDerived)
C++は呼び出した時に型を決めてコンパイルされるからそういうのが当たり前だけど
TypeScriptはジェネリックとかも先にコンパイルしようとすんだな
とりあえずそういう仕様なのは理解したよ >>69
それは>>67のいうところの戻り値バージョンだろ
Baseの中のthisはBaseでしかない >>70
は?継承されたメソッドのderived.equalsでアクセスしてんのにthisがBaseなわけないだろ
お前が言ってんのは字面上の事だろ
だからC++はジェネリック(テンプレート)は呼び出された時しかコンパイルされないんだよ
TypeScriptもそうだと思っていたと先に書いただろ
equals(other: this)もジェネリックと同じようなもんだろうと思っていたんだよ
同じ事なんども言わせるな ちなみに>>64のコードはコンパイルエラーは出力されるが吐き出された.jsを
実行すると問題なく実行出来る
JavaScriptは動的型だから当然だけど、TypeScriptもジェネリック(とポリモthis)は
呼び出し時に毎回コンパイルした方がよりJavaScriptに近くなるとは思うけどね
(コンパイルというか型チェックだけだが) エラーになってるのに何とち狂ってんだ
お前はもうそう思い込んでていいから他の人間に迷惑かけるなよ >>73
言ってる意味が理解出来ないなら無理に意味不明な返答しなくていいよ C++のテンプレートではそうじゃないみたいだけど
他言語のジェネリクスやらパラメータ多相だと型引数T(ここで言えばthis)がnameを持つって制約がなけりゃ
other.nameとかやってる時点でコンパイルエラーになるのが普通
呼び出し側でどう呼び出されてようが知らん だから説明してくれなくてもTypeScriptの仕様は知ってるよ
class Base {
getThis(): this { return this; }
}
class Derived extends Base {
name = "Derived";
}
let derived = new Derived();
console.log(derived.equals(derived)); // OK:コンパイルも実行も問題ない
この場合のgetThis(): this { return this; }はBaseにあるのに型はDerivedになる
それがポリモthis
引き数版もそうだと思ったら違ったから変だなとおもっただけだ
つうか何回同じ事書かせるんだよ… 間違えた…
> console.log(derived.equals(derived));
derived.getThis().print(); class Base {
getThis(): this { return this; }
}
class Derived extends Base {
print(): void { console.log('Derived'); }
}
let derived = new Derived();
derived.getThis().print(); // OK:コンパイルも実行も問題ない
なんどもゴメンよ…こっちだった class Base {
identity(a: this): this { return a; }
}
class Derived extends Base { /*略*/ }
let derived = new Derived();
derived.indentity(derived) // => Derived
これで戻り値だろうが引数だろうがthis型の意味が変わらんのは分かるだろ
んでもうひとつ
親クラスの中で子クラスの実装に依存するような定義することがおかしいと思わんのか
テンプレートみたいにthisを具体的な型に置き換えたメソッドを実際に生成してくれるって訳じゃねーんだぞ >>79
> identity(a: this): this { return a; }
なるほど結局やってくれるのはキャストだけって事だな
> 親クラスの中で子クラスの実装に依存するような定義することがおかしいと思わんのか
いや別に…ジェネリックとかは
equals(other: Derived): boolean;
equals(other: Hoge): boolean;
equals(other: any): boolean { return other.name === "Derived"; }
を短く書けるってだけだぞ
やってる事はいたって普通じゃん equals(other: any): boolean { return other.name === "Derived"; }
よく考えたらこれで良かったなw VisualStudioでTypeScriptを始めてみたのですが加算が上手く出来ません。
数値で入力して数値で計算しているつもりですが文字列の連結になってしまいます。
以下のソースのどこかに問題がありますでしょうか?
それとも加算の時は明示的にNumberを付けるのが暗黙の了解なのでしょうか?
■index.htmlに以下を追加
<input id="id1" type="number" value="100" />
<input id="id2" type="number" value="50" />
<button type="button" onclick="MyCalc(document.getElementById('id1').value, document.getElementById('id2').value, 'id3');">Calc</button>
<p id="id3"></p>
■app.tsに以下を追加
function MyCalc(a: number, b: number, idOut: string) {
var add: number = a + b; // ←文字列の連結になる
//var add: number = Number(a) + Number(b); // ←数値の加算になる
document.getElementById(idOut).innerHTML = add.toString();
} >>82
html内のJavaScriptから.ts内の関数を呼んでも型を変換してくれるわけじゃないよ
だからaもbも文字列が渡ってきてる つまり、
function MyCalc(a: number, b: number, idOut: string) {
var add: number = Number(a) + Number(b);
document.getElementById(idOut).innerHTML = add.toString();
}
とすべきである、と。
何このゴミ言語。 >>85
MyCalcに文字列を渡してるのは理解してんの? >>84
tsの引数でnumberと指定しているところにhtmlからstringを渡してるのにエラーでないのが正常ってことですか。
なんとも言えないモヤモヤした気分ですがそういうものだと思って納得します。
ありがとうございました。 そもそも今時htmlファイルにJSのコードがあるのがクソ >>88
> MyCalcに文字列を渡してるのは理解してんの?
誰が何を渡すなんか関係ないよ。
MyCalc()がMyCalc()たり得るためには、>>85のようにしなければならないってことでしょ。 ジェネリックと書かれると黒柳徹子の声で脳内再生されるw
かといってジェネリックプログラミングだと長いか。 英語だとGenericsだからジェネリックスと言うべきだろうね
日本語だとジェネリックが多いけど Microsoftのコードエディタ「Visual Studio Code」β版でオープンソース化、拡張機能で「Go」など約60言語に対応
http://gigazine.net/news/20151119-microsoft-visual-studio-code/ >>96
ちゃんとTypeScriptで書かれてるのが確認出来たし
コーディングスタイルとか色々参考になるな >>97
なるほど。と思った。確かに生きてる教材として価値あるね。 コーディングガイドラインがTS本体と変わってるな
開発元ですらベストプラクティスが固まってないのか VSCodeもElectron使ってるしネイティブアプリもTypeScript+Electronで作るのがトレンドなんだな >>100
Electronってそんなにトレンドなの? >>101
トレンドってのは完全に主観だ
そもそもデスクトップアプリを作る機会があまり無いと思われる
あとブラウザで動くJavaScriptとNode.js用のコードはモジュールの問題とか
色々相容れないものがあって両対応させるのは難しい
この辺はES6のModuleが普及すれば多少は改善するのかね New Website Logo: Ericsson
https://github.com/Microsoft/TypeScript/issues/5801
Erlang作った会社もTypeScript使ってるんだね 当日になっても参加一人だけかよTypeScript終わってんな こういうのは横の繋がりがないと人を集めるの難しそうだな 今回の機能追加はAsync/Awaitとポリモthisぐらいか
1.8も言語機能の追加は小規模だからだいぶ仕様が安定してきた感じだな TypeScriptはその名の通りJavaScript+型なんだからTypeScript固有の話題なんて
もうそんなにないだろ
最新の話題は>>108のブログだけ見てれば十分
言語機能を詳しく知りたい場合は公式のHandbookがスゲー良く出来てるからそれで十分 コンパイル速度遅くなってきたらしいな
さもありなん 実際アプデしたらクッソ重くなってた
IDEがプチフリして困る >>113
間違いとか中途半端な内容が多いな
取り合えず 2 ** 3 は 2 * 2 * 2 に展開される
整数同士は掛け算に展開して浮動小数点数は Math.pow() を使うようになる
要するに整数のべき乗を整数のままにしておけるという事だな >>115
少し補足
右側が変数になってる場合も Math.pow() になった 3.14 ** 3 は 3.14 * 3.14 * 3.14 にするよりも pow のほうが早いのか >>117
どうでもいいけどπを3乗するなんて事は無いけどな
ルートの中に入ることはある http://www.typescriptlang.org/Playground で
以下のコードが実行時エラーになる
意図したものなのかな
function f() {
const Math = void 0;
console.log(2 ** 3);
}
f() >>119
const Math = void 0;
だとMathがany型になってるからそもそも何やってもコンパイルエラーにはならない
const Math = 1;
console.log(Math.pow(2, 3));
だとコンパイルエラーになるが
console.log(2 ** 3);
がコンパイルエラーにならないのはバグだな
ちなみに1.7のプレリリース版だと2 ** 3は2 * 2 * 2に展開されてた気がするが
1.7.3だと無難にMath.pow(2, 3)のままだな… typescriptを書くときの環境みたいなのを教えてください
そういう記事があったら教えてください
webpack?とかpackage.txtとか開発初めのスケルトンが知りたいです まずエディタを何使いたいかによるな
何でもいいなら無難にVS使うのがいいと思われる
最近ならVisual Studio Codeの方がいいかもしれない VSCodeは.git/とtsconfig.jsonが同じフォルダなのが前提だな…
そうでない場合も多い気がするけどな
ちょっと試用してみたけど上記の問題以外はTypeScript用エディタとして快適に使える VSCodeに移行したいけどvimが未完成すぎてまだ移行できん
はよVSと同じクオリティに仕上げてくれ おもいっきりスレ違いだけどVSCodeの完成度の高さにびっくり
golang開発環境としても最適。マイクロソフトの開発力の高さを目撃したぜ。
一気にATOMより使いやすくなりやがった。
typeScriptも期待していいね VSCodeの完成度の高さの半分はTypeScriptで作ってるからと言えなくもない
残りの半分はGoogleのChromiumとV8のお陰だが… 最近のマイクロソフトはC#と並んでNode.js推しが凄いね
次期ASP.NETのビルドシステムもNode.js系
Node.jsの普及に社運をかけているような感じがする MSは自社のJavaScriptエンジンがあるから別にNode.jsを推してるとは思えない
単にNode.jsを使わざるを得ない状況ってだけじゃないかな
現状色んなアプリが別個にNode.jsのランタイムを含めてて無駄過ぎるから
WindowsだったらEdgeとかChakraを使うバージョンがあってもいいと思う MS自身自社プロダクトのクロスプラットフォーム化を進めてるのにそんな逆行したいわけがない 持ち上げられすぎてると思うけどそこまで終わってもない
それよりエレクトロンがモノになるかのほうが不安 chakra対応のnode出したりcoreをossにしたりでv8で満足してるわけでもなさそう >>131
Node.jsがオワコンとか初めて聞いたよw
JavaScriptが標準規格だから実装が何になろうがいいけど
今のところNode.js以外の使い易い実装がないのが現実
まさかとは思うけど>>131はio.jsの事を言ってたりするのか? オワコンかどうかはわからないけど、jsフロントエンド周りは
変化が早すぎてついていける人が少ないのは確か。
ビルドツールすらなんでそんな変わっていくん?
いっそmakeでいいんじゃないか。
早くデファクトスタンダードでてくんないかな。
Meteorは完全にjs界から見放されているような気もする。(日本だけ?) GUIツールや、ビルドツール、SSRあたりは残るんじゃないかな。
apiサーバやさらにバックエンドは今より減っていきそうだけど。 よくAltJSの括りでDartとかと一緒にされるけどTypeScriptはDartと別モンだと思う
TypeScriptは9割は(特にES6以降の)JavaScriptといっても過言じゃないけど
Dartは全然別の言語だし
Webの世界でJavaScript以外の言語が流行るとは全く思えない javascript無くなってくれないかな
TypeScriptが橋渡しになって引導渡して欲しい >139
それはつまり「IEもChromeもFirefoxもSafariも、既存サイトのJavaScriptを解釈しないようにしろ」ってことだろ
無理だな >>139
なんかgoogleとかmozilaとかが共同でバイナリをBrowserで動かす仕組みを
開発するとかいってなかったっけNaCLじゃない奴。
それが実現したらそうなるんじゃない >>141
WebAssemblyだな
主目的はC++のコードを安全にかつネイティブ並に高速に動かす為のものだが
他の言語を動かす基盤にも十分成り得る
ただ現状でもJavaScriptに変換すれば似たような事にはなってるのに
他の言語が流行ってないから結局今と一緒でしょ JavaScriptでは難しい最適化を施した多言語から生成できる共通の中間コードの仕様策定だっけ?
デバッグが難しいだろうからほとんどCPUヘビーなとこと広告回避にだけ使われてほかはJavaScriptのままだと思うよ >>143
基本ゲーム用だ
WebGL2になるとPS3以上PS4未満の能力があるからWebAssemblyと組み合わせて
ブラウザをゲームプラットホームにしようという思惑がある >144
それChromeBook持ってるGoogleの一人勝ちになるんじゃないか 日本一みたいな小粒の尖ったソフト出すメーカーはこういうのでコストかけずにどんどん出していったほうがいいんだろうな 1.7でも戻り値の型が違うとエラーになるけどnoImplicitReturnsの説明見ると
結構すり抜けるパターンがあったんだな…
全部undefined関連だけど最初からエラーにしとけよ あとreadonlyはなぜ
function hoge(readonly a: number) { }
と書けないんだよ…
メンバーより引き数に指定出来る事の方がはるかに重要だ
他は劇的に便利になるようなものはないな >>151
numberにreadonlyを指定することは意味がないと思うが…
引数がreadonlyであることを表明したいなら
そういうinterfaceを定義すれば済む。現行機能で十分じゃないか?
指定子で表明するのはC++がconstで失敗した道だからなぁ >>153
あー無意味なこと書いてしまった…numberじゃなくて何らかのクラス名だった
ちなみに
function test(readonly v: Data/*参照しかしない事を表明*/): boolean { }
をしたいだけなのに
function test(v: {readonly x: number, ...全部書くのか?): boolean { }
とすればいいという事か? >>154
「特定のメンバーしか見ない」と表明したいならそうなるんだろうね
もしくは最初からインタフェースを分けておくか
interface ReadOnlyData { get; }
interface Data extends ReadOnlyData { set; }
単純なフィールドの読み書きだけならいいけど
getXXX() は readonly だよねとか
getXXX() の中でキャッシュ値が変化するけど実質的には readonly だよねとか
やりだすと、C++の悪夢がよみがえってしまう >>155
そりゃ悪夢だろ
なんでクラス定義する側がそんな苦労しないといけないんだ
ちなみに
class Hoge {
int getXXX() const;
mutable Cache cache;って知ってるか?
こうしておけば何か気にする事なんてあるか? 補足
class Hoge {
int getXXX() const; ← これはcacheの中身は書き換える
mutable Cache cache; ← これが書き換わってもconst性に影響無いと考える >>153
何が失敗だったの?
C++でconst無かったら怖くてかなわん… C++でconstに問題あるなんて素人のたわごとだろ
聞いたこと無い C++で仕事を15年以上して凄い奴とかどうしようもない奴とか色々見てきたけど
constに問題があるとか初めて聞いたよ VSCodeがいつの間にアップデートしてて>>124の問題が早速修正されてるな
オプソにした事でユーザーが増えて沢山突っこまれたに違いない
もはやTypeScript最強エディタと言わざるを得ない 最近やっとNode.jsとブラウザの両方で使えるコードの書き方が分かったよ
TypeScriptオンリーだったらtsc --module amdとrequire.jsがあればいいし
JavaScriptを使う場合はwebpack使えば出来た
俺はTypeScriptの時でもリリース時にwebpack使って開発中はrequire.jsで
個別にファイルを読み込んだほうがデバッグしやすいからそうしてる
ちなみに///<reference path='hoge.ts'/>とかmoduleやnamespaceは全く使わない
それが今のトレンド (VSCodeのソースがそうしてる) だれかわかるやつ教えてくれ...
親クラスのstaticメソッドを子クラスでoverrideすると、
実行していない状態でもなぜか親クラスのstaticメソッドが実行されてしまうんだが、これはなぜなんだ...
一応ソースだけ張ってみる。
/// <reference path= >>167
おお、ありがたい。
明日ちょっと見てみるわ。
どうもextendsするときに実行しちゃっているみたいだから、そういう仕様なの?とも思ったんだがいまいちわからんくて...
コンパイル結果のjsも明日張ってみるわ
今日はもう寝る >>168
console.log(Asian.name);
console.log(Asian.name = "New type");
console.log(Asian.name);
nodeだとname propertyは再定義できないと言われるが >>166
これはおもろいw
--target ES5のクラス継承は__extendsでいわゆるクラスを模したイディオムを
実行する訳だけど、その時にHuman.nameを読み出してるからその中で
console.log()みたいな副作用のあるコードを書いてるとちょろっとお漏らし
しちゃうんだな
ま、getに副作用のあるコードを書くなって事だな
副作用が無ければ気にする事はない これが生成されたJS
改行多すぎで書き込めないから二つに区切る。
var __extends = (this && this.__extends) || function (d, b) {
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
var Human = (function () {
function Human() {
}
Object.defineProperty(Human, "name", {
get: function () {
console.log("Human class name");
return "homo";
},
enumerable: true,
configurable: true
});
return Human;
})(); var Asian = (function (_super) {
__extends(Asian, _super);
function Asian() {
_super.call(this);
}
Object.defineProperty(Asian, "name", {
get: function () {
console.log("Asian class name");
return "ass";
},
enumerable: true,
configurable: true
});
return Asian;
})(Human);
console.log(Asian.name);
2行目でpが"name"のときに、d[p] = b[p]としてる部分で起きてるっぽい? get の functionを代入しているような気がするんだけどダメなんだなぁ >>170
なるほど、やっぱり一応「仕様」なのね。
http://visible-true.blogspot.jp/2013/01/typescript-bridge-pattern.html
ここを参考に抽象クラス書いてみようとしたら毎回エラーになったのがきっかけで気づいたんだ。
普段は副作用のないコードを書くようにしてるから問題ないけど、気持ち悪いな... console.log(Asian.name);
をもう一度実行 >>174
最後のconsole.log(Asian.name); をふたつにするってこと?
↓こうなるだけだけど...そうじゃなくて?
Human class name
Asian class name
ass
Asian class name
ass >>172
うぉお自己レスだがいまさら理解
definePropertyにアクセスするとgetのfunctionが実行されるから、
extendsのときの代入で実行が走ってるのね
超すっきりしたわ
なるほどね いやまてこれダメじゃねーか
getterちゃんと継承できてねーぞ
...できてねーよな? https://github.com/Microsoft/TypeScript/issues/1520
存在しないユースケースだから修正しない。
使いたければ__extends関数を自作してオーバーライドしろとさ。 >>178
継承されてないな
まず最初に言っておくけどAsian内のgetを消すとAsian.nameは
Function.nameにアクセスする事になってAsianと表示されるからfuncとかにしておく
そうするとhomoとだけ表示されてHuman class nameは表示されないから継承されてない
ちなみに--target ES6の場合はconsole.log('Human class name');が実行されて
なおかつ継承もされない
要するに現状でES6と同じ挙動という事になるから自前の__extendsを作ると
将来ES6でコンパイルした時に困る事になる (継承をカスタマイズ出来ないし)
現状で問題の無いコードを書くしかないというのが結論だな ES6のclassは__extendsでやっている事のシンタックスシュガーだってのが
分かるおもしろい例だった
結局ES6になってもプロトタイプベースのオブジェクト指向っていうところは
変わってないんだよね >>179
神だ、やっと神と、、、!
ありがとう!
ユースケースがないってのはちょっとひっかかるけどな。
キーワードstaticってクラスに属してるだけでstatic getが副作用を起こさない、他の影響をうけないって保証されてるわけじゃないし。
そう書けってことではあるんだけどね。 MSYS上のvimからtsuquyomi使えんかった
多分Nodeがマウントされたパスとか/c/から始まるパスを理解できないんだろうな
MSYS版Nodeがあればなぁ よく見たらmingw側にNodeがあったので試してみたけどバージョンが古いせいか駄目だったぜ
TypeScript書くときは大人しくGVimにしておくか ChakraCoreを使ったNode.jsが動いたらしい
しかし最近のMSはプロジェクト名にCoreを付けまくってるな --module commonjsの状態でmoduleとnamespaceを使わずに
export function ...
export var ...
って書いたソースがcommonjsのモジュールとしてコンパイルできるのに
外部からimportしようとするとモジュールが見つからないって怒られて困った
--module amdだと大丈夫みたいなんだけど、バグだったりするの? import時のパスが./で始まるかどうかの違いでした
import * as test from "test"; // amdはOK, commonjsはエラー
import * as test from "./test"; // amd, commonjs 共にOK
test.tsを./node_modulesに突っ込んで--moduleResolution nodeなら前者もOK TypeScriptのモジュールの扱いが激烈に難解になったからみんなハマルだろうな
俺は大体理解できたけど >>191
そんなおかしいなら --moduleResolution の意味を言ってみてよ >>191
あと、 --moduleResolution node で認識される*.d.tsの書き方も言ってみてよ
これドキュメントに書いてないんだよな http://qiita.com/vvakame/items/72d22e33632178f7db24
この人の↑これを見るのが一番まとまってて分かり易い
> ・declare module "hoge" 形式の定義は利用できない
って書いてあるけど実際はもう少し修正しないと駄目だった
とりあえず適当に修正すれば通るように出来るけど何が問題なのか
ドキュメントが見つからず確証が持ててない みんなはcommonjs使うからハマらないっての
クイズじゃなくて何がしたくてできないのかのほうを書けよ >>195
>>194の話はcommonjsとか関係無いよ、モジュール全般の話でしょ
それにブラウザからcommonjsロードできないのにみんな使うってのはおかしいでしょ JavaScriptから来た人には歴史的経緯と後付モジュール機構は常識の部類なんだろうけど、他言語からくるとjs/tsのモジュール関係は病んでるよな >>197
最後にはそれかよw
ちゃんと具体的に書いてくれないと完全に負け惜しみにしか聞こえないよ >>198
TypeScriptには内部モジュール(内部は造語)があって外部モジュールについては
あまり重要視されてなかった経緯があるからね
module→namespaceって名前を変えたけどmoduleキーワードは今も使える
もはや混乱の元でしかないし<<<reference file="hoge"/>ももはや役割を終えてるからなくした方がいいな
で、importの意味が1.6でしれっとそれより前の解釈と思いっきり変わってしまったのが混乱の元だ
とりあえずVSCodeのソースを見れば最近の*.tsの書き方が分かる
俺はそれ見て同じ書き方をしようとしてmodule,referenceから移行しようとして
importがトンでもない事になってる事にやっと気付いた requireからES6 modulesまでの変遷は確かに知らずに見ると混乱する
NodeのStreamAPIと違ってES6 modulesで古い情報にフィルタかけられるのが救い >>197みたいにNode.jsオンリーで歴史的経緯も知らずにnpm installだけして
使ってる人にはimportでハマルとか言ってる奴はプッっとしか思わないんだろうね
ま、そういう奴が居るって事は1.6の変更は意味があったといえる
俺は1.0ぐらいからブラウザ用にmodule,referenceでゴリゴリ書いてたから
移行するのがスゲー大変だった
しかし、お陰で汎用的な機能はNode.jsとブラウザの両方で使えるように
書けるようになったから移行する意味はあった(それにES6のmoduleにも対応してるはず) webpackとか使うとjsの場合以下のようにtemplateとしてhtmlコードを取り込むことができますが、
```
export default {
template: require('./index.html'),
}
```
typeScript単体で使う場合で似たようなことをする方法ってありますか? >>203
1.6からjsxに対応したからとりあえず typescript jsx で検索してみなよ
それが目的のものかは分からんけど 安心してください、TypeScriptはasyncが使えます typeScriptでつくられたOSSなプロダクトって何があるのかな。
typeScriptの勉強に使えそうな手軽なサイズのものがいいんですが
特にVSC以外で vs版1.7.6を入れたのにバージョン情報では
1.7.5と表示されるんだけどミスってる?
npm installでも1.7.5だった typeScriptでWebWorkerのコードを書こうとするとpostMessage関数で怒られるんです。
onmessage = function(e) {
console.log('Message received from main script');
var workerResult = 'Result: ' + (e.data[0] * e.data[1]);
console.log('Posting message back to main script');
postMessage(workerResult); //<―ここ
}
error TS2346: Supplied parameters do not match any signature of call target.
パラメータがあってないって話なんですが定義を見てみると
declare function postMessage(message: any, targetOrigin: string, ports?: any): void;
とありtargetOriginが必要みたいな記述になっています
定義の参照先が違うせいだと思うんですが直し方がわかりません。ご教示下さい
参考
https://developer.mozilla.org/ja/docs/Web/Guide/Performance/Using_web_workers ES以外の定義が違うなら自分でプルリク出さないと直らないぞ
DOM周りは基本放置だからな 1.7.5に入ってるlib.webworker.d.tsには
WorkerインターフェースにpostMessage(message: any, ports?: any): void
グローバルにpostMessage(data: any): void
ってなってるけど >>213
先頭行に
/// <reference path="lib.webworker.d.ts" />
と入れてもエラーが出るんですが、どうすればいいんでしょう
error TS6053: File 'lib.webworker.d.ts' not found. いや間違えた…
window.postMessage以外は第2引数が省略可能だな
ただwindow.postMessageも第2引数を省略すると"*"が指定された時と同じ動作をするように
ブラウザが勝手に対応してるっぽいな
格オブジェクト毎に微妙に役割りが違うものを全部一緒くたにpostMessageにしてるから
結構ややこしい事になってるな…
とりあえず>>214はwindow.postMessageを使ってるのであれば
第2引数に"*"を指定すればいいはずだよ 格オブジェクト→各オブジェクト 念の為…連投スマン 何度もごめん
やっと本質が理解できた
根本的な解決には2.0にならないとダメらしいな
それまではpostMessageには"*"とかundefinedを指定して誤魔化すのが一番手っ取り早い いえ。聞きたいことは
golobalscopeの参照先を lib.webworker.d.ts
にしたいわけです。
```
new Wroker(“./worker.js”); // <―ここのworker.js内のグローバルスコープをなんとかしたい
```
上記のように別スレッドでwroker.jsを動かすわけですけど、
worker.js内のグローバルスコープはdocumetにアクセスできなかったり独自のものみたいです。
それで参照先を lib.webworker.d.tsにしたくて/// <reference path="lib.webworker.d.ts" />としても
ファイルがないと怒られます。
typescript自身が持っているd.tsファイルに対してのリファレンスの貼り方を教えていただきたいのです。 >>220
情報ありがとうございます。
とりあえず
```
(<any>postMessage)(workerResult);
```
と書いてエラー抑制で回避することにします。 いい方法が見つかるまではtsconfig.jsonの"files"にlib.*.d.tsのパスを入れておけばいいよ
tsconfig.jsonの書き方と使い方は公式Wiki参照 >>224 おつ
TypeScript for Visual Studio 2015 は Details > Releases から 1.8.4 を選ばないと
以前のものがダウンロードされるので注意。
あと Visual Studio Code のインテリセンス等の挙動は
tscへのパスの差し替えだけでは完璧ではないぽい。なにか方法があるかもしれないが VSCodeは自前でtsserver.jsを持ってるからそれを差し替えないと駄目でしょ
下手に差し替えないでバージョンアップを待てばいいんじゃね?
すぐするでしょ ちなみにメインで使ってるわけじゃないけど、なんかVSCodeって使いづらいような気がしてきた
バージョンアップで改善されてくとは思うけど、メインで使ってる人は使い心地がどうなのか知りたい for (let i = ...) は許されるのに
if (let o = ...) や while (let ...) が許されないのは仕様でしょうか?
nullスキップをしたいときにこの書式を使いたい場合が結構あるのですが 仕様。仕様書見れば書いてあるよ
let o;
if (o = ...) と書いても結果は変わらないと思う
o がブロックの外に漏れるというだけで >>229
元のJavaScriptや、もしかするとJavaに倣った仕様なんですかね
どうせJavaほど真偽判定に厳しくないんだから、C++並に緩くして欲しいなぁ >>230
仕様ってのはecma262(JavaScript)の事ね
TypeScriptはJavaScript(主にES6以降)+型だからJavaScriptの文法を壊すような
機能追加はしちゃ駄目だと思うし、そういうのはほとんど無いと思う chrome extensionの開発にtypeScript使っています。
型があるとドキュメントを見なくてもメソッドとかプロパティを探せるので
捗ります。
本当にES2015 + type って感じなんですね。そんなに仕様が分かっていなくても何となく使えるのがいいです。
一つお聞きしたいのですが
Node型からlengthプロパティを使いたいのですが
参照先にlib.d.tsにはないみたいでエラーなります。
chromeデバッカでは見えているのですが、、、
とりあえず以下のように回避しているんですが
const selection = window.getSelection()
(<any> selection.focusNode).length
本来の対応方針を教えて下さい。
例えばどこかに専用のファイルを作ってそこで
interface Node {
}
自分用のinterfaceを作るとかですかね? >>232
Node.length って何? すべての Node は持っているわけではないと思うが
エレメントの種類が限定できるなら <any> のところにそのクラス名を書けば? babelとtypescriptって何が違うの?
あとes6が普及したらtypescript使う意味ってなくならない? >>233
すいませんでした
lengthプロパティはNodeインターフェースにあるのが正しいのかと勘違いしてました。
Element型にキャストして使うことにしました。 >>234
ES2015 + 型という図式です。
VSCとかと連携すると補完が聞いて素敵です。
EcmaScriptに型が付く予定はないと思うので差別化はできているのではないでしょうか?
逆に言語として学習コストが低くていいのではないかと(ES2015とあんまり変わらない点)。
特に新規のライブラリを使うときはEditorが教えてくれるので、凄くいいです。 >>235
Element型にもlengthってあったっけ…
>>234
es6が普及した場合、むしろBabelがその役割を終える
TypeScriptと競合するのは、JSDocの型注釈 @type かな
JS+JSDocの記述量を減らしたのがTypeScriptだと思う ちなみにjQueryでDOMをいじくるのが主な目的の人には向かないね
jquery.d.tsがany使いまくりだから素直にJavaScriptをそのまま使う事を勧める
それとDOMはJavaScriptとして使ってる内は気付かないけど
実はかなり型が複雑で理解してないと>>232みたいな問題にぶつかる
悪いのはTypeScriptではなくて元の仕様がそうなってる
直接DOMをいじる場合も型をちゃんと全部把握するかJavaScriptをそのまま使う方がいい >>239
むしろ型を把握していない人ほどオススメなのでは。
Editorが教えてくれるようになるし
実行時にエラーになってデバッガでチェックというサイクルを何度も踏む手間が省ける。 >>240
いやいや、例えばgetElementById()で返すのはHTMLElementだけど
これはlib.d.tsでextends HTMLElement検索すると分かるけど、全てのベースクラスだから
使う時は毎回適切にキャストする必要があって面倒臭い
で、間違うとコンパイルエラーとか実行時エラーになる
ちなみにjQueryとDOMでの話であって一般的には型があった方がいいのはその通り >>241
ちなみにHTMLElementの子クラスをキャスト候補として出す機能とかありますかね?
typeScriptというよりもVSCよりな質問かもしれませんけど。 “error TS2304: Cannot find name” の対応ってどうされてますか?
例えばchrome Extension作りたくて chrome.d.tsを用意したんですが
RROR in …/typings/browser/ambient/chrome/chrome.d.ts
(5221,70): error TS2304: Cannot find name 'DirectoryEntry'.
ERROR in …/typings/browser/ambient/chrome/chrome.d.ts
(5807,22): error TS2304: Cannot find name 'MediaStreamConstraints'.
ERROR in …/typings/browser/ambient/chrome/chrome.d.ts
(5809,22): error TS2304: Cannot find name 'MediaStreamConstraints'.
ERROR in …/typings/browser/ambient/chrome/chrome.d.ts
(5819,73): error TS2304: Cannot find name 'MediaStream'.
以下の様なエラーメッセージが出ます。
それで依存している型定義ファイルを探して追加するとまたこのエラーメッセージが増えていくので
該当箇所をanyとかにしてごまかしているんですが、
本来の対応方針としてどうすればいいんでしょうか? コード中でキャストしないようにと思うと
interface Document { getElementById(id: 'myElement'): HTMLAnchorElement; }
みたいな定義を読ませておくしかないよね >>244
typingsを使うときに勝手に再帰的に取りに行ってくれるオプションとか無いですかね。
今は諦めて、俺俺d.tsファイルに空のinterface作って対応してます。 >>245
JSON2HTMLというか、TSからHTMLを生成すると自然なんだろうか?
デザイン担当との兼ね合いで、そう勝手にはいかないだろうけれど。
>>246
「コンパイルが通らなかったのでキャストを追加しました」
的な危うさを感じるな……まぁ好きにしなされ。 とりあえずAngular2+TypeScriptを使えば全てが丸く収まる(はず) C,C++などの
#ifdef ABC
#endif
みたない構文はありますか? >>250
ない。
もし不要なコードの排除が目的なら、単にif文を使っておいて、
出力した .js に Closure Compiler 等の最適化を行うポストプロセスすると
最終的な .min.js からは無駄なコードを消してくれる場合もある。 >>251
なるほど。
でも、さっそく
if(false){
... // 不要なコード
}
としてみたら、
Unreachable code detected.
と出ました。
var use= false;
if (use == true) {
... // 不要なコード
}
で行けました。こんなやり方おかしいですか?
Closure Compiler はビルド後に実行するコマンドでやるのでしょうか? >>252
そんな感じでおk。var vs. const や == vs. === 等は
ポストプロセスとの相性があるだろうから試してくれ。
useの定義だけ単品のファイルにしてtsconfig.jsonで切り替えると良いかも。
もちろんtscの後に実行する。やり方はビルドツール次第。
デバッグ中はminifyされると面倒だから、リリース時だけ使うといい。 >>253
サンキュウ。
君詳しいな。また教えてくれよ。 関数のオーバーロードは、
function f(x: number):void;
function f(x: string): void;
function f(x: any): void {
...
}
とやるようですが、引数を取らない同名の関数も一緒に定義したいのですが、
function f():void;
これを上の定義に追加するとエラーします。
どうすれば良いですか? >>255
それ古い書き方。今時は
function f(x?: number | string): void { }
と書く 古い書き方でやりたい場合は
function f(x?: number):void;
function f(x?: string): void;
function f(x?: any): void {
で出来る >>256>>257
うまくいったわ。ありがとう。
もう一つ教えて。Visual StudioでTypeScript勉強中なのだが、
function f(){
...
return ;
...
}
とreturn入れると、
Unreachable code detected.
のエラーになってしまう。
JavaScriptなら警告だけなのに。
エラーになると実行出来ないのだが、対策ありますか? >>258
--allowUnreachableCode
tsconfig.json に書くなら "allowUnreachableCode": true
テスト用の一時的変更でない限り、高確率でバグだろうからな >>259
レスありがとうございます。
ググったらVS2013ではtsconfig.jsonが使えない?
ようなんですが、どうにかして
allowUnreachableCode を有効化する方法ありますか? JavaScriptの10個くらいのファイルがあり、それをTypeScript化したいのです。
全部のファイルで、同じmodule名で囲ったら、互いに変数や関数を参照出来ると思ったのですが、出来ませんでした。
TypeScriptではC#で言うところのPartial Classみたいにする方法ありますか? >>261
module/namespaceのexportしてないオブジェクトはローカル変数になるからできないね。
他のファイルから使いたいならexportするしかない。外部に公開されちゃうけど。
Partial Classについては、インスタンスなりprototypeなりに関数を代入すれば
似たようなことはできるけど、thisやsuperが扱えないかもしれないな。
インタフェースと declare var の組み合わせは代わりになるだろうか? lib.d.tsを参考に。 JavaScriptの方で擬似的に名前空間化されていないものに
後からnamespaceで囲う必要はないと思う
partial classは実行時に実現できたとしてもclass内部の型定義が不完全になるでしょ
interfaceはいくつでも同名で定義できるので、全てpartialのようなもの >>262 >>263
詳しい説明ありがとうございました。
>JavaScriptの方で擬似的に名前空間化されていないものに
>後からnamespaceで囲う必要はないと思う
JSのファイルは全部で50個くらいあり、
全部をTS化したいのです。
それで、取りあえず、ある特定の機能に関連している10ファイルを一つにしたくて、
同じmodule名で囲ってみました。
結局、その10ファイルの中でも互いに利用する関数はそれぞれexportして互いに利用し、
一方グローバル変数は一つのTSファイルに集めてそれらを全部exportして10個のTSや、他のJSファイルの中で利用しました。
こういう方針でやるのは、正統的ではないですか?
正しい手法があれば教えて下さい。 たまたま見つけてタイムリーだったので張っておく。現実装に依存しすぎだとは思うが。
> TypeScriptのクラスをnamespaceで拡張する
ttp://qiita.com/ConquestArrow/items/5d885128f896844698dd
複数ファイルから成る出力全体をモジュールで包む機能って無いんだっけ?
単に function() { ... } で囲んでくれるだけで良いんだけれど。
モジュール内部の各所では使うものの、外部からアクセスする必要のないものはローカル化したい。 最近はもうnamespaceを使うのはお勧め出来ないな。ES6の機能にないし
https://blogs.msdn.microsoft.com/typescript/2016/02/22/announcing-typescript-1-8-2/
この最初に書いてある方法がclassを拡張するには今時の方法なんじゃないかな?
ES6のmoduleは1ファイル1モジュールな感じだから全部のファイルを特定のモジュール名で括るという
考えは捨てるべきだと思われる
メインのファイルがそのほかを全部importして必要なものをexportするべきだろうね >>266
教えて貰ったリンク先見ても良く分かりません。
もう少し分かり易い例はどこかに無いでしょうか? >>265
classの中にnamespaceと言うのが
違和感有ります。皆さんはどうですか? typeScriptと相性かいいフレームワークってどんなのがあります。?
vue.jsと比べるとreactはかなり良さ気なんですが Angular2かな
まだベータ版だけどTypeScriptとの親和性は抜群というかAngular2自体がTypeScriptで作られてる
だから*.d.tsが要らない
あと最終的にはテンプレート文字列内まで補完が効くようになるらしい namespaceとmoduleの違いが分かりません。
ほとんど同じようなものだと思ってもいいですか? >>272
googleとmsの共同作品みたいなものですね。
reactと比較してのメリットはフルスタックなところですねー。
facebookもflowとか独自にやらずにtypeScript使ってくれればいいのに。
デメリットは学習コストなんですよねー。正直angular1で挫折したので、、、、
typeScript作のフレームワークとかライブラリって他に何がありますかねー? >>273
最初はmoduleしかなかったがTypeScriptのmoduleはJavaScript界隈のモジュールと
違ってnamespaceに近いものだから、後からmoduleの別名でnamespaceが追加された
要するに全く同じもの
そしてmoduleはobsoleteな感じだったが、1.8でまた蒸し返された感じだな >>275
解説ありがとうございました。スッキリしました。
>1.8でまた蒸し返された感じだな
なぜそんなに迷走しているのですか? >>276
言い方がまずかったかもしれん…迷走ではない
Ambient Modulesと呼ばれている機能が少し拡張されただけだ
moduleと1.8で拡張されたdeclare moduleは似てはいるが別モンと考えた方が良かったな
ただのmoduleはnamespaceに置き換えた方が誤解が少なくていいと思うが
declare moduleはモジュール定義を書くものだから必要なものだった playgroundから補完効くの気持ちいいんですけど、
外部ライブラリも取り込めるタイプのやつって無いですかね? http://stackoverflow.com/questions/12802383/extending-array-in-typescript
にある例
interface Array<T> {
remove(o: T): Array<T>;
}
Array.prototype.remove = function (o) {
// code to remove "o"
return this;
}
のようにして配列に対してremoveというのを追加したいのですが、実際にやると
Property 'remove' does not exist on type 'any[]'
と出ます。何がおかしいでしょうか?
VS2015のTypeScriptです。 >>279
呼び出してるとこも書かないとそれだけじゃ分からん >>280
呼び出す以前に、
Array.prototype.remove = function (o) {
^^^^^
このremoveの部分で上記のエラーメッセージが出ます。
もし理由や対策が分かれば教えて下さい。 >>281
Playgroundなら動くように見えるが、これでいいのか?
http://tiny.cc/1fw49x
tscのバージョンとかビルドオプションにも関係するかもしれない。
型チェックを厳しくすると文句を言われる気がする。
その場合は any にキャストして黙らせるんだろうけど。 >>282
サンプルありがとうございます。
何故かVSだとエラーするんですよね。 >>283
君は基本的な姿勢が身についていない
・質問をする場合は、再現可能なコード片を添付せよ
・エラーを特定し、メッセージを加工せずに報告せよ
>>279 だけ見ると、使用時にエラーがあるように読めるが
>>281 では、実装時にエラーがあるように読める(エラー内容は不明)
こんなことでは他人の手を煩わせるだけだ >>279
そのインターフェースが他のソースから見える状態じゃないとエラーになるし
prototypeへの実装も他のコードよりも先に行われないと実行時エラー
そのメッセージだと前者のようだけどな >>274
フレームワークと言えばUWP(ユニバーサルWindowsプラットフォーム)もあるな
TypeScriptでUWPを作るのは情報が少ないけど同じMSだから手厚いサポートがあるはず >>286
JavaScript/HTMLでUWP作れるから問題は無いんじゃない?
(UWPが流行るかはともかく)
VS2015ではまだプロジェクトテンプレートが無いけど、次期版には追加されるでしょ >>287
UWPってqiitaを観た感じはやっていていないけど、
UIをXMLっぽくつくりこめるってやつならReactNativeでいい気がする。 typeScriptでVSCのextension作りたいんですけど
動作の挙動を見るのに既存のextensionをデバッガで動かしています。
でもVSC自体がそのextensionを使っているとバッティングして上手く動かないので
別プロファイルみたいにして動かしたいんです。
でも、そういう起動オプションが見つからなくて困っています。
お助け下さい。 typeScriptのOptional型ってswiftのそれとは全然違うような。
interfaceのメンバにしか?使えないの?
返却値もoptional使いたい >>290
Swiftとは違うね。単に省略を許すだけ。
TypeScriptではすべての変数がOptional型といえる。
numberを返すと宣言した関数からでも、nullとundefinedは返せてしまう。
ロードマップにある 2.0 Non-nullable types が導入されればマシになるとは思う。 --strictNullChecks 一発でデフォがNon-nullableになるのは助かる
--noImplicitAny --noImplicitReturns と必須オプションがまた増えたな nullやundefinedを許していない状況で
省略可能引数にnullチェックが必要になるのは少し変な気がするから使わなさそう >>292
なるほどオプションで有効になる感じですね。
早く試してみたいです。
でも外部ライブラリとの整合性をどうするのか気になります。
swiftだと!がついているImplicitly Unwrapped Optional型とかいうのになって
明確に危険な型だと分かるようにしてますけど、typeScriptも似たようなものになるんでしょうか? フロー解析をするようになってきているから
use(x) はエラーになって
if (x != null) { use(x) } はエラーにならない
くらいのことをやってくれるはず。Swiftの!型に対応するものは要らない。 >>293
hoge?: number, じゃなくて hoge = 0, とかにすれば別にnullチェック要らないじゃん
で、
interface {
hoge?: number
と
function func(hoge?: number)
の
両方共nullableかつ省略可能で hoge: number? だと省略不可でnullableと考えると
一貫していて結構いいじゃない let hoge: number?;
とletの場合は省略するという考えがないからnumber?でnullableということだな >>295
ありがとうございますちなみにそのフロー解析はドコまでやってくれるんでしょうか?
例えばtypeScript上で書いたFuncAがあって
let a= FuncA()
use(a)
みたいにFuncAの中で返却値がnullチェックされていれば
上記のようにnullチェック無しで使えるんでしょうか? >>298
まだリリースはされていないからわからないよ。期待はしているけど。
その例なら function FuncA(): Foo? か : Foo か、関数の返値の宣言を見るのが自然じゃない?
FuncAの実装の中まで追うことはないだろうし、するべきではないとさえ思う。
それにしても、省略可能な引数の書き方ってどうなるんだろう?
function func(hoge?: number?) ← 厳密だが、?を2個も書くの?
function func(hoge?: number) ← 言葉通りだとnon-nullableなのにundefinedになりうる?
function func(hoge: number?) ← nullは渡せるが省略できない? 皆さんどういう環境でtypescriptやっているのですか?
winのvisual studioは少数派かな? 引数が省略されたかどうかを調べるための構文がないと不自然だな
hoge == nullみたいに使わないはずのキーワードが出てくるのはやっぱり変 >>301
だからNon-nullableがデフォだからって絶対nullが出てこないわけじゃないでしょ
DOMだのWebAPIは普通にnullを返すし自前の関数だってnullとかundefinedを返したいことは普通にある
それと引き数の省略には func(hoge = -1) とかにすればいいんだよ http://qiita.com/mizchi/items/95ee0101ac22e4b7b662
上記記事でtypeScriptディスられているんですが、
> 最近のTypeScript は動作環境のロックインが多くなりつつあり、またコンパイル後のJSはedgeで動くからこれでいいんだ、というMSの姿勢が若干透けて見えて、ちょっと距離を置きたい気分です。
というのは本当なんでしょうか?
具体的にどういうものがあるのか知りたいです。 jsあるいはtsに
nullとundefinedが有りますが、nullだけで十分だと思うんですが皆さんそう思わない? >>303
っ「要出典」
es5モードならほとんどのブラウザで動くし、es6だとEdgeでさえ動かない。node用。
一時期 async/await を強く推していて、.NET系言語、ES、Python にまで採用させた
(良く言えば、開発に協力した)のは、煙たがられていた印象はある。 機能的にundefinedで名前がnullのが1つあればよかった
nullはJavaScriptの癌と言える
TypeScriptのコーディングスタイルにもnullは使うなと書いてあるし
tslintでも警告を出せるからnullはもう使わないようにすべき >>304
JSだとさらに「undefinedを保持」と「未定義」の区別がある場合も。
「不在」と「不明」は別という考え方もあったが、結局、一般人には使いこなせなかったんだろう。
ちなみにLuaはnilしかなく、nilを代入するとJSのdelete演算子になるんだが、
「保持できるnil」(キーとしては残る)のためにnullが欲しいという話もたまに出る。
何が最良かは難しいところだな。 interface A {
a:string
}
interface B {
b:string
}
interface C {
c:string
}
type Hoge = A|B|C
すいません。上記のようなHoge型があったとして
Hoge型をA,B,Cの何れかのinterfaceに合致するかテストする方法ってどうすればいいんでしょうか?
できれば各interfaceのメンバに触れずに確認したいのですが、、、、 >>309
無理でしょう。TypeScriptのinterfaceはコンパイル後には何の痕跡も残らない。
実行時にはinterface由来の型情報は使えない。 TypeScriptはコンパイル時にはinterfaceを認識してるはずだが
コードでそれをチェックする術がないな (今後も追加される事は絶対ないだろうが)
しかしinterfaceのどれかに合致するかっていう考え方ちょっと違うな
例えば
interface A {
a:number
}
interface B {
b:string
}
があれば
{
a:1,
b:"hoge"
}
はどっちにも合致する訳だから、コンパイルが通ればどれか(または両方)のinterfaceに合致してる
と判別が出来るってだけのものだよ >>312
.js にコンパイルするときに Source Map を出力できる。
それ以上のデバッグについては開発環境スレでどうぞ。 >>312
weboack使ってるけどなんの問題もなくtsファイルにbreakpointが貼れる typeScriptでWeakMapっていつから使えるようになるんですか?
ES2015から使えるものっててっきりtypeScriptでもつかえるものかと --target ES6にすれば使えるっていうかそれぐらい察しろ >>318
えっ。それっておかしくないです?
typeScriptって基本 ES2015 + 型なのかと。
アロー関数は標準でサポートしといてWeakMapは対象外ってどういうことなの >>319
構文糖で対応できる機能は対応している
JavaScriptエンジンが対応してくれないとどうしようもない機能は無理
それぐらい察しろ >>320
なるほど。てっきりtargetって出力するjsコードの対応バージョンでしかなくて、
typeScriptの仕様自体はどのtargetでも変化しないと思い込んでました。
つまりES2015のpolyfillの役割も果たしてくれるとばかり思っていました。
ありがとうございます。 >>321
基本TypeScriptはES2015のpolifillだと思っていいけど
単に少ないコードで実装出来るものしか対応してないだけだ
__extendsとか__decorateとかね
2.0でasync/awaitもES5で使えるようになるけど、もしWeakMapを対応したら
巨大なコードが*.jsの頭に引っ付くことになるけどそんなの嫌だろ JavaのNashornにrequire関数組み込んでTypeScript使えるようにしたが結構楽しいわ
letの暗黙リネームが実行時に何か不具合起こすんじゃないかと少々気になる >>323
letが導入されてから1.8になるまでforループ内でlet使うと特定の条件で実行時エラーを起こしてた
1.8で修正されたから古いバージョンの場合は気を付けた方がいいけど1.8以降は不具合なんて起こさないはず typescript初心者です。
Visual Studioで、
module mod {
function func() {
alert('func');
}
}
が、
var mod;
(function (mod) {
function func() {
alert('func');
}
})(mod || (mod = {}));
になるのですが、分からないのは、
(mod || (mod = {}));
の部分です。
これは何でしょうか?
どなたか解説お願いいたします。あるいはヒントなどお教えください。 >>325
mod 変数が定義済みなら再利用 or 無ければ新規の空オブジェクトを使う。
複数の場所で mod モジュールが定義される場合に、内容をマージすることになる。 (A || B)はAもしくはBが偽じゃなければその内容(結果)を返す特性があって
単純に言うとmodが空ならオブジェクト代入して無名関数に渡すよってこと >>326 >>327
解説ありがとうございました。だいぶ分かってきました。
もう一つ教えて下さい。
二つのtsファイル
----------------
// file1.ts
module mod {
function func1() {
alert('func1');
}
}
----------------
// file2.ts
module mod {
function func2() {
alert('func2');
}
}
---------------- から生成される二つのjsファイルを単純に連結して一つのファイルにします。
----------------
var mod;
(function (mod) {
function func1() {
alert('func1');
}
})(mod || (mod = {}));
var mod;
(function (mod) {
function func2() {
alert('func2');
}
})(mod || (mod = {}));
----------------
こういう単純な例だと問題は無かったのですが、実際の状況では連結したJSの実行時にエラーする場合がありました。
少し調べた限りでは、エラーの有無はJSファイルを連結する順番に依存するようなのですが、そういう事はありますか?
やりたいのは、複数のJSファイルをmoduleで囲ってTS化して、そうやって出来上がったJSファイルを一つのファイルに連結したいのですが、エラーが出て行き詰っています。
こういうやり方は間違いですか? >>329
連結する順番でエラーになることはある。
特にグローバルスコープ(関数の外)で処理が走る場合かな?
tslint を入れて no-use-before-declare (宣言前に使うと警告) で
チェックする手はあるかもしれない。 >>330
情報ありがとうございました。
調べてみます。 おおって思ってchannel9の動画見てみたらマイクロソフトの人が未だにtsd
使ってデモしてたんだけどtsd非推奨じゃなかったんかい 面白いねTypeScript2.0
undefinedとnullはそれぞれ独立した型になって
let a: number|null|undefined
みたいに宣言するようになるのか C#のvirtual,overrideも実装してくれよ
issueには何度かあがってるけどその度に否定されてんだよな、何でだ 匿名通信(Tor、i2p等)ができるファイル共有ソフトBitComet(ビットコメット)みたいな、
BitTorrentがオープンソースで開発されています
言語は何でも大丈夫だそうなので、P2P書きたい!って人居ませんか?
Covenantの作者(Lyrise)がそういう人と話したいそうなので、よろしければツイートお願いします
https://twitter.com/Lyrise_al
ちなみにオイラはCovenantの完成が待ち遠しいプログラミングできないアスペルガーw
The Covenant Project
概要
Covenantは、純粋P2Pのファイル共有ソフトです
目的
インターネットにおける権力による抑圧を排除することが最終的な目標です。 そのためにCovenantでは、中央に依存しない、高効率で検索能力の高いファイル共有の機能をユーザーに提供します
特徴
Covenant = Bittorrent + Abstract Network + DHT + (Search = WoT + PoW)
接続は抽象化されているので、I2P, Tor, TCP, Proxy, その他を利用可能です
DHTにはKademlia + コネクションプールを使用します
UPnPによってポートを解放することができますが、Port0でも利用可能です(接続数は少なくなります)
検索リクエスト、アップロード、ダウンロードなどのすべての通信はDHT的に分散され、特定のサーバーに依存しません
4 Visual Studio Comm. 2015でTypeScript 1.7.4.0を使ってます。
プロジェクトをビルドしてデバッグしても変更が反映されなくなりました。
仕方なく新しいプロジェクトを作ってソースを移動させているのですが、対処法はありますか? >>338
>変更が反映されなくなりました。
何の変更がどこに反映されないん?
tsからjsが自動生成されないと言う意味?
もしそうならtsに文法エラーが有るんじゃないか? レスありがとうございます。こんなに早く反応があるとは思いませんでした。見逃してしまって申し訳ないです。
>何の変更がどこに反映されないのか
ソースコードの変更です。
ビルドして実行してもjsが前回のビルドのままで困っていました。
>tsからjsが自動生成されないと言う意味?
>もしそうならtsに文法エラーが有るんじゃないか?
仰る通り文法エラーがあったみたいです。今では正常に実行できています。ご迷惑をおかけしました。
それにしても間違ったコードを書いてもビルドエラーにはならないんですね……。
これではどこでミスったかチェックしにくい。 「新しいプロジェクトを作ってソースを移動させ」たらうまくいくのだがという話じゃなかったのか 「新しいプロジェクトを作ってソースを移動させたらうまくいく」ケースは俺も何度か経験したことがあるなぁ
しかも>>338と違ってコンパイルエラーは発生していない
ビルドして実行してもjsが前回のビルドのままってところまでは一致してるんだよな
(そもそもビルドできないのだが) Visual Studio2015で二つのTSのプロジェクトがあり、
Proj1
typescrpt1.ts
commonA.ts
commonB.ts
Proj2
typescrpt2.ts
commonA.ts
commonB.ts
両者で共通のtsファイルが二つあるのだが、こう言う場合、オリジナルをProj1に入れておいて、
Proj2から参照するようなやり方は出来る?
現状では、Proj1でCommonA,Bを変更する度にPorj2に手作業でコピーしているのだが、
それだと毎回そんな作業するのが手間だし、うっかりProj2側でCommonのファイルを変更すると
逆にProj1にも修正をしなくてはならないので困るのだが。 既存のファイルを追加すれば参照してくれるでしょ
プロジェクト以下に収めなきゃいけない理由がないなら
common, proj1, proj2と横並びにすればいい >>344
レスありがとうございました。
既存のファイルを追加すると、そのコピーが追加されるので、結局343 で
説明したようなファイル構造になります。
困っています。 VSでTypeScriptやってる人が少ないんでないの?
CとかC++を一緒にやってる人じゃないと最近の人はVSCodeを使うだろうし >>347
VSCodeだと343のような状況はどうなるの?
共通部分は一元管理が出来るの? 私もやり方知りたいが分からんのでスタティックリンクにしてるがそれじゃ駄目? >>349
windowsでスタテクリンク出来る? >>343
思想的には commonA/B を独立したプロジェクトにしてモジュールとして再利用するんだろうな。
こっそり同一ファイル扱いにするならファイル or フォルダをシンボリックリンクにするか。
これと似たようなものだが、昔は svn:externals を使ったこともあったな。 WindowsXPはハードリンクが出来るようになって便利だからフォルダをハードリンクにしたんだ
で、リンクした方が不要になったからごみ箱に入れたんだ
まだ、元のフォルダ内はなんともなかった
暫くたってごみ箱を空にしたんだよ
そしたら元のフォルダ内のファイルが全部消去されちまったんだよ!当然ごみ箱にも無い
要するにWindowsでフォルダをハードリンクすんなって事 >>353
Windowsってフォルダのハードリンク作れたっけ? そもそも別物なのに同じ挙動をすると期待するのが間違い XPでもジャンクション使えたけど
MSの態度が曖昧でどうしたいのかわからなかった
Vista でこの辺のファイルリンクとか代替ストリームとか正式サポートされた >>355
XPの時はフォルダのハードリンクは作れたよ。今は知らん
Linuxはフォルダ(ディレクトリ)のハードリンクはroot権限が必要になるな
OS問わずにフォルダのハードリンクは危険ってことだ
XPはシンボリックリンクが無くてハードリンクのみだから罠に嵌められた
Vista以降はシンボリックリンクが使えるからそっちは特に問題はないはず XPの時はフォルダのハードリンクは作れん。XP現役で使っている。
異なるドライブでも可能なジャンクションならできる。 >>359
もれも 358 はパーティションをフォルダにリンクする話と間違ってるなーと思ってみてた 358だけど何らかのコマンドでリンクを作成したのは間違いないが
調べてみるとlinkd.exeの可能性が高い
要するにジャンクションって事か?
なにぶんXP使ってたのはかなり昔の事なんで記憶が曖昧だったよ Linuxでもディレクトリのハードリンクはできなかったはず。
http://unix.stackexchange.com/questions/22394/why-are-hard-links-to-directories-not-allowed-in-unix-linux
>>358 のroot権限うんぬんは、Solaris限定かもしれない。
Windowsでも記事がある。今ならmklinkだけでいい。昔はfsutilなりlinkdなりもあった。
http://www.atmarkit.co.jp/ait/articles/1306/07/news111.html
フォルダのハードリンクはできないから >>353 も用語違い。
まぁ、ジャンクション+ごみ箱が多くの不幸な事故を生み出したのはその通りだが。 そんな事より元々の質問の答えは無いの?
俺も知りたい。共通ライブラリ化出来ないと不便だよな。 そんな事より元々の質問をVisual Studio 2015のスレで聞け。
簡単な回答は >>344 >>352 で既出。
VS2015のUIだとファイルのコピーが作られるのが問題なのだろうが
*.csproj を直接テキスト編集すれば上位フォルダのパスも扱えるようには見える。
Include="..\xxx" windows10でtypescriptやるには何をインストールすればいいのさ? 知らないものを始めたいときは、とりあえず「○○ 入門」でぐぐれ VSで作っているけど
#region
#endregion
的な物ない? >>369
Proposal: Preprocessor Directives
https://github.com/Microsoft/TypeScript/issues/4691
プリプロセスの提案はあるよ
でもこれに限らず、C#にある仕様だからといって優先的に取り組む感じはしないかな
節度を持ってJS文化に適合させていきたいのかもね プリプロセスなんてコンパイラだからこその機能なのにTypeScriptの設計者は
若干偏屈なところがあるよな
abstractは導入しといてvirtual,overrideがいらねーとか意味が分からん 色々入れすぎるとまたアンチM$(笑)から叩かれそう >>375
overrideは入りうるよ
一度は断ったけど、最近になって再検討して受け入れることにしたようだ
Support override keyword on class methods
https://github.com/Microsoft/TypeScript/issues/2000 https://github.com/showcases/programming-languages
TypeScript ★13,201
CoffeeScript ★13,152
遂にGithubスター数がCoffeeScriptを超えた 比べる事に意味があるとは思えんがな…
CoffeeScriptはAltJSでTypeScriptはBetterJSだ
JavaScriptが嫌いな人はCoffeeScriptを使えばいいんだ Intellij IDEAでTS開発捗りすぎワロリンヌ JavaScriptとTypeScriptの関係は
C言語とJavaの関係に似ている様な気がする プロトタイプベースは人類には早すぎたんだ
クラスベースでないと万人には理解できない プロトタイプベースは既存のインスタンスから継承できる先進的な機能ではあるが
そもそも他の言語では隠されてる継承の仕組みがむき出しになってるだけなんで
無理に使う必要もない
クラスを作るイディオムとか普通にclassを使えばいいんだ WebAssemblyは当面C++のゲーム用だけどDOMもいじれるようになる予定だから
そうなるとまたWeb用言語の勢力図は変わるかもしれないな
Webの世界に安定は無い デバッガが当分クソそうだけどWebKitはそのうち充実させて生JS殺しにきそう >>386
CとC++じゃね
統一言語の上位互換で、元々はトランスパイラだし 2.0のstrictNullChecksへの対応は結構キツイなぁ
「フィールドAがあれば、フィールドBも必ずある」ような暗黙ルールを咎められる
「変数?」が「型 | undefined」の扱いになるから
無効な値にはnullを使わずundefinedで統一したほうが良さそうだ
構文としては、返値、ローカル変数、末尾以外の引数にundefinedを許したい場合
いちいち「| undefined」が必要になる。Swiftのように ? は型の側が良い気がするんだが undefinedはプロパティそのものが存在しないことを表すんだからプロパティ側に?付けるのは自然でしょ
2.0は個人的にはかなり好きだな
最近の新言語といえばWeb系のノリで適当に作られてるのが多い中、これほど思想が明確で一貫した言語は珍しい 「存在しない」と「undefinedを保持している」の2つの意味があるからなぁ
前者ならプロパティの属性、後者なら型の属性に解釈できるように感じる
strictNullChecksは簡単には対応できなかったが
noImplicitThis, noUnusedLocals, noUnusedParameters は
影響が少ないわりにバグを拾ってくれてありがたかった >>398
JavaScriptはundefineって言われても本当にundefinedなのか意図的に設定したundefinedか判別不能だから
nullとundefinedを区別する意味があるけど、TypeScriptの場合は「存在しない」なんて有り得ないからnullは要らない子だし
undefinedの場合は意図的に設定したと分かる ノードの有無のチェックは存在を確認するし番兵は一般的にnullを使う
前者はプロパティで後者は型だろう F#「あなたはヌルチェックでどれほど人生を無駄使いしているかを知るべきである」 >>400
DOMとかWebGLとか普通にnullを返すからどうしてもnullを使わないといけない場面は出てくる
けど、TypeScriptだけの処理の場合はnullを使う意味は全く無いな
本家のコーディングスタイルにもnullじゃなくundefinedを使えと書いてある JavaScriptの根幹にある設計ミスだからな
トランスパイラの層ではその尻を拭うのも難しかろう >>404
知ってるけど命令型アルゴリズムを書くときにわざわざnullをundefinedに置換するほどのメリットもない
教科書通りnull使ったほうが思考のオーバーヘッドがなくて楽
どちらでもいい時はundefinedに寄せる Suggestion: Extension methods
https://github.com/Microsoft/TypeScript/issues/9
初期から提案のあった拡張メソッドだが、不採用が決まった 型の有無で動作が変わるのはTypeScriptの設計思想からして不適切 クラス定義には含まれないプロパティをインスタンスが持てる言語で
そもそも拡張メソッドが成り立つものなのかね?
Java interfaceのdefaultメソッドのほうがまだ芽がある気がするが >>406
教科書って何だよ
俺たちの教科書はTypeScript公式のドキュメントだけだ nullかどうか判定するのに
hoge === null
とかやってないよな?
!hoge
で統一すればundefinedのみで何の問題も無い 数値と文字が渡されないケースなら ! でも良い
渡されるなら == null (2個) を使う
TSLintの設定で、比較で null を使うのは許して、値としては許さないのが欲しいな >>413,414とかってnumberな変数にnullとか代入しちゃってんだろうな…
そりゃstrictNullChecksで困るわけだ 皆さん結局nullとundefinedを区別しているの?どんなコードを書いているの? 一つの変数で区別する用途を無理やり考えるならば
・undefined: 初期化前
・null: 利用不可
・object: 利用可
なんて例があるかもしれない。普通はNullObjectで済ませるか >>418
じゃあif(!hoge)の判定がTypeScript的には何も問題無いことは分かるよな?
どの辺が釣りなのか教えてくれ strictNullChecksを気持ちよく使いたいなら構造から見直しになるな
{ x?, y? } // 必ずペアで使う
ではなく
{ pt?: { x, y } }
としないと ! を避けられない だれかtypeScriptでバリバリサーバサイドもやってるぜって人いる?
使い勝手を是非聞きたい マクロのミスでconst enum同士で除算しちゃってて間違い探しをする羽目になったぜ
ありえない数値になってたのにコンパイラは叱ってくれなかったよ >>424
enum同士の除算結果の型はnumberだから、コンパイラの解釈は妥当だぞ
「単位付き数値」があればエラーにできるケースもあるかもしれない
Nominal typesの一環で良い感じの機能が入らないものか numberからconst enumへ暗黙的な変換が許されるのが問題だと思ったんよ
警告されれば先に気づくことができたから 暗黙も何もenumの要素は最初からただのnumberだからな
JavaScriptとの互換性を考えれば妥当な仕様だろう 他言語と比べると確かにチェックがガバガバだが
interfaceを明示的にimplementsしなくてもシグニチャだけを見ることと比べると
一貫性はあるとは思う。型システムがStructuralなことの弊害だろう
数値でなくても良いなら enum より String Literal Types を使うべきなんだろうな 型システム自体はJavaScript側にあるんだ
TypeScriptがやってる事はJavaScriptのソースに書かれてる型を見えるようにしてるだけとも言える
そもそもJavaScriptが動的型なんだから無理やり静的型にしようとしても微妙なところは出てくるだろうな switch使うとダサくなるな
match withにして欲しい 内部モジュールについて教えてください。
これを使う場合ってconcatで1ファイル化する場合ってことでいいんでしょうか
webpackをつかって1ファイル化する予定なんですがその場合は外部モジュールを使う認識であっていますか? 外部モジュールになるファイルは独立してるはず
今はnamespace推奨で内部モジュールって表現はあまり意味を成してない?
ので1ファイルにまとめたら名前空間で仕切られてるだけって考えでいいんじゃないか 昔からある単なるmoduleはもうobsoleteですぐにnamespaceにリネームすべきだね
いわゆるモジュールはJavaScriptの世界を知らないと理解しがたいものになってるね ES6のmuduleが普及すればかなりシンプルになるんだろうけど、まだブラウザがサポートしてない リエントラントを意識したことが無かったりすると
再入って言葉を再代入の変わりに使ってもいいじゃん?とか思ってしまうのだろう 「リエントラントな変数」はナンセンスだから、ま、多少はね? tsってjsに変換して型情報捨てちゃってるけどバイナリにコンパイルとかサポートしないのかな
WebAssemblyにそのまま使えたら面白いことになりそう asm.jsは文法だけjsのサブセットで実行モデルは全然違うんでサポートしないっつうかできなかったはずだが、WebAssemblyも同じじゃないの? 折角の型情報を活かせるのが構文チェックだけで
高速化には寄与しないってのは勿体ないのは確かだな TypeScriptのビジョン的には、そういうのはESが新バージョンで型アノテーションを導入して
ブラウザによって最適化されるべきということなんじゃない?
ハックで実装するのはTypeScript的じゃないよ ES5と同じようにwasm用のサブセット作って段階的にサポートしていけば余裕しょ アセンブリレベルまでコンパイルしようと思えば現在JSに丸投げしてる部分をTSで独自に定義し直す必要があるから、
仕様はサブセットどころか無茶苦茶肥大化するよ どうせJavaやC#がWebAssemblyの出力に対応するだろうし、高速化を期待するならそっちを使うべきだな ただ、Webの世界はAPIが全てJavaScript用に定義されてる訳だから
DOMをいじるとかWeb関連のコードを書こうとしたらJavaScript使うのが一番楽だろう
で、TypeScriptを使えばエラーの少ないコードが書けるよってだけの存在だな netbeansでtsファイルをコンパイルできますか? Visual Studio2015のTypeScript2.0で
if(1===2){
...
}
とすると、
エラー TS2365 演算子 '===' を型 '1' および '2' に適用することはできません。
になるのですが、1と2を比較すると何が悪いのでしょうか? >>452
Tagged Union 由来のエラーのような気がする
ナンセンスなコードだけど、気になるようならエラーレポートしておいで
片方が変数なら問題ないから、普通にコードを書くうちは表面化しない >>452
これは興味深い挙動だな
確かにnumberよりも1や2という「型」の方がより特殊化されてるからそっちで比較されちゃったんだろうな
let n: 1 = 1;
if (n === 2) { // 同じエラー
if (n === <number>2) { // OK (もちろんfalseになる)
number型定数のデフォがnumber型だと最初がエラーにならなくなるから難しい問題だな
定数同士の比較の時は型を昇格させるみたいな処理を追加する事になるのかな literal types増えたのリリースノートに書いてあるだろ
アナウンスのドキュメントさえ読まないバカが賢ぶってもまるわかりなんだよ Delphiか、、Prismはお試しで終わったっけな espower-typescriptのtypescript2対応版ってないですか? espower-typescriptは自動でproject rootのtsconfig.jsonを参照しているんですが
別ファイルで指定する方法ないでしょうか? >>458
とりあえず>>452のエラーの理由を詳細に説明してくれ typescriptでは、
こういう書き方をするようですが、
$(document).ready(() => { ... });
普通の書き方
$(document).ready(function () { ... });
だとダメなのでしょうか? >>464
全く問題ないよ。関数内のthisの指し先の違いにだけ注意がいる >>464
typeScriptというよりes2015ですね。 jQueryの場合はコールバック内で$(this)とかするけど() => {にするとおかしな事になる(最新だとどうなるかは分からん)
だからjQueryに渡す場合は全部functionにしてる。一貫性がなくなって気持ち悪いけど どちらも関数ではあるけど用途に違いがある以上、元より一貫性を出すことなんてできないでしょ >>468
用途に違いがあるっていうのかな?
functionの挙動に依存しちゃってるから仕方なく使ってるってだけだし、いずれ使う必要は無くなる >>471
|| のことかな? falseだとダメだけど typescriptでnode_modules配下のjsコードのimportは可能ですが
自作のjsコードをimportして使いたいのですが可能でしょうか?
具体的に言うとpegjsで作ったparserをtypescriptから使いたいんです。 公開部分だけなら自分で定義ファイル書くのは容易なんじゃないか
もしくはソースをTypeScriptに変換しちゃって-d付きでコンパイル ちょっと考えればtsだってjsに変換してからimportしてるわけだからエラーが出てるようにみえるのは
定義がないだけってわかるだろうに。アホですな。 typescript2.0から.d.tsのデフォルトの検索パスってどうなってるんですかね?
とりあえず自分で定義したのはnode_modules/@types/ に置くことで認識はするんですけど
気持ち悪いのでできればnode_modulesに置きたくないんですよね そう言わずに教えてあげればいいじゃない。どうせ話題もないんだし .net frameworkを使えたりframeworkからコンパイルできれば面白くなりそうなのに たしかに .Net Framework使えたら便利だな
現状ではNode.jsから外部コマンドを叩いて
C#やPowerShellを経由すればできるんじゃね やっぱりTypeScript使いの人はMicrosoftマンセーの人が多いの?
Mac使いとしては.Netが使えたからどうなんって感じなんだが。
ElectronとかでTypeScriptを使う話をしてるの? Windows向けtypescript処理系自体jscriptにコンパイルされて.NETオブジェクト経由でファイルアクセスしてなかったか >>483
>TypeScript使いの人はMicrosoftマンセーの人が多いの?
特定の企業が好きというよりかは
デファクトスタンダードに乗りたいだけ
WinとMacならWinが(価格性能比的に)使いやすいし
AndroidとiPhoneならAndroidが使いやすいから
(規制が少ないのでとくに開発側としては) typescript使うよりc#で書くほうが楽だよね >>481
JsProjectWinRTNamespace: https://msdn.microsoft.com/library/mt125480
WinRT (UWP) ならJavaScript側へ公開できるから、それを使うことは可能。
なんにせよ、JavaScriptホスト側を握っていれば (ChakraCore等) 好きにできる。Macでも。 >>484
.netじゃなくてWSHを使ってると思う
tsc.jsの2630行目辺りを読んでみれ >>485
surfaceて高いイメージあるが。
最近はmacも安いし、unix系だからweb系ならmacの方が人気ないか?
そしてtypeScript使うやつはweb系だよね。 Web系といってもBtoBの比較的かっちりしたものをやってるところはC#やJava使ってWindows上で開発してるところも多いよ
そしてTypeScriptもWeb系の中では比較的そっちの方で好まれてるイメージ Web系じゃないけどソフトのプログラムでJavaScriptが採用されてるから使ってるよ データと操作を分離する運用
https://goo.gl/L2gey4
上記スタックオーバーフローを見てたんですが
データ構造を扱うときにclassを使わずにすべてjsonにしてしまうって運用は結構を有る話でしょうか?
個人的にはElixirも触っていてデータ構造と処理関数を分けると言うのはアリだとは思うんですが
手元のコードはclass使いまくりでシリアライズが必要になったタイミングで軽く後悔しているところです(^ρ^) そんなに難しい話じゃないような
class Pen {
constructor(private json: PenData) {}
}
でいいじゃん >>494
それでデシリアライズしたものをシリアライズした時にどうやってPenDataだと特定するの? >>495
シリアライズした構造が固定なら、ルートから順に再構築するのでは?
自分で全てのコンストラクタなりdeserializeメソッドを実装することになる
汎用デシリアライズ関数1個で全てを賄うつもりなら、JSON内にクラス名を保持して
クラス名とJSONからオブジェクトを構築するファクトリを用意するのかな
TypeScriptは実行時型情報が無いから、意外と素直で原始的な方式になると思う >>496
ですよね。結局こういうめんどくさい実装になるので、だったら
最初からロジック的にデータ構造はすべてjsonにしてしまったほうが楽かなと。 >>497
ロジック的にJSON (=循環の無い木構造) にできるなら、それが楽だとは思う
実行時には循環参照が必要になる場合は、保存時にフラットなJSONに変換せざるを得ない
これを汎用化していくと、いわゆるO/Rマッパーになるんだろうな ここまでなんのためにシリアライズするか確認するやつなし >>495
そんなもんまともなスキーマ設計してたら一意に決まるだろ
JSは伝統的にAPI指向で、入出力のスキーマだけはきっちり守って
あとは適当に辻褄合わせすればいいという考え方をするもんなんだよ
エンティティを重視しないの chrome extension作ってまして
background - popup -contentscript間のデータのやり取りがjson経由でしかできなかったので。 永続化や通信でシリアライズが必要ならまず構成と通信内容を決めて
実装可能であることを確認してから個々の実装に入るべきだった
行きあたりばったりで通信が必要なデータやコマンドが噴出してるだろうから
個別機能に逃げずに先にそこを設計しろ >>501
普通にobjectを渡せるんじゃないか? React Componentを相対パスでimportするのはもう嫌なので、絶対パスでimportしてやる
http://qiita.com/endam/items/49696abedb68878d8b01
コレいいなって思ったんですがTypeScriptで絶対パス指定する方法って標準であったりしないですかね? みんなエディタは何使ってるの? VisualStudio以外にいいエディタある? Emacs
http://www.typescriptlang.org/
の下の方にEmacsのTypeScript開発環境へのリンクがある。メソッド補完とかリファクタリングとか全部出来る >>509
ALM
http://alm.tools/
好きが高じてエディタまで作ってしまった例 ALM 使ってみたけど、JIS キーボードで CTRL+¥ が効かなくてツリービューが出ない…
ファイル操作はツリービューでやるんだよね? >>513
本家のプレイグラウンドも楽しいけど、ちょっと他のライブラリとか合わせられるようなのもほしい。 こういうのと組み合わせて作ってくんないかなー。 TypeScript 2.1のkeyofとかMapped typesがアツい
http://qiita.com/Quramy/items/e27a7756170d06bef22a
そろそろ2.1正式版来る気配 >>521
パスやファイル名に日本語が有ると
エラーする問題はこれで直るのか? しかしkeyofとかTypeScriptスゲーな
型言語としてやれる事はとことんやろうという方針なんだな
keyofは既存のJavaScriptコードと連携する時にコーディングミスをコンパイル時に分かるようになるって事かな
TypeScriptオンリーの時は多分使いそうにないけど、何か使いどころがあるんだろうか? と思ったらMapped Typesでkeyofが必要だったんだな。納得した。
Mapped Typesは使いどころを模索中… ちょっと手段が目的化してる感が否めないなあ
最初からTypeScript前提で作ったモジュールを使う分にはkeyofが必要な状況はそう無いだろうし、
既存のJSライブラリのインターフェース書くための機能だと割り切るんだったら
そこまで厳格にDRYに拘る必要もないように思うが ・interface を readonly の有無で2回書かなくて良い
・エレメントに設定する一連の属性をオブジェクトで渡す際の型安全
ぱっと思いつくだけでも悪くない機能だと思うけど classのコンストラクタを定義する場合、もしメンバ変数が20個あるとすると、
コンストラクタにも20個の引数を並べて、
constructor(arg1, arg2, ......, arg20){
this.parm1 = arg1;
this.parm2 = arg2;
this.parm3 = arg3;
..
}
のようにする必要がありますか?
もう少し簡素に書けませんか? constructor(public parm1, private parm2) { >>532
そんな技が有ったのですか!
ありがとうございました。 型システムがチューリング完全になっててもおかしくないな
たしか scala と c++ は達成してた筈 C++はtemplateでしょ
template引数の扱いがほぼ帰納関数の定義みたいなもんだしな TypeScriptの型はあくまで検査専用でメタプログラミングには使えないから無理じゃない? C++のテンプレートがチューリング完全だとしても文字列のハッシュ値は計算出来ない
なぜならC++の文字列はポインタでしかないけどコンパイル前に参照する事が出来ないから
それでもチューリング完全なのは間違いないけど、別にチューリング完全だからってなんでも出来るわけじゃないってことだな ちなみに文字列じゃなくて文字の配列にすれば問題ない
const char* str = "hoge";じゃなくて
const char str[] = { 'h', 'o', 'g', 'e' };ってこと 間違えた…
const char str[] = { 'h', 'o', 'g', 'e', '\0' };
だった
連投ごめんなさい ゲーデルはホント天才だよな
紙と手廻し計算機しかない時代に
「符号化すれば数式だろうが証明図だろうが数で表せるし
数の計算が数式処理や証明じゃん」なんて TypeScript 2.0.8でちょっとお尋ね
~~~~file1.ts
namespace TestNS { export interface TestInterface {} }
~~~~
~~~~file2.ts
/// <reference path="file1.ts" />
import * as Lib from "〜"; ← こいつがいると下のTestInterfaceでTS:2304 Cannot find nameが出る(コメントアウトすれば出ない)
namespace TestNS {
export class Test implements TestInterface {}
}
~~~~
上に書いた通りimport文がいるとTestInterfaceでTS:2304 Cannot find name 'TestInterface'になるんだけれども, これってどう理解したらよい?
import文の有無で見つからなくなるのはとても不思議な感があるんだけど 内部モジュール形式と外部があって内部だとネームスペースはすべて同じものとしてマージされるから参照できる
内部ゴミだから外部覚えろ reference pathは使わないことを勧める
型定義ファイルの参照はreference typesや--types
連結するなら目的別にプロジェクトを分けて--outFile 結局外部モジュール化して解決しました
細かいことは組んでからコンパイル済みソース見て考えることにします TypeScript 2.2
https://blogs.msdn.microsoft.com/typescript/2017/02/02/announcing-typescript-2-2-rc/
・object type - "non-primitive"を表す型
・mixins and composable classes - 無名クラスを返す関数のサポート typescript版のjsFiddleみたいなのないですかね? >>550
https://jsfiddle.net
typescript選べるんだけど、何がお望み? >>551
補完が効かないとtypescriptの意味ないよね。 typescriptでvue.js使ってる人っています?
どんな感じか聞いてもいいですか?
vueファイルのscriptにtypescriptを使った場合にVisualStudioCodeから補完聞かせる方法ってあるんですかね? typescript ってclassの中でclassは定義できないの? >>556
innerClass = class { ... } の構文を使ってみては? >>557
さんきゅう。
その後、自分でも調べてそういう構文を見付けたのだが、
なぜ一般的な言語のようにclassをネスト出来ないのかな? 構造的にESにないものは採用されないんじゃなかろうか
俺もprivate static Inner = class {...で試したけどあまり使えなさそうだからやめた Chrome拡張機能を作ってる方結構いるみたいなので教えてほしいのですが
「chrome.〜〜〜」のAPIが「Supplied parameters do not match any signature of call target.」とコンパイルエラーになります
「/// <reference path="./node_modules/@types/chrome/index.d.ts" />」でd.tsは指定しているのですが、他にも何か記述が必要ですか? >>561
そもそも今は/// <reference path=みたいな書き方はしない。
@types/XX npm install すれば使えるはず。 皆様ありがとうございます…解決しました…chrome.〜〜に引数が設定されてなくてエラーになるという超凡ミスでした…
エラーメッセージの意味をきちんと理解しないといけないですね…
--- コンパイルエラー ----------------------------------------------------------
if (window.location.href.indexOf('aaa.com') !== -1) {
chrome.pageAction.onClicked.addListener();
}
------------------------------------------------------------------------------
--- コンパイル正常 -----------------------------------------------------------
if (window.location.href.indexOf('aaa.com') !== -1) {
chrome.pageAction.onClicked.addListener(() => {
});
}
------------------------------------------------------------------------------
あと、仰る通り<reference path= />なくてもコンパイル通りました
皆様お騒がせしました >>565
エディター何使ってんの?
typescriptなら書いてるそばから検出できるエラーじゃないのか? ターゲットにWebAssemblyを追加する計画とか無いのかな interfaceの定義でArrayの要素が2つしかない場合の定義の仕方ってあるかな
interface Pair {
number[2]
}
interface Data {
pairs :Pair[]
}
みたいな感じで定義できないもんか。
諦めてnumber[]にするしかない? >>569
thanks
type Pair = [number,number]
interface Data {
pairs :Pair[]
} index.htmlに直接CDNからreactとreact-domを読み込んで
npmからは@types/reactと@types/react-domをインストールし
tsxファイルからimport文を使わずにreactを使ったところ何の問題もなく動いた。
plotly.jsを同じように使おうとしたら自動では定義ファイルを読んでくれない。
この違いは一体何なのか?
と思って定義ファイルを見たところreactとreact-domには以下のような記載がある
export as namespace ReactDOM;
export as namespace React;
上記を真似て定義ファイルに
export as namespace Plotly;
を追加したら同じ挙動になった。
export as namespace XXX ってなんすか? そのモジュールのグローバル変数化宣言
公式wiki嫁 型定義ファイルの書き方がよくわからなくてつんでいます
node-transmission
https://github.com/FLYBYME/node-transmission
の型定義ファイルが見当たらないので作っているんですが
もとのjsファイルのexport宣言が
var Transmission = module.exports = function (options) {
ってなっている場合に型定義ファイルとして以下のように書いても認識されないです。
declare interface transOptions {
port: number
host: string
}
declare class Transmission {
constructor(optins: transOptions)
}
export default Transmission
使う場合に
import * as Transmission from "transmission";
var transmission = new Transmission({
port : 9091,
host : '127.0.0.1'
});
って書いてもtransmission はany型のようです。
どう書くのが正解でしょうか? >>573
すいません。自己解決しました。
JSのモジュールまじしんどい 劣るうえ、使われてないdartは自動消滅。
ホントはわかってたこと。 typescriptでreduxの実装書くのしんどいね
http://qiita.com/wadahiro/items/7c421b668f28a99e2a29
こいつを参考に書いてるけど。他にいい書き方があれば >>579
おまおれ
mapStateToPropsとかの引数も型どうしていいか分からん TypeScriptでreact-router-reduxに手を出したら大変な目に遭った。 >>576,577
もうjavaやめてtypescriptでandroidアプリ開発できるようにしてほしい。
でも本心はdart頑張れ。 >>579
これの2.0/2.1用ってのをやってみたら#defineが欲しくなった。
ストリングリテラルを置き換えられるマクロみたいなものってないのかな? >>587
何が欲しいのかよく解らんが
const ABC=”str”
じゃあかんのか? そのABCはストリングリテラル型には使えんわけよ。 redux の冗長な書き方をtypescriptの機能でなんとかしてほしいってことなんだろうけど。
react見たくpropsをinterface定義すれば大体いい感じで使える。みたいにredux の方もstateのinterface定義だけでいい感じに出来上がるような仕組みがほしい。 >>589
const ABC:"str" = "str";
こういうことか それ。
strが短いならそのまま書いても一緒だけど、actionのtypeって長くなりがちだから
二重に書くのがつらい。 constは型書かなくてもストリングリテラルに推論されるようになったんだが存知ない? ストリングリテラルに推論されるって?
これ通らないでしょ?
const STR = "str";
const ABC: STR = STR; >>597
そりゃ二行目がストリングリテラルじゃないからね だからそれが書けないから>>593だってことだろ。
結局>>595は何の話をしてたんだ? なにがやりたいのかよく解らんが
const STR = "str";
const ABC1 = STR;
const ABC2:”str” = ABC1;
type STRT=”str”;
const ABC3:STRT=STR;
全部通るよ >>599
エラーメッセージも読めない奴がずいぶんと偉そうだな
ドキュメント100回読み直してこい >>600
やりたいのはそこで言うSTRTとSTRの共通化。
要は同じ"str"を重複して書きたくないってこと。 変数の型の参照なんて初歩の初歩なんだが教えてやるまい >>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;
}
こういう関係が正しい関係では? 理解してない奴を炙り出すのにも静的チェックは必要なんやなって >>702
プロパティだとセットのときを考えるとcontravariantじゃないとダメだしゲットのときにはcovariantじゃないとダメだから結局invariantが必要になるような気がする
アクセサならsetのパラメタとgetの返却値で型が異なってもいいから問題ないと思うけど >>702
継承出来ないのは当たり前って言うのは分かる
ただ上書きする構文が欲しい >>705
ジェネリクスあるし上書きする構文が必要になる状況が分からん 上書きなんぞせずとも別の名前付ければよくね?
デメリットしか思い付かないし実装されないと思うが、仮に実装されたとしても予想される実装方法はBの型を通してアクセスしたときは型名とかをprefix付けた別名になるようにトランスパイルされるようになるだけでしょ extends Aじゃないけどその定義を流用してBを定義したいということか? B extends Aじゃないから当然
(hoge:B)=>{
let foo:A=hoge;
}
みたいな事は出来なくて良い(というか出来ない) 世の中にxがstringかnumberの場合があるのなら、x: string | number という定義が正しい気がしますが ジェネリクスだと>>699の問題がどこまで解決できるんだろう。 >>713
interface X<T> {
x: T;
y: string;
}
interface A extends X<string> { }
interface B extends X<number> { } flowとtypescriptって
どっちが良いの? >>715
圧倒的TypeScript
異論は見ろめない enumってstring literal型出てからほぼ使わなくなったからなあ
コード内でimportできるのもよくわからん
何がよくなったんだ >>720
なるほど Promiseで返すってことはasync await 前提なんかな。
ちょっと非同期周りで互換性のないライブラリ使ってると途端に不便になるから
一長一短ではあるんだけど。全部がPromise使うライブラリで固められれば便利になるんかな。 jsの仕様変更そろそろ収まって欲しい。
import周りってこれで安定するようになるのかな。 filterの中でasync await って使えないんですかね? >>723
無理
rxjs使うか設計見なおせ
具体的に何をしたい? filterの評価関数を作ろうとした時に、今まで作ったやつが全部プロミス返す設計になっていたので、
シームレスに使おうとしたらasync-awaitを使えないかなーと。
将来的にここもasync await使えるようになるのかな。
結局ループを回して絞込処理を実装しましたわ。 ループでawaitしちゃうってパフォーマンス悪くない?
await promise.all([].map(async () => {}))
こういうのが普通では? >>729
ずっとpromise.allの存在を失念してた。
これでmap的な使い方できるね。
ところでtypescriptのプロジェクトで自作helperライブラリを使う時にいちいちimportを使うのが面倒くさいんで
自動でimportする設定ってtsconfigにないかな? typescript便利だけどやっぱり型が後付の弊害がなかなかしんどい。
nullを許容しない前提かと思って使っても結局
実体はnullが突っ込んであったり する。 弊害じゃなくて人為的ミス
誤りに気付いた者が正せばいい swaggerのジェネレーターが出すコードなんだよね。プルリク出すのが面倒です サーバーサイドの言語仕様とswaggerがstrict null checkに対応してないだけであって
typescriptは何も悪くないのでは >>734
本体がstrict null check対応しても
モジュール側が対応してないとそこは無視するってことです?
例えばモジュールが強制的に T | undefined | null 型になるとかならいいんですけどね type Action =
{
type: “A”,
id: number
} |
{
type: “B”,
payload: any
} ….
みたいな定義がある時に
interface ALias {
[type: Action.type]: () => any;
}
export default <Alias> {
“A”: func1,
“B”: func2,
}
みたいに書けないですかね?
つまりAction.typeをinterface の条件に入れたいってことなんですが。 インデックスシグネチャがstringかnumberしか受け入れない現状では
Aliasを定義する時点でキー(Action.typeの値)が
分かってるなら interface Alias { 'A'?: Func; 'B'?: Func; }
分からないなら interface Alias { [type: string]: Func; } >>730
interface Actions {
A: {id: number};
B: {payload: any}
}
interface Arias {[key in keyof Actions]: () => Actions[key]}
こういうことかな? 携帯から書いたけどエラー起きてるし意図理解できてなかった。
こういうことかな?
type Action = { type: "A" } | {type: "B"};
type Arias = {[K in Action["type"]]: () => void}
http://i.imgur.com/17xtAlw.png >>740
おー。聞いてみて良かったです。半分諦めてたんで。
上手く動きました。ありがとうございます。 >>742
もっとこういう質問で賑わってほしい
書いてて気持ちいい言語だから
angularやreactは流行らなくていいけどフロント開発の標準はtypescriptになってほしい >>743
定義ファイルがなくて自作するハメになると途端に苦痛になるけどな。
あとReactというかReduxつかってて合わせてimmutable.js使ってると
いつの間にかclassがjsonに変わってることがあってその場合はtypescriptの型と合わなくなるから
しんどい。型が後付じゃない言語ならこういうことがないから、ちょっと辛い。
結局reducer内で使う時にjsonからimmuatblejsのclassに変換して
state返す時にjsonに戻す処理を毎回入れる方針になった。
immutable.jsは全然typescriptと相性が良くない。
XXX.set(‘member’, value) みたいな構文になるから。
もっとtypescriptで使いやすいimmutableなライブラリないかしら。 >>744
新バージョンではXXX.setが型安全になるからもう少し待て
リテラル型とkeyofを使うらしい https://goo.gl/7Ty7Tq
こんな感じのコードでファイルのアップロード処理を作りたいんですが
上手く動かなくて悩んでいます。 お助け下さい >>744
immutablejsというのは使ったことないけど、
XXX.set(‘member’, value)みたいな処理もkeyof使ってラップしてあげればkey毎に違う型のvalueに対応できる。
例えばES6のMap<K,V>クラスをラップすれば以下みたいなこともできる。
まあ新しいバージョンで対応されるならわざわざラップクラス作る必要ないがw
class TypeSafeMap...(省略
interface IObject {
name: string;
height: number;
isYes: boolean;
}
const safeMap = new TypeSafeMap<IObject>();
safeMap.get("name") // string型
safeMap.get("height") // number型
safeMap.set("name", 1) // NG
safeMap.set("name", "one") // OK
https://goo.gl/j6hy4T >>747
こちらは結局 イベントリスナーをcickではなくchange にすることで上手く動くようになりました。
>>748
typescriptのジェネリクスの性能いいですね。
結構知らない機能がまだありそう。 >>749
それはよかったです、てっきりclickイベントをjsで発火させてファイル選択ダイアログを自動で開かせたいのか思ったw >>750
そうなんですけどリスナーのイベント指定がclickではなくchnageだったってことです。
https://goo.gl/QHZCsG
before
i.addEventListener(‘click’, async (e) => {
after
i.addEventListener('change', async (e) => { >>751
たしかのそれもひとつの原因ですね
ですがclickイベントの発火も多分動かないのでは?chブラウザにもよると思いますがchromeで動かなかったですよ >>752
動きましたよ。少なくともchromeでは。動くコードを>>751に貼ったんで >>753
>>751は手動のクリックイベントからclick発火してるので動きますね
>>746はsettimeout内でclick発火してるので、動かないです typescriptでreduxのミドルウェア書いてる人っていませんか?
export interface Middleware {
<S>(api: MiddlewareAPI<S>): (next: Dispatch<S>) => Dispatch<S>;
}
上記interfaceを満たすコードを書けなくて困ってます。サンプルコード的なのどっかにないですかね? reduxってreact関係の何かなのかな?
相変わらずreactの作法は意味不明
流行らずに消えてほしい すみません
今パッケージングというのかライブラリのシステムは何を使うのが正解何ですか?
electronやってみようと思ってタイプライブラリをいれようと思っていろいろなサイト見てやってるんですが
どれも失敗します
今の定番の方法を紹介してるサイトってありませんか?
それとも今は時期がまずいんでしょうか? >>757
よくわからないけどelectronのtypescript開発は少しややこしい
メインプロセス側と画面側でプロジェクト分けるのが主流で、メインプロセス側はgulpビルド、画面側はwebpackビルドみたいになって少しややこしい 回答ありがとうございました
もうしばらく待ってみます >>756
はやっちゃってるんだよなぁ。
React自体は凄くTypeScriptとの親和性は高い。というかむしろ推奨しているくらい。
ただReduxはTypeScriptからどう使えばいいのかよくわからなくて >>755
自己解決したので書いておきます
ただのロガーの場合
import { Action } from 'actions';
import { State } from 'reducers';
export function myMiddleware(store: redux.MiddlewareAPI<State>):
(next: redux.Dispatch<State>) => redux.Dispatch<State> {
return (next: redux.Dispatch<State>) => (action: Action): Action => {
console.log(store.getState());
let result = next(action);
console.log(store.getState());
return result;
};
} typescriptで書かれてる有名なライブラリって何があるの?
Rx.jsはtypeScriptで書かれてたね。 googleが作る言語はゴミばっかだからしゃーない
言語のセンスは圧倒的にMSの方が上
MSというよりヘルスバーグが有能すぎる >>766
goはいいぞ。素朴でモダンという相反する要素を持ち合わせてる。
エコシステムはモダン。
言語仕様は素朴。 J++とかJ#とかManaged C++とか割と救いようのないものも作ってるけどねMicrosoft
でも全体としては確かに良い言語が多い印象
Googleの言語もGoとか(使ったことないけど)人気みたいだし, そもそも作った言語の数が大分違う気が マイクロソフトはvsc出したときはなんでatomの二番煎じやってんのって思ったけどやはり製品としての完成度高くて感動する。
開発環境作らせたら最強と言う噂は伊達じゃない。 MSは言語と開発環境では最強
ネットや機械学習ならGoogle
アップルは…嫌い MSは言語と開発環境では最強
ネットや機械学習ならGoogle
アップルは…嫌い すいません。
例えば以下のようにアクションを定義してあったとして
export type Action =
{
type: 'FETCH_MAIN_FEEDS';
} |
{
type: 'SET_MAIN_FFEDS';
payload: comm.Contentlist;
} |
{
type: 'DO_NOTHING'
};
ジェスリクスの仕組みを使って
type ActionType = 'FETCH_MAIN_FEEDS' | 'SET_MAIN_FFEDS' | 'DO_NOTHING'
をActionの内容変更に合わせて自動的に作る方法ってないですかね 自己解決
export type Action =
{
type: 'FETCH_MAIN_FEEDS';
payload: undefined;
} |
{
type: 'SET_MAIN_FFEDS';
payload: comm.Contentlist;
} |
{
type: 'DO_NOTHING';
payload: undefined;
};
type ActionType = Action['type'];
type PayloadType = Action['payload'];
思いの外簡単であった typescriptのエラーってよくわかんないことある
(81,32): error TS2322: Type '{ path: "/logout"; component: typeof Logout; }' is not assignable to type 'IntrinsicAttributes & IntrinsicClassAttributes<Route> & Readonly<{ children?: ReactNode; }> & Rea...'.
Type '{ path: "/logout"; component: typeof Logout; }' is not assignable to type 'Readonly<RouteProps>'.
Types of property 'component' are incompatible.
Type 'typeof Logout' is not assignable to type 'StatelessComponent<RouteComponentProps<any> | undefined> | ComponentClass<RouteComponentProps<any...'.
Type 'typeof Logout' is not assignable to type 'ComponentClass<RouteComponentProps<any> | undefined>'.
ってでて、何のことかわからない。
偶然解決して、総合するとReact.Componet<P,S>のSをvoidに指定は駄目ってことらしい。
上記エラーメッセージからどう読み取ればそういうことなわけ? @typesやパッケージ自身が持っているd.tsに問題があるとき、自分のプロジェクト内で
部分的に修正版と差し替えたりできないのかな?
Typescript2.4に上げたらいくつかのパッケージがエラーを出すようになってしまったんで
大元が対応するまでの間ちょっと回避したいんだが。 リンク先のそれは解決法として正しいのかという疑問はあるがとりあえず、declareで
定義を上書きできるということかな。試してみるわ。ありがとう。 ここでredux-observale薦めてもらったのもあって試してるんだけど
epicを書く時 action$.ofType('FIRST’)って書いてfilterするのはいいんだけど返ってくる
Observaleがtype:’FIRST’に絞り込められてくれない。
無理やりキャストして使えってこと?
いい方法教えてください VS2017は2015と違ってJavaScriptで
var a = {};
a.b = 1;
と書いてその下に「a.」と入力しても候補にnumber型プロパティとしてのbはない
TypeScriptのnamespaceがブラウザの生JavaScriptでも使えるようになったら便利そうなんだけどな >>782
いやいや。具体的に指摘してほしいな。
reduxのactionは基本的にobjectであれば何でもあり。というスタンスのもので
そのactionに継承関係を設定してるのはたまたま定義ファイルの作者がなんとなく決めた程度のものでしかない。
となると元々の定義を修正してしまっても不都合はないと思うんだが。
更にいうとreduxのmiddlewareの定義ファイルも、結構declareで大元のreudxの定義を改変してる。
(redux-thunkとかredux-promiseとか) 「具体的に」と言っている当人が具体的にに何を指摘しているのかわからない件 モジュール拡張書いてる人っていますか?
ローカルではうまく書けるんだけど、
npmで管理して外部モジュール化しようとするとうまく動かなくなる。
jsとd.tsに別れるとだめなんだろうか、、、、。
なんか参考になるnpmライブラリが有るなら事に教えてくださいm(_ _)m >>787
jsとd.tsを同じ所に置けばおk
angularとか参考になるよ >>788
ありがとうざいます。js とd.tsは同じ場所においてます、、、、
ちょっとangularはわからなかったのですが
rxjs5はoperatorをモジュール拡張の仕組みを使っているので参考になりました。
それを元に書いてるんですが、、、
どうしてもうまくいかないです。 >>789
npm rxjsした時のフォルダ構成とビルド結果が同じようにすればおk
もちろんパッケージ.jspnとかもな typescriptってユーザー数多そうなのに
どこに生息してるん?
teratailもあんまりいなさそうだし。slackとかかね?
おせーてください typescript は google 社員御用達だぞ
ここのレスも 99 割が google 社員のもの MSとgoogleのマリアージュとか最高じゃないかな。 >>791
TypeScriptはほぼJSだから他の言語と違って特に質問するような事ないし… >>794
定義ファイル周りとか結構悩むことない?
例えばreduxとかそのまま使うとTypeScriptの補完機能を活かしきれなくて
typescript-fsaとかを使って補強してやると凄く調子良く動く。 https://jp.vuejs.org/v2/guide/typescript.html
vuejsもtypescriptとの親和性上がってるのかな。
昔はいまいちだったんだけど typescriptでjest使ってる人っています?
行番号がめちゃくちゃになっちゃうんですが、どうすればいいんですかね?
inlinesoucrmap: trueにセットしても改善せず。
行番号以外は上手く動いてるんですけどね。 es2015とかes2017はどうかな?
async await使えるの幸せ。 さすが俺達のTypeScript
TypeScripts Type System is Turing Complete
https://github.com/Microsoft/TypeScript/issues/14833 >>799
ジェネリグスだけでプログラミングできるってこと?
わけわかめ tsconfig.json で noImplicitAny をtrueにしてみたら、npmからのモジュールをimportしている部分で
こういうエラーが大量に出るようになってしまった。
error TS7016: Could not find a declaration file for module 'モジュール名'.
importをrequireに戻したら逆に不便だし、自分で .d.ts を用意するには数が多すぎて追いつかない。
noImplicitAny の対象を自分のコードのみに限定する(node_modules以下を対象外とする)
なんてことはできないんだろうか。 >>802
俺は普通に使えてるけどな。tsconfig全体を貼ってみたら? あと使ってるライブラリも。ライブラリによって違うのかな?
俺はreduxとかreactとかmoment.jsとかimmutable.jsとか色々入れてるけど
特にそういう不具合が起きたことはないな。
多分デフォルトでtsconfigの中身はnode_modules対象外な気がする。
一応聞くけどwebpack使ってないよね? このへんのモジュールが引っ掛かった。全部じゃないけど。
react-spin
cookie-parser
uuid-parse
>一応聞くけどwebpack使ってないよね?
そう、webpack使ってる。
module: {
rules: [
{
exclude: /(node_modules)/,
test: /\.[jt]s$/,
use: [ { loader: 'ts-loader', options: { configFileName: "tsconfig.json", } } ]
}
]
},
tsconfig.json はこんな感じ。
{
"compilerOptions": {
"module": "commonjs",
"target": "es6", "allowJs": true, "strictNullChecks": false,
"noImplicitAny": false, "noImplicitThis": true, "noImplicitReturns": true, "sourceMap": true
},
"exclude": [ "node_modules" ]
}
excludeの設定を間違えているのかな? なんだ、全部のd.tsが見つからないって言ってるわけじゃないなら、node_modules関係なくない?
足りないd.tsファイルは自作するしかないでしょ。インストールしたのに見つからないなら問題だけど webpackのresolveが抜けてるんじゃない?
resolve: {
extensions: ['.ts', '.tsx', '.js', '.jsx'],
modules: [
"node_modules/"
]
}, >react-spin
あとreact-spinは型定義にないみたいね。でもこれくらいなら五分で自作できるから大丈夫。 >>806
noImplicitAny = false なら .d.ts が無くても使えていたんで何か方法はないかと思ったけど、
無いならしょうがないね。ありがとう。 最初に書いたとおり、単に数が多いからやってられんてだけ。 >>811
あーなるほど失礼
もともとjs案件だったってこと? (new Error()).stack みたく 実行箇所のtsファイル名と行番号を取得する方法ってないですかね。
プリプロセッサみたくコンパイルする過程でファイル名と行番号に変換するような定数があればいいんですけど o : any が"x"というメンバーを持っているか調べるのは if ("x" in o) でできるけど、
o.x の型がstringかどうか調べようと if (typeof o["x"] === "string") とやるとESlintの
no-string-literalに引っかかってしまう。
このルールを無効にする以外にメンバーの型をチェックする方法ってないですかね? >>814
無理 any型を使ってる時点でtsにできることは無い >>814
一旦変数に入れてからアクセスすればいいんじゃない
const x = "x";
if (typeof o[x] === "string") { ... >>816
なるほど、そんな方法が。うまくいったみたい。ありがとう。
使う直前で変数に入れるならdisableにするのとさほど変わらないけど、メンバー名はどこかで
一元管理しておけってことかな。 >>817
単に変数oにinterface定義してあげればいいだけでは。
そもそもtslintじゃなくてeslint使っているという状況もよくわからない あぁ、eslintって書いたのはtslintの間違い。
>単に変数oにinterface定義してあげればいいだけでは。
ネットワークやファイル経由のjsonとか、型情報が落とされたオブジェクトからの復元なんで。 >>818
いや静的型チェックと実行時型チェックをごっちゃにしちゃダメでしょ
TypeScriptは静的型チェックを提供するものなんだから実行時型チェックにinterfaceなんて持ち出す道理がない TSの環境の開発の旗振りって誰?
いつになったら開発環境が安定するの?
webの情報のほとんどが古くて使えない まずVSCodeをインストール
npmでts2.xをインストール
型定義は@types/xxxxxxx TypeScriptの実装じゃなくて環境の方だろ?
型定義ファイルもTypingsとか@typesとかいろいろ変遷してきたし TypeScript1.0が出たころ何冊も本が書かれたけど、その後どんどん進化するから誰も手を出さなくなったな。 進化に関係なく使う人が居て需要があれば本は出される
出されないってことは・・そういうことだ ジェネリクスで教えてほしいことがあるんですが
型がundefinedかそうでないかで処理分岐をしたいんですがどうすればいいでしょうか
https://goo.gl/L6wazS
上記のようなコードはジェネリクスだとPはコンパイル時に解決されるものだからダメですよね。
じゃあどうすればいいんでしょうか。
もちろん引数にpayload:P みたいなのがあればtypeGaurdが使えるんですけど、それがない場合は? 試してないけど、Pのローカル変数を置いてみるのは?
初期化できないとダメかな。 コンパイル時に型自体の比較が出来ればいいんだけどねぇ 型がundefinedって言うのは違うのでは?
変数がundefinedならわかるけど考え方の次元が違う気がする
Add<undefined>(item);ってありえないだろ >>831
undefined型、null型あります undefined null void never 使い分け出来てる? >>829
だめでしたわ。やはり最終的に生成されるjsコードが型がないからなにもないところに型を定義するのは無理っぽい
ジェネリクスって使う側には幸せだけどライブラリを作ろうって思うとなかなか難しいす。
実は以下のコードが小さくて見やすいので改造できないか試しているんです。
https://github.com/aikoven/typescript-fsa/blob/master/src/index.ts
store.dispatch(someAction()) というように同期型のアクションを作るときはパラメータ引数無しで使えるんだけど
非同期アクションを使おうとした場合はパラメータ引数なしの表現ができないんですよ。
store.dispatch(someAsyncAction.started(undefined)) と書かなきゃけない。
ここのundefinedを省略する方法を探っていたんですよね。 そもそも何がしたいのかわからないんだけど
引数追加したいけないのか? 引数にPが含まれていない以上呼び出し時の型パラメータはハードコーディングしなきゃならんわけで、
それならOnlyH用の関数と分けてしまっても大して変わらんだろう。処理自体は共通化すればいいし。 C++でならテンプレートの特殊化で書けるし書きたい気持ちはよく分かる >>838
もちろんそれならできることは確認してますが、それだったら引数にundefined
許容したほうがいいかなーと。
ジェネリクスは知らないことが色々ありそうなんでもしかしたら解決方法があればと想ったんですが、、、、
typescriptの進化を待ちます、、、。
>>840
c++だとできるんですか。
どう書くのか知りたいです >>841
何というかC++のテンプレートは強力過ぎる
Boost::Spiritみたいにコンパイル時に構文解析器を生成するような変態的なことさえ可能
ただしコンパイル時間は死ぬ
ttps://ideone.com/6V11EP
C++っぽくないコードだけどとりあえず >>842
わ、わかんないです。c++昔使ったことがあるから分かるかと思ったら全然わからなかったという。
でも、ありがとうございました。 import 'reflect-metadata';
function logType(target: any, key: string) {
var t = Reflect.getMetadata('design:type', target, key);
console.log(`${key} type: ${t.name}`);
}
class Demo {
@logType
public attr1: string;
}
Visual Studio 2017 で上記のビルドは問題ないのですが
実行すると、「exports は定義されていません」と出てしまいます。
tsconfig.json で
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
は指定しています。
何か足りないのでしょうか? >>844
実行環境が書いてないから正確にはわからんのだけど
chromeとかブラウザ環境のjsはモジュール管理機構が無いからwebpackとか使わないと直接は実行できない。 初心者なんだけど質問いいだろうか?
JS使う必要ある→ES5以前気持ち悪い→ES6未対応多い
という流れでTypeScript勉強しようかと思ったんだけど、手元にある本が分かりやすいけど1.0対応なんだ
追加機能を順に追えば問題ないだろうと思ったんだけど、更新箇所が多岐にわたるためか結構面倒で
ある程度網羅してそうなのも1.0からは追ってなかったりして、少し悩んでる
バージョンごとの差分を丁寧にまとめてくれているサイトか、
最新に近いバージョンを網羅的に解説してるサイトを、差分を意識しながら読もうかと思ってるんだけど、
慣れてる者の視点で、なんかいいサイト or 書籍があったら教えてくれないか? 公式のWhat's newがベスト
差分付き公式アナウンスの日本語訳もあったはず >>847
ありがとう
公式サイトのドキュメントは「英語でこれだけ読むのはだるい」と回避しちゃってたけど、
確かに差分把握程度なら英語苦手でもなんとかなりそうだし、どうしても分からなければそこだけ別途調べればいいかな…… >>847
なんか完璧ボケたレスした、すまない
読んで公式確認して〜してる間に2行目が頭から抜け落ちてた
日本語訳あるなら探してみるわ >>846
その用途ならbabel使え
型が欲しい人が使うのがTS 俺的には初心者こそTypeScriptってカンジがするけどね。
書いてる最中にエラーが出るから曖昧な知識を補填してくれる。
基本的にはES2015 + 型 だからESの仕様を勉強してればそれがTypeScriptとほぼ一致する。 >>850
型がある方が楽なんで問題ありません。ありがとうございます。
普段よく使うのが C#, Ruby なんで CoffeeScript も見た目や好きなんですけど……。 俺はもうTSだけのトランスパイルで落ち着いちゃったんだけどBabel通すメリットある?
Symbolない環境でもArrayLikeをfor-ofできるならBabel使うけどそうでもなさそうだし
わざわざビルドを複雑にする理由がない やることなくなったんならcommunityに丸投げした大量のバグ修正しろやって感じ プロジェクトの管理者が長期休暇で居なかったからな
今回はバグ修正とリファクタリングが多い
不在の間に溜まってたissueとPRも整理途中って感じだ 4はパフォーマンス改善が大きい
あとはifとか
もう9月だから5出るぞ 自分でTL;DRって書いてあるからそっとしておけばいいのに >>862
もうそんな時期か
ネットで探すと2ばっかりで4少ない >>865
tldrの意味を間違えて解釈してないか? https://eow.alc.co.jp/search?q=tldr
TLDR
【略】
=Too long. Didn't read.
長過ぎ。読みませんでした。/長文うざい(と言う人のための要約)。
◆【場面】ネット上などで「文章が長過ぎる」と文句を言う。転じて「長文を嫌う人のための要約」という意味でも用いられる。 ○次受けが多いほど退場率が早くなる。高くなる
直受けの50万 客:いつまでもうちにいていいよ
3次受けの50万(客は90万払ってる) 客:短期延長していい?
5次受けの50万(客は150万払ってる) 客:作り終わったらとっと出てけ できなかったら即退場だ
長時間労働 高稼働 高スキル要求が多い
零細フリーランスサイトは5次受けから誰もできない難易度の高い仕事 余り物の仕事を紹介してくる。40万円代でやってくれと
これならJIETから3次でいったほうがいいな
446非決定性名無しさん2017/08/02(水) 22:12:48.95
JIETに毎月5千円払えば3次から入場できるだろ?
高額をうたうフリーランスのサイトはだいたい5次から45万円
JIETで閲覧応募できる末端価格からさらに搾取するのが高額をみせつけるフリーランスサイトでした
高額案件をみせつけるフリーランスサイトも案件の取得はJIETでした
JIETに加入すれば誰でも3次60万からスタートだ。フリーランスのサイトをやってる
自称エージェントもそこから案件情報を取得しきてる。サイトで60万で釣って40万から55万の間でやらしている。
372仕様書無しさん2017/08/11(金) 10:31:43.41
フリーランスで検索すると引っかかる零細ITがやっているフリーランスのサイトはだめだ。
高額に見せているけど実際は50万前後
JIET加入した方がいいよ。案件は毎日千件以上末端価格は60万円 平凡な稼働時間の80万円の案件もある。
ユー子も求人をだしてる。名刺も渡せる。ユー子に名刺が渡せるんだぞ。夢のようだ
自称エージェントはJIETから流れてくる案件を転売してるだけだった。
JIETに加入すれば誰でも案件に応募することができた。収入が40万50万台にならなくて済む
エンド - ユー子 - エージェント-JIET 公表価格 90~60 - エージェント×3 = 言い値50万以下
エンド - ユー子 - エージェント-JIET 公表価格 90~60 - エージェント×1 悪質な言い値で50万以下
エンド - ユー子 - エージェント-JIET 公表価格 90~60 - JIETに加入して公表価格で応募できる jsbinみたいなやつでautocompleteをサポートしたeditorあるやつないかな。
誰か作って immutable.js v4まだちゃんと動かんのね。補完効くなら早く使いたい。 flowは静的解析ツールでtypescriptが言語ってことでいいの? 今はTSとほぼ同じ構文が使えるみたいだし推論が強い分言語としてはFlowのほうが格上になったと思うよ
開発ツール等を含めた評価はどうなるか知らんが >>878
対応するライブラリが圧倒的に少ないからflowはゴミだよ
TSと完全互換とかならまだ可能性あったかもね 最初は俺もゴミかと思ったけど静的解析ツールとしてってことだと
jsのプロジェクトに段階的に型をつけていくならありかなって思ったんだよね。 >>880
TSだって段階的に型を付けられるっしょ。 非英語Issueが次々と投げ込まれていくところを想像すると胸が熱くなるな
誰がこういうの決定してんだろ コマンドラインメッセージが日本語化されるの?いらんだろそれ ローカライズありがたいけどところどころ明らかな誤訳が混じってる 誤訳を見つけてくれてありがとう
お前のプルリクを待ってるぜ! コマンドラインよりhandbookの方を翻訳してほしいよね 2.4.2から2.5.3に上げたら、User defined type-guard functionとTagged union typeの組み合わせで
型をうまく判断してくれなくなった。バグか仕様変更かどっちだろう? TypescriptでReact使ってる人にお聞きしたいんですけど
Componentを継承して新しいコンポーネントを作るわけですけど、
class CurrentComponet extends React.Component<Props> {
}
とつくってさらに
class NewComponet extends CurrentComponet {
}
とやってNewComponetをつくるとしますよね。
それはそれで使えるんですけどNewComponetのpropsはCurrentComponetのpropsしか使えないですよね。
PropsをNewComponet用に拡張する方法ってないですかね?
素直に一からComponent作るしかないでしょうか >>892
class CurrentComponet<T extends Props> extends React.Component<T> {
} >>893
うほー。神よ!
でもぶっちゃけ何が起こってるのかよくわかってないです。
> class CurrentComponet<T extends Props> extends React.Component<T> {
上記Tは一体いつ解決されてるんですかね。
そもそもTypeScriptでReactのコンポーネントの書き方ってこっちが正解だったりするんで? それか
class CurrentComponet<T> extends React.Component<T&Props> {
}
でもいいな
こっちが使う側からすると楽かも
>>894
説明面倒だからggrks >>895
単純にReact.d.tsと見比べてみると良い。結局使う時に<Props>を使えるようにCurrentComponet<T> としておくのが目的
ジェネリクス型に追加情報を与えるための概念と考えると分かりやすい。
<T>をTopに残しておいてそこを解決すると React.Component<T>も自動的に追従する >>870
いろいろあるけどちゃんと探した?
今さら誰かに再発明してもらって↓とかに勝てるの?
https://codesandbox.io >>899
おっ。そこは知ってたけどTypeScriptのコード補完効くとしらなかったわ。ありがと 地味にawait書き忘れてちゃんと動かないというパターンが多発してるんですが
TSLintでawait入れ漏れで指摘する機能ってないですかね? >>901
c#だと書き忘れた場合はコンパイラが警告出してくれるんだけどね なお間に合わなかったバグフィクスはガンガン後回しにしてリリースする模様 >>906
アンギュラーってぶっちゃけ使ってる人いるの? Google自身が使ってないのにどうして使うというのか 2.6になったらコンパイルエラーが多発する。react-redux のconnect周りで。
なんでー MEAN勉強中なのにangulerってマイナーなの?ショック コンストラクタを複数定義できないのでしょうか??
うーん。 オーバーロードはできるけど、実装は1つとか・・
JSONへのシリアライズ・デシリアライズは自分で制御するので、
constructor(json: any)と
construcotr(parameter1: type1, parameter2: type2)
二つ用意したいんですけど。最初は
construcotr(parameter1: type1, parameter2: type2)だけ用意しえ、
staticメソッドの方に
statis parseJson(json: any): Class1として、そこでconstrucotr(parameter1: type1, parameter2: type2)を呼んでたんですけど、
これだと子に親のインスタンスの参照渡せないんですよね。 ごめんなさい。これじゃ何いってるからんし、意味不明ですね。 願望なんだけど
Typescriptは言語自体がWebアプリ開発用に
丸ごとフレームワークになったら良いと思う。
Flash(flex)のActionscript3も
フレームワーク化達成した様だし。
http://flex.apache.org/ >>920
JSのスーパーセット目指してるんだし無理に決まってんだろ >>920
TypeScriptでkoa.js使えばいいんでわ?
なんか違うの? >>923
すみませんkoa.jsの存在を知りませんでした。
良さげなので検討してみます。 人気沸騰中のはずなのに年々参加者が減っていきついにアドカレ作られすらしなくなったTypeScriptさん TypeScript関係ないけど、アドカレVue.jsすげぇな。React人気ないのか?? ES6普及したから
AltJSへの興味が薄れてるんじゃね? まだasync await周りが完成してないけどね。
とりあえずmapとかfilterが普通に使えるようになってほしい stackblitzいいな。マジでplayground系の決定版感ある。
https://stackblitz.com/edit/react-ts typeScriptのinterfaceで配列の要素数を制約する方法ってありますかね? >>932
何に使うの?
空でない配列なら分かるけど もしかして:タプル機能を知らない
let vec:[number,number=[1,1]; ミス
let vec:[number,number]=[1,1];
もちろんこれでもOK
type Vec=[number,number];
let vec:Vec=[number,number]; 前にもタプルあるのにタプル欲しい言ってたやついたような https://www.typescriptlang.org/docs/handbook/advanced-types.html
タプルもだけど、このページ読んでない人多くね?
TypeScript語るなら&、|、is、keyofくらいマスターしておけよな >>937
すっかり忘れとりました。Enumとかも使ってなかった。
>>940
ですよね。
>>933
online vscode と名乗ってる (´・ω・`) デコレータがなんの役に立つのかわからん… 一時期使ってみたが全部取っ払って今は一切使ってない
デコレータを使う設計自体が悪い
技術的負債になるワークアラウンドが不運にも市民権を得てしまったのがデコレータ
デコレータを使うのは未熟者の証 使ってないけど、デコレータはDI(dependency injection)(依存性の注入)に使うんでしょ?
そもそもそれが必要な事なのか知らんけど DIはコンストラクタ注入だけでいい
メソッドだの継承だのデコレータだの無駄に複雑なだけ interfaceを使ってるとjsonでセーブする時にすごく便利なんだけどメソッドが生やせないのが辛い。
なんとかならないかな まぁ、classレベルならいいけど、interfaceレベルだときついかもしれんが。 localStorageとかreduxとか使ってると意図せず型変換が入ってtscはDate型の想定なのに実際はstringという状況マジ勘弁してください。 >tscはDate型の想定なのに実際はstringという状況
そりゃ不適切な型付けしてしまっただけじゃね?
stringを入る可能性があるanyをDateと決め打ちしたとか。 DateがJSON serializableじゃないって話でTypeScriptの問題でもない インスタンスではなくclass を引数に取った関数を作りたいんですが、良い方法がないでしょうか?
redux.connectをラップする関数を作りたくて上記手段を求めています
サンプルコードはいかにおいています
https://goo.gl/FF5jFc >>958
すんません。自己解決
interface IBase {
new (message: string): Base;
} 返り値とか省略すると推論してくれますけど推論の結果を取得する方法ってないですかね?
vscodeでカーソルを合わせてると出るんですけどカーソル合わせている間しか出ないのでコピペしづらくて。 TypeScriptでglobal import的なものってないですかね?
ロガーを作ったんですけど、それを毎回importするのがしんどくて Conditional types関連は既にmergedなのか 小躍りしながら使ってみたところ速攻でバグにぶち当たって無事死亡
修正されるまで一回休み 型を後付した言語の限界があるよな。
ストレージに一度保存して意図せずjsonになってたり、関数のインターフェース上nullやundefind許容しない設定にしてても結局js側でnullの可能性のある値を渡されたらバグるし。
例えばjsとtsの境界部分。
モジュールとして外出ししている関数とかのインターフェースとかをきちんとnullチェックしてくれるコードを自動で埋め込んでくんないかな。 それは信頼できないjsが悪いだけだろ
外部のクソコードはどうにもならん TypeScriptが目指してるのはコンパイル時型チェックであって実行時型チェックではない
コンパイル時型チェックならパフォーマンスに影響はない(処理系によってはむしろ向上する)が実行時型チェックは明確にパフォーマンスが落ちる
PHPなんかは実行時型チェックを実装しちゃったもんだからクラスのメンバに型宣言するRFCすらリジェクトされてる >>969
ですよね。それはわかっているんですが、、、、
せめてlint的な感じでjs向けのインターフェースが null| undefinedの可能性があるから直せみたいな警告が出るといいんですけど。
async func 内の await記入漏れと一緒にほしい。 http://blog.yux3.net/entry/2017/06/08/202859
あと objectとObjectがあるって知らなかった。
hyperappの型定義で始めて見た。 jsから呼ばれる部分はどうやってもチェックしようがないと思うぞ。 yarnのワークスペースを使用して、Create React AppとCreate React Native App (Expo) で共通のコードを共有する
https://taiyaq.com/contents/gk1Kr17x8vW9LIozNo51lez9rr
を参考にしてcreate-react-app でtypescriptプロジェクトを作ったんだけど
ワークスペース内での型情報の共有がうまくいかない。
それぞれ単体では動くんだけど。既に試している人っている? ブラウザで動く個人的なちょっとしたものしか作らなくて、
ライブラリはimportしないで自分でscriptタグで読み込んでるから、
@typesの定義だけ欲しいんだけど、今って中身のないstubばかりで
importしないと使えないんだけど、これってどうすればいいのでしょうか?
仕方なくファイルをルートにコピーして、意味がわからないまま
export as namespace hogehoge; みたいな文をくっつけたりして
何とか機能するようにしてるけど、非常に困ってます いろいろやってみたけど、なかなか上手くいかない。
tsc --listFilesってやると、定義自体は読み込めてるようなんだけど、
要するに、d.tsファイルがIsomorphic modules (UMD global)ってやつに対応した書き方になってなくて、
それに対応するためにexport as namespace hogehoge; が必要だったりするらしい
https://www.typescriptlang.org/docs/handbook/modules.html#umd-modules >>974
ちょっと言ってることがわからないからこういうときは小さいサンプルでも作ってどっかにあげてみてくんない?
そしてそうやって小さくまとめてみると意外と自己解決したりするもんだ。 例えばmomentを使う場合、scriptタグでmoment.jsを読み込んでいれば、
自分のjsではconsole.log(moment().format("YYYYMMDD hh:mm:ss"))みたいに使えます。
そのjsをtypescriptで書こうとした場合、moment()の定義が必要になります。
そこで@types/momentをインストールするわけですが、@typesはオワコンらしく、
実際にはmoment自体のパッケージもインストールされて、その中の定義ファイルが
参照されるようになります。
しかし、自分が使おうとしているmoment()は、トップレベルのwindow.moment()なわけですが、
定義ファイルでは、そのことが考慮されていないために定義を見つけられないようです。
(エラーは出ますが、anyとしてコンパイルはされます。)
その定義を見つけらるようにするおまじないが、export as namespace moment;のようです。
結局は、モジュールシステムに合わせた定義ファイルの書き方を
理解している人が少ないのだと思います。
export hogehoge とか export default hogehoge とか export = hogehogeとか
わけわかりません。 >>978
@typesは別にオワコンじゃない。
型定義を提供するのに2つのルートがあるってだけ。
momentは作者側で型定義を提供してくれてるってだけ。
ところで解決したってことでいいんだよね?
/// <reference path="./mytypes/moment.d.ts"/>
みたいな感じでカスタムしたd.tsを読めばいいだけだし。 つーかUMD対応中みたいだね
https://github.com/moment/moment/pull/3688
ワークアラウンドとして
import * as _moment from 'moment';
export as namespace moment;
export = _moment;
というd.tsを作ってimportすればいい import使っちゃった意味ないんだけどね
vueみたいに複数のファイルに分けられちゃうと大幅に変えないといけないから
気軽にプルリクできない感じがする
だが自分でその場しのぎの対応してると、バージョン上げられた時に詰む 勘違いしてた
import _moment from 'moment';
export as namespace moment;
export = _moment;
とか、
import _Vue from 'Vue';
export as namespace Vue;
export = _Vue;
みたいに書けばいいのか。
すごい。解決した TSConf 2018
https://tsconf.io/
初のカンファか >>983
次スレのテンプレに入れたほうがいいものとかある? tsconfigのexcludeの項目を、compilerOptionsの中に書いてて、何でダメなんだろう悩んじゃった
設定はcompilerOptionsの中に書くものと思い込んでて、全然気付けなかった >>986
リポジトリとかWikiとかWhat'sNewあたり?
あとは流れで 俺のtypescriptが好きすぎる感情をどこにぶつけていいかわからない >>990
俺も俺も!。qiitaでもいいしココでもいいよ!! safariが次のIEと呼ばれているように、
Typescriptは次のcoffeescriptと言われているwww このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 1092日 3時間 14分 38秒 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php レス数が1000を超えています。これ以上書き込みはできません。