TypeScript 構文を JavaScript で許容するとかありえないんだけど
- カテゴリ:
- JavaScript
- コメント数:
- Comments: 1
◆ 1 altJS でしかない言語を標準に入れるなんてありえない
◆ JavaScript ユーザのメリットはないし混乱の元
◆ JavaScript ユーザのメリットはないし混乱の元
https://devblogs.microsoft.com/typescript/a-proposal-for-type-syntax-in-javascript/
TypeScript の構文を JavaScript でも認識してコメントとして扱うことで無視するらしいです
TypeScript は JavaScript のスーパーセットなので型関連の部分が無視されれば JavaScript として動作するからコンパイルがいらなくなるとか
個人的にはありえないですね
TypeScript は altJS のひとつでしかないです
なぜそんなものの構文を JavaScript 側で受け入れて動作するようにする必要があるのでしょうか
以前 CoffeeScript というのが流行って Github だったかどこかの有名どころのデフォルトのフロントエンド言語として使われていたこともありますが 今では廃れました
TypeScript も今流行ってると言うだけで将来的にずっと使われるとは限りません
型をつけるという需要はずっとあり続けるといったところで 型の付け方は TypeScript の方法しかないわけでもないです
TypeScript に変わる物が出てくるかもしれませんし TypeScript 自体がメジャーアップデートで大幅な構文変更をする可能性だってあります
そのたびに JavaScript 側の構文にも影響し ブラウザが対応することになります
そんなサードパーティツールの都合で標準である JavaScript が影響受けるというのはおかしな話です
コンパイルなしでそのまま動かしたいというなら 現在の JavaScript のコメントとして書けば良いです
JavaScript としてはコメントなので無視されます
TypeScript 側が構文を変更し JavaScript のコメントとして書けるようにすればいいだけです
旧来のアノテーション風以外でも 例えば TypeScript 用の型コメントを /** **/ としたなら
と書いて TypeScript がこれを認識するようにすればいいです
ブラウザでそのまま動かしたい人はこの記法に変えればいいです
JavaScript のコメントなので JavaScript ではこれでも動きます
そもそも TypeScript が流行ってると言っても JavaScript 全体からすればごく一部です
ウェブは本来ウェブに関係ない人たちでも 情報を公開するためにウェブページを使っているので その他言語に比べて環境は特殊です
ES2015 以降の JavaScript ですら全体からすれば一部の人しか使ってないです
Chrome の統計データでどういう機能がどれくらい使われてるのか見れるページで見てみると よく使われてそうな機能でも使用率が低かったりします
https://chromestatus.com/metrics/feature/popularity
ネットで積極的に発信するような声の大きな人たちが使ってるだけで JavaScript ユーザからすると TypeScript TypeScript 言ってる人は一部でしかないです
そんなごく一部の人しか得せず 多くの人たちにとって何の恩恵もない機能をなぜ入れる必要があるんでしょうか
Promise や async 関数といった機能は機能として使えるので使わない人的にも価値はあると言えます
それに比べこの TypeScript 構文は無視されるだけなので何の価値もありません
最低限ブラウザで PHP や Python での型指定のように実行時の型チェック処理が動いてこそ検討する価値が出てくるものです
仮に実行時に型チェックするような仕組みになっても 今の TypeScript の型はやめてほしいです
事前コンパイルで消える前提なものです
JavaScript だと class はコンストラクタ関数であり 関数なので実体のあるオブジェクトです
その他言語だと class 自体は実体がなく実行時に値として扱えるようなものではない事が多いと思いますが JavaScript だと変数に入ってる値です
それと同じように type で定義したものは変数として参照でき 関数の引数や返り値に指定した型情報も取得できるべきです
たしか Python だと関数の annotation 情報として取れたはずです
本題からそれるのでこの話はこの辺にします
現時点で TypeScript の構文をサポートしてもメリットがないだけではなくデメリットだけがあります
現状の JavaScript のコメントはネストもできない単純なものですが TypeScript の型をコメントと認識するには TypeScript の構文を理解してパースしないといけないです
それだけでパフォーマンスが落ちます
わずかとはいえ メリットもないことのためにただパフォーマンスが落ちるのは許容されません
加えて意味がないけど意味がありそうな型情報が書かれているなんて混乱の元でしかありません
自分のコードしか見ない人ならともかく他人のコードも読むのであれば TypeScript まじりのコードも出てきて混乱の元です
上で例に上げたようなプリミティブ型を型名で書いているだけならシンプルなので 大したことないと思うかもしれません
ですが TypeScript で書かれたプロジェクトのコードを見ると関数定義の引数や返り値の部分だけで何行にもなる型情報が書かれていたりします
Generic とかも入ってきて難解です
JavaScript にすれば 1, 2 行程度で済むコードなのに TypeScript では 10 行近くで書かれていたりもあります
普段 TypeScript を読み書きしない人からすると読めたものじゃなく どこまでが型でどこが処理される実体(JavaScript で残る部分)なのか即時に判断できません
結局読むために JavaScript に変換した上で読んだりすることも多いです
自分でコンパイルしたくないというだけで JavaScript に不要な苦労を押し付けず altJS を使うなら各自で処理すべきです
サーバ側で静的ファイルを返す際に .js がなければ .ts から自動で変換して以降はキャッシュするとか SW でブラウザ内で変換するとかすればいいです
それにこれが通るようなら そのサードパーティでよく使われる構文も入れることになってくるでしょう
例えば React で使われる JSX などです
無視するだけで意味のない TypeScript よりは価値がありますし TypeScript 構文なんて無視するだけのものを通してこういうのは許可しないなんてするとそれこそ不満が多く出るでしょう
そうなることを防ぐためにも許可するべきではないものです
また外部に積極的に発信するような人がみんな TypeScript を好んでいるというわけでもないです
OSS のライブラリ作者などでも TypeScript 反対の人は少なからずいて issue で TypeScript 信者から TypeScript で書き直してと要望が出されてお断りしてるケースもあります
中には NO と言われているのにしつこく TypeScript を使うべきだと主張しているのを目にすることもあり TypeScript ユーザの傲慢さには嫌気が差します
だからこそこんな標準に入れるべきだみたいな主張を公式に提案するなんて馬鹿げたことを始めるんですよね
そもそも JavaScript にしようとするからそのまま動かしたいなんて考えになるんです
せっかく型定義してるんだからこういうのを使って WebAssembly にすればコンパイルは当たり前で型があることによる高速化の恩恵も受けれるでしょう
TypeScript は TypeScript で JavaScript とは違う別物として JavaScript を汚染するようなことはやめてほしいですね
歴史的な理由での JavaScript の良くない仕様まで引き継いでスーパーセットなんて名乗らず 別の方向に進んでいってもらいたいです
hack が PHP 互換を切り捨てて独自の言語として進化していってますがそういうのになればいいんです
TypeScript の構文を JavaScript でも認識してコメントとして扱うことで無視するらしいです
TypeScript は JavaScript のスーパーセットなので型関連の部分が無視されれば JavaScript として動作するからコンパイルがいらなくなるとか
個人的にはありえないですね
TypeScript は altJS のひとつでしかないです
なぜそんなものの構文を JavaScript 側で受け入れて動作するようにする必要があるのでしょうか
以前 CoffeeScript というのが流行って Github だったかどこかの有名どころのデフォルトのフロントエンド言語として使われていたこともありますが 今では廃れました
TypeScript も今流行ってると言うだけで将来的にずっと使われるとは限りません
型をつけるという需要はずっとあり続けるといったところで 型の付け方は TypeScript の方法しかないわけでもないです
TypeScript に変わる物が出てくるかもしれませんし TypeScript 自体がメジャーアップデートで大幅な構文変更をする可能性だってあります
そのたびに JavaScript 側の構文にも影響し ブラウザが対応することになります
そんなサードパーティツールの都合で標準である JavaScript が影響受けるというのはおかしな話です
コンパイルなしでそのまま動かしたいというなら 現在の JavaScript のコメントとして書けば良いです
JavaScript としてはコメントなので無視されます
TypeScript 側が構文を変更し JavaScript のコメントとして書けるようにすればいいだけです
旧来のアノテーション風以外でも 例えば TypeScript 用の型コメントを /** **/ としたなら
const add = (a: number, b: number): number => a + b
をconst add = (a /** :number **/, b /** :number **/) /** :number **/ => a + b
と書いて TypeScript がこれを認識するようにすればいいです
ブラウザでそのまま動かしたい人はこの記法に変えればいいです
JavaScript のコメントなので JavaScript ではこれでも動きます
そもそも TypeScript が流行ってると言っても JavaScript 全体からすればごく一部です
ウェブは本来ウェブに関係ない人たちでも 情報を公開するためにウェブページを使っているので その他言語に比べて環境は特殊です
ES2015 以降の JavaScript ですら全体からすれば一部の人しか使ってないです
Chrome の統計データでどういう機能がどれくらい使われてるのか見れるページで見てみると よく使われてそうな機能でも使用率が低かったりします
https://chromestatus.com/metrics/feature/popularity
ネットで積極的に発信するような声の大きな人たちが使ってるだけで JavaScript ユーザからすると TypeScript TypeScript 言ってる人は一部でしかないです
そんなごく一部の人しか得せず 多くの人たちにとって何の恩恵もない機能をなぜ入れる必要があるんでしょうか
Promise や async 関数といった機能は機能として使えるので使わない人的にも価値はあると言えます
それに比べこの TypeScript 構文は無視されるだけなので何の価値もありません
最低限ブラウザで PHP や Python での型指定のように実行時の型チェック処理が動いてこそ検討する価値が出てくるものです
仮に実行時に型チェックするような仕組みになっても 今の TypeScript の型はやめてほしいです
事前コンパイルで消える前提なものです
JavaScript だと class はコンストラクタ関数であり 関数なので実体のあるオブジェクトです
その他言語だと class 自体は実体がなく実行時に値として扱えるようなものではない事が多いと思いますが JavaScript だと変数に入ってる値です
それと同じように type で定義したものは変数として参照でき 関数の引数や返り値に指定した型情報も取得できるべきです
たしか Python だと関数の annotation 情報として取れたはずです
本題からそれるのでこの話はこの辺にします
現時点で TypeScript の構文をサポートしてもメリットがないだけではなくデメリットだけがあります
現状の JavaScript のコメントはネストもできない単純なものですが TypeScript の型をコメントと認識するには TypeScript の構文を理解してパースしないといけないです
それだけでパフォーマンスが落ちます
わずかとはいえ メリットもないことのためにただパフォーマンスが落ちるのは許容されません
加えて意味がないけど意味がありそうな型情報が書かれているなんて混乱の元でしかありません
自分のコードしか見ない人ならともかく他人のコードも読むのであれば TypeScript まじりのコードも出てきて混乱の元です
上で例に上げたようなプリミティブ型を型名で書いているだけならシンプルなので 大したことないと思うかもしれません
ですが TypeScript で書かれたプロジェクトのコードを見ると関数定義の引数や返り値の部分だけで何行にもなる型情報が書かれていたりします
Generic とかも入ってきて難解です
JavaScript にすれば 1, 2 行程度で済むコードなのに TypeScript では 10 行近くで書かれていたりもあります
普段 TypeScript を読み書きしない人からすると読めたものじゃなく どこまでが型でどこが処理される実体(JavaScript で残る部分)なのか即時に判断できません
結局読むために JavaScript に変換した上で読んだりすることも多いです
自分でコンパイルしたくないというだけで JavaScript に不要な苦労を押し付けず altJS を使うなら各自で処理すべきです
サーバ側で静的ファイルを返す際に .js がなければ .ts から自動で変換して以降はキャッシュするとか SW でブラウザ内で変換するとかすればいいです
それにこれが通るようなら そのサードパーティでよく使われる構文も入れることになってくるでしょう
例えば React で使われる JSX などです
無視するだけで意味のない TypeScript よりは価値がありますし TypeScript 構文なんて無視するだけのものを通してこういうのは許可しないなんてするとそれこそ不満が多く出るでしょう
そうなることを防ぐためにも許可するべきではないものです
また外部に積極的に発信するような人がみんな TypeScript を好んでいるというわけでもないです
OSS のライブラリ作者などでも TypeScript 反対の人は少なからずいて issue で TypeScript 信者から TypeScript で書き直してと要望が出されてお断りしてるケースもあります
中には NO と言われているのにしつこく TypeScript を使うべきだと主張しているのを目にすることもあり TypeScript ユーザの傲慢さには嫌気が差します
だからこそこんな標準に入れるべきだみたいな主張を公式に提案するなんて馬鹿げたことを始めるんですよね
そもそも JavaScript にしようとするからそのまま動かしたいなんて考えになるんです
せっかく型定義してるんだからこういうのを使って WebAssembly にすればコンパイルは当たり前で型があることによる高速化の恩恵も受けれるでしょう
TypeScript は TypeScript で JavaScript とは違う別物として JavaScript を汚染するようなことはやめてほしいですね
歴史的な理由での JavaScript の良くない仕様まで引き継いでスーパーセットなんて名乗らず 別の方向に進んでいってもらいたいです
hack が PHP 互換を切り捨てて独自の言語として進化していってますがそういうのになればいいんです