TypeScript / Python 比較表 【随時更新】

仕事で Python も書かなきゃいけなくなったので、普段書いている TypeScript との比較表。TypeScript は JavaScript や ES6 なども含みます。随時更新します。編集リクエスト大歓迎。

[TypeScript / Swift 比較表（随時更新） - Qiita](https://qiita.com/ogaoga/items/293095b558e4bea9e6e5)

### 定数・変数

```typescript:TypeScript
let numOfPages = 0;
const pi = 3.14
```

```python:Python
num_of_pages = 0;
PI = 3.14
```

- Python には定数の概念がなく、大文字で表現する運用らしい。
- Python はスネークケースが慣例のよう。

### 基本的な型

| TypeScript | Python | Note |
| --- | --- | --- |
| `number` | `1` (int) |  |
| `number` | `123456789L` (long) | Python2の書き方。末尾に `L` をつける |
| `number` | `3.14` (float) |  |
| `bigint` | `123456789` (int) | Python3ではint型でbigintを扱える |
| `boolean` | `True` / `False` |  |
| `string` | "abc" / 'abc' / """abc""" / '''abc''' | 3連クオートは途中で改行できて改行文字が含まれる |
| `symbol` | ? |  |
| `Array` | `[1, 2, 3]` |  |
| `Object` | `{'orange': '🍊' }` | キーのクオートは省略できない |
| `null` | `None` |  |
| `undefined` | ? |  |
| `void` | ?  |  |

- Python は明確な型宣言がなく、代入した値によって型が決まる。

### 文字列補間

```typescript:TypeScript
const n = 10;
`${n} times.` // 10 times.
```

```python:Python
n = 10
f'{n} times.' # 10 times.
```

### enum （列挙型）

```typescript:TypeScript
enum Fruit {
  Orange = "🍊",
  Apple = "🍎",
  Banana = "🍌",
}
console.log(Fruit.Orange); // 🍊
```

```python:Python
from enum import Enum

class Fruit(Enum):
  Orange = "🍊"
  Apple = "🍎"
  Banana = "🍌"

print(Fruit.Orange.value) # 🍊
```

### Array（配列）

#### 範囲外のアクセス

```typescript:TypeScript
const i = 10;
const numbers = [1, 2, 3];

console.log(numbers[i]); // undefined

if numbers[i] !== undefined {
   ...
}
```

```python:Python
TBD
```

### Object / Dictionary

#### 基本

```typescript:TypeScript
let obj: { [_: string]: any } = {};
obj['abc'] = 123;
console.log(obj['abc'] || 'No value');
```

```python:Python
TBD
```

#### 存在確認

```typescript:TypeScript
const fruits = {
  apple: "🍎",
  orange: "🍊"
};
if ('apple' in fruits) {
  console.log(fruits['apple']);    
}
```

キーが存在しない場合は `undefined` を返す。

```python:Python
TBD
```

#### マージ（新しい方で上書き）

```typescript:TypeScript
const a = {
  apple: "🍎",
  orange: "🍊"
}
const b = {
  "apple": "🍏",
  "banana": "🍌"
}
const merged = Object.assign({}, a, b)
// {apple: "🍏", orange: "🍊", banana: "🍌"}
```

```python:Python
TBD
```

### struct （構造体）

```typescript:TypeScript
type Person = {
  name: string;
  age: number;
}

const person: Person = {
  name: "Taro",
  age: 20
};
```

```python:Python
TBD
```

### class （クラス）

```typescript:TypeScript
class Person {
  // メンバ変数
  word: string;
  // コンストラクタ（イニシャライザ）
  constructor(word: string) {
    this.word = word;
  }
  // メソッド
  say() {
    return this.word;
  }
}

const person = new Person("Hello!");
person.say();
```

```python:Python
TBD
```

### タイマー

```typescript:TypeScript
// 繰り返しの時は、setInterval() を使う
const timer = setTimeout(() => {
  console.log("Fired");
}, 3000);

clearTimeout(timer); // Stop the timer
```

```python:Python
TBD
```

### ToDo

* プリミティブ型
* any / void
* function / closure
* getter / setter
* キャスト
* ループ
* while / do while
* if / switch
* Array / Set
* .count, .length
* 比較演算子
* &&, ||, ??
* 三項演算子
* 分割代入
* スプレッド構文
* 可変長引数
* protocol
* interface
* extension
* typeof / instanceof / in / of
* optional
* タプル
* guard
* if let = ...
* range
* ヒアドキュメント
* 長さ（文字列、配列）
* Error
* マクロ関連
* 環境変数
* _
* subscript
* undefined
* Never
* union
* ジェネリクス
* typealias
* some / where
* weak / unowned
* lazy
* async / await
* yield
* public / private / etc...
* static
* print / console.log
* module / namespace
* コメントアウト

### Reference

- [とほほのPython入門 - とほほのWWW入門](http://www.tohoho-web.com/python/index.html)
- [TypeScript vs. Python comparison | vsChart.com](http://vschart.com/compare/typescript/vs/python-programming-language)
- [Python vs TypeScript detailed comparison as of 2020 - Slant](https://www.slant.co/versus/110/378/~python_vs_typescript)