🤮

TypeScript以外が嫌いです

に公開16

TypeScript以外が嫌いです

こんにちは、TypeScript原理主義者のTakoです。今日は私がなぜTypeScript以外の言語が心の底から嫌いなのかをお話しします。

はじめに

みなさん、世の中にはプログラミング言語がたくさんありますよね。Java、Python、JavaScript、Ruby、Go...。でも、私にとってそれらは全て「TypeScriptではない言語」というカテゴリに分類されます。つまり、使う価値のない言語です。

型がないなんて、人生がないようなもの

JavaScript?あんなの型がなくて何が楽しいんですか?undefined is not a functionとかcannot read property of nullとかいうエラーと戯れるのが好きですか?私は嫌いです。

// TypeScriptの美しさ
interface User {
  id: number;
  name: string;
  age: number;
  email: string;
}

function greet(user: User): string {
  return `こんにちは、${user.name}さん!あなたは${user.age}歳ですね。`;
}

// JavaScriptの混沌
// function greet(user) {
//   return `こんにちは、${user.name}さん!あなたは${user.age}歳ですね。`;
//   // user って何? nameある? age文字列じゃない?
//   // さあ、本番環境で爆発するのを待ちましょう!
// }

Pythonは読みにくい

Pythonなんて、インデントでブロックを表現するなんて正気の沙汰ではありません。カッコがないと、私の目は迷子になります。そして型アノテーションと言いながら結局オプショナルなんですよね?そんな中途半端な態度が許せません。

# これのどこが美しいんですか?
def calculate_something(x, y):
    if x > 0:
        result = x + y
        for i in range(10):
            result += i
    else:
        result = y - x
    return result

# TypeScriptなら明確!
# function calculateSomething(x: number, y: number): number {
#   if (x > 0) {
#     let result = x + y;
#     for (let i = 0; i < 10; i++) {
#       result += i;
#     }
#     return result;
#   } else {
#     return y - x;
#   }
# }

Javaは冗長すぎる

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

これを書くくらいなら、こっちのほうがマシです:

console.log("Hello, World!");

シンプルで美しいですよね?なぜJavaは簡単なことを難しくするのでしょうか?

Goは...まあ悪くないかも?でも!

Goは静的型付け言語で、シンプルな構文を持っていて、コンパイルも速い。一見TypeScriptに近い...?

いいえ、違います!Genericsの実装が遅すぎました。エラーハンドリングもif err != nilの嵐。TypeScriptのtry-catchのエレガントさには敵いません。

// Goのエラーハンドリング
file, err := os.Open("file.txt")
if err != nil {
    return err
}
defer file.Close()

data, err := ioutil.ReadAll(file)
if err != nil {
    return err
}

// TypeScriptのエラーハンドリング
// try {
//   const data = await fs.readFile('file.txt', 'utf8');
//   // 処理を続行...
// } catch (error) {
//   console.error('ファイル読み込みエラー:', error);
// }

RustはTypeScriptのライバル...ではない

所有権モデル?ライフタイム?借用チェッカー?なんだか難しそうですね。私の脳のCPU使用率が100%になりそうです。

TypeScriptならnull安全性と型の恩恵を受けながら、JavaScriptのシンプルなメモリモデルで快適にプログラミングできます。

PHPは論外

<?php
$array = array("foo", "bar", "hello", "world");
foreach ($array as $value) {
    echo $value . "<br>";
}
?>

このコードを見るだけで目が痛くなります。<?phpタグってなんですか?HTMLの中にプログラミングを埋め込むという発想がそもそも間違っています。

TypeScriptとReactを使えば、こんなにエレガントです:

const array = ["foo", "bar", "hello", "world"];

function App() {
  return (
    <div>
      {array.map((value, index) => (
        <p key={index}>{value}</p>
      ))}
    </div>
  );
}

TypeScriptが最高である理由

他の言語が劣っている理由を十分説明しましたが、ここでTypeScriptがなぜ神なのかをお伝えします。

どこでも動く!

C++?コンパイルして実行ファイルを作って...面倒ですね。Ruby?適切なバージョンをインストールして...。

TypeScriptはコンパイルするとJavaScriptになり、ブラウザで動きます。スマホでも!タブレットでも!冷蔵庫でも!(IoT対応の場合)。世界中の98%のデバイスでTypeScriptの成果物が動くんです!これって素晴らしくないですか?

何でも作れる

ウェブアプリ?React + TypeScript。
モバイルアプリ?React Native + TypeScript。
デスクトップアプリ?Electron + TypeScript。
サーバー?Node.js + TypeScript。
CLIツール?Node.js + TypeScript。

もはや「TypeScriptで作れないものはない」と言っても過言ではありません。他の言語を学ぶ必要なんてありません。TypeScriptだけで宇宙征服も可能です(たぶん)。

VSCodeとの完璧な相性

MicrosoftがTypeScriptを作り、MicrosoftがVSCodeを作りました。この完璧な組み合わせ。入力補完、型チェック、リファクタリング...すべてが完璧に機能します。Vimで開発している友人を見ると、心の中で「かわいそうに...」と思ってしまいます。

コミュニティが巨大

「このライブラリTypeScriptに対応してないかな...」
と思ったことはありますか?私はありません。なぜならほぼすべての人気ライブラリがTypeScript対応だからです!

世界中の優秀なエンジニアがTypeScriptを選んでいます。彼らが間違っているはずがありません。間違っているのはあなたの言語選択かもしれません。

結論

TypeScript以外を利用してる人へ!

もう型なしの混沌とした世界で生きるのは終わりにしましょう。TypeScriptの光輝く型の世界へようこそ!あなたのコードはもっと安全に、もっと読みやすく、もっとメンテナンスしやすくなります。

今すぐ改宗すればTypeScript神は寛大なので許してくれます!未来のあなたは必ず感謝するでしょう。「あの日TypeScriptに改宗して本当に良かった...」と。

どんなプロジェクトも、どんなプラットフォームも、TypeScriptで征服できます。それが最高のプログラミング体験です。

あなたも今日から、TypeScript教の一員になりませんか?

(注:この記事は冗談です...でも本当にTypeScriptは素晴らしいですよ!)

Discussion

submaxsubmax

概ね同意だけど try-catch は嫌い。
どこでも error が throw される可能性があって、 catch 出来なきゃ死ぬし error は unknown だし。
(まだ Go の error を値で返すスタイルのほうがマシ)

Result<T, E> 型のある関数型言語も触ってみてほしいけど...
TS原理主義ならエラーの取り扱いは Effect をご検討下さい。 (布教)

たこたこ

ts教がEffect派とtry catch派に分かれそう

LukeLuke

TypeScriptの型は型の顔した辞書型

LukeLuke

関数に引数を渡す時等に、引数に指定されている型を使わずとも、その型が持つメンバ変数さえ持っていれば通ってしまうということですね。

AhoxaAhoxa

Xからきました。
俺はこういう記事めっちゃ好きです。
ネタをネタと分からない人で炎上しないといいな

Azunyan1111Azunyan1111

型無し言語はカスだし、TSが全てを制する未来も超分かる。
でも低レベルな処理は出来ないのでは?

Otogawa Katsutoshi(oto)Otogawa Katsutoshi(oto)

pythonは読みにくい
Javaは冗長
Goは悪くは無い
と暗に言及している所以外はそこまで悪くは無いという言い方してるのに、

いきなり「論外」とボディブローされるPHPに涙を禁じ得ないw

あいや - aiya000あいや - aiya000

型がないなんて、人生がないようなもの

わかります!
Haskellを使おう

Pythonは読みにくい

めっちゃわかる〜!!
HaskellはPythonの意味論を全て解決します

Javaは冗長すぎる

Haskellはmainだけですみます!
ghciなmainもいらない!

Goは...まあ悪くないかも?でも!

Goは型の表現力が足りないですよね⋯
(それはTypeScriptも同じだけど⋯)
HaskellはHKTや依存型(の部分実装)・その他もろもろがあるので、最高です!!

RustはTypeScriptのライバル...ではない

わかる
Haskellなら型チェックを通すことに注力すればいいので、楽!

PHPは論外

やはりHaskell