PythonとTypeScriptの比較

業務でTypeScriptを用いることとなったこと・これまでPythonで主に書いていたためその比較を作りました。

# 型づけ
| 項目           | Python                       | TypeScript                    | 説明                                                                 |
| :------------- | :--------------------------- | :---------------------------- | :------------------------------------------------------------------- |
| 型付け         | 動的型付け                   | 静的型付け                    | Pythonは実行時にTypeScriptはコンパイル時に型をチェックします。 |
| 変数の宣言     | 型宣言不要                   | `let`, `const`, `var` と型注釈 | TypeScriptでは変数を宣言する際に型を指定（または型推論）します。     |
| 定数           | 明示的な定数はない | `const`                       | TypeScriptでは `const` で宣言された変数は再代入できません。           |


コード例
Python:

```python
# 変数の宣言 (型指定なし)
name = "太郎"
age = 30

定数
PI = 3.14159
```

TypeScript:

```typescript
// 変数の宣言 (型指定あり)
let name: string = "太郎";
let age: number = 30;

// 定数の宣言
const PI: number = 3.14159;
```

# 変数宣言

| 項目             | Python                     | TypeScript                                  | 説明                                                               |
| :--------------- | :------------------------- | :------------------------------------------ | :----------------------------------------------------------------- |
| 数値型           | `int`, `float`, `complex`  | `number`                                    | TypeScriptでは整数と浮動小数点数を区別しない。                  |
| 文字列型         | `str`                      | `string`                                    |                                                                    |
| 真偽値型         | `bool`                     | `boolean`                                   |                                                                    |
| リスト/配列      | `list`                     | `Array<T>` または `T[]` (例: `number[]`)     | TypeScriptの配列は要素の型を指定できます。                        |
| タプル           | `tuple`                    | `[string, number]`                          | TypeScriptのタプルは要素の型と数を固定できます。                    |
| 辞書/オブジェクト | `dict`                     | `object`, `{ [key: string]: any }`, interface | TypeScriptのオブジェクトは構造をより厳密に定義できる。 |
| 列挙型           | `enum` (標準ライブラリ)    | `enum`                                      | 複数の名前付き定数を定義する際に便利。                          |

コード例
Python:

```python

# リスト
my_list = [1, 2, 3]

# 辞書
my_dict = {"name": "太郎", "age": 30}

# タプル
my_tuple = ("apple", 1)

# 列挙型
from enum import Enum
class Color(Enum):
    RED = 1
    GREEN = 2
    BLUE = 3
```

TypeScript:

```typescript
// 配列
let myArray: number[] = [1, 2, 3];
let anotherArray: Array&lt;string> = ["apple", "banana"];

// オブジェクト
let myObject: { name: string; age: number } = { name: "太郎", age: 30 };

// タプル
let myTuple: [string, number] = ["apple", 1];

// 列挙型
enum Color {
  Red,
  Green,
  Blue,
}
let myColor: Color = Color.Red;
```

# 文字列の埋め込み
| 項目                 | Python                   | TypeScript                | 説明                                                                 |
| :------------------- | :----------------------- | :------------------------ | :------------------------------------------------------------------- |
| 文字列の埋め込み     | `f-strings` (例: `f"...{}"`) | テンプレートリテラル (例: `` `...${}` ``) | Pythonではf文字列で`{}`内に変数とフォーマットを記述。<br>TypeScriptではバッククォートで囲み、`${}` 内に変数を記述。 |

コード例
Python:

```python
name = "花子"
greeting = f"こんにちは、{name}さん！"
print(greeting)
```

TypeScript:

```typescript
let name: string = "花子";
let greeting: string = `こんにちは、${name}さん！`;
console.log(greeting);
```



コード例
Python:

```python
class Person:
def init(self, name, age):
    self.name = name
    self.age = age

def greet(self):
    print(f"私の名前は{self.name}、年齢は{self.age}歳です。")
person = Person("一郎", 25)
person.greet()
```

TypeScript:

```typescript
class Person {
  public name: string;
  private age: number;

constructor(name: string, age: number) {
  this.name = name;
  this.age = age;
}

public greet(): void {
  console.log(私の名前は`${this.name}、年齢は${this.age}歳です。`);
}

const person = new Person("一郎", 25);
person.greet();
// person.age = 26; // エラー: privateメンバーにはアクセスできません
```