yaakaito.org

TypeScriptのコーディング規約を考える

TypeScript

こんにちは!うきょーです! TypeScript書いてますか???おすすめです!!! ところでTypeScriptのコーディング規約がよくわからなかったので、コンパイラをみてきました。 JavaScriptほどあーだーこーだというものでもないと思うので、ほんとにコーディング規約みたいな感じです。

基本的なところ

インデント

  • ソフトインデントで4個

1行の文字数

これはコンパイラの方は結構自由に感じた・・・。 ので、JavaScriptよりはJavaとか参考にした方がいいだろうってことで Oracle のを参考にすることに。

  • 1行は80文字

追記

いまどき80文字じゃなくてよくない?というツッコミがあったので考え直した。

僕は、80文字で結構いけるんじゃないかなーと思っている。なのであんまり80文字なってる理由については深追いしてない。 というのも、80文字あったら結構書けるよなーと思うので、オーバーするなら分割する基準になるんでは、というところが大きい。 ただ、シンタックス上長くなっちゃうよねーというのも、もちろんあると思う。(下の方で85文字のがある。) その都度柔軟に変えばよいというのも、その通りだけど、自分が書いていくのにある程度基準がほしいなーとは思う。

元々は80文字しか表示できないから系(表現あれだけど)の理由らしいんだけど、じゃあ今だとどうなのかなと考えてみた。 で、僕はGithubをよく使う方だと思うので(エンタープライズ含め)、そこで横スクロールしちゃうのはやだなーと思った。 というわけでGithubの100%表示で何文字入るのか数えてみた、122文字らしい。

なので個人で書く範囲では

  • 1行は120文字

ということにしようかなと思う。

改行ルールとかもこっちを参考にして、

  • コンマのあと
  • オペレーターの前
  • 改行するときは8個インデント

型の為のコロンの位置

  • 変数名にくっつけてスペースを一つ入れる
1
2
3
4
5
(name: string) => { }

var name: string = Names.at(0);

name: string = null;

関数の返り値

  • voidの時は宣言しない
1
2
3
4
5
6
7
voidFunction() {

}

stringFunction(): string {
    return "hoge";
}

命名規則

  • 変数/関数/メソッドはキャメルケール

クラスとモジュールの命名規則

  • アッパーキャメルケース
1
2
3
4
5
module Hoge {
    class HogeClass {
        // ...
    }
}

Enumの命名規則

  • アッパーキャメルケース
1
2
3
4
5
enum Fruit {
    Apple,
    Orange,
    KiwiFruit
}

定数の命名規則

  • 大文字スネークケース
1
var HOGE_FUGA = 'a';

インターフェイスの命名規則

  • 頭に I をつける
1
2
3
interface IHoge {
    // ...
}

varの型宣言

  • 基本的には宣言しない
  • anyとして返されるものに対してには宣言する
1
2
var name = 'yaakaito';
var name: string = names[0];

即時関数

よくわからなかった。JavaScriptのまんま書いてある感じもする。

1
2
3
(function(x) {
    return x * x
})(10);

TypeScript的にはこんな感じなんだろうか?

1
(x => x * x)(10)

コンストラクタでのプロパティの宣言

  • コンストラクタに渡された値をそのまま利用する場合はコンストラクタの引数で宣言する
1
2
3
4
5
6
7
class Person {
    fullName: string;

    constructor(public firstName: string, public lastName: string, private age: number) {
        this.fullName = [firstName, lastName].join(" ");
    }
}

追加

  • プロパティやメソッドがpublicである場合、publicを明記しない。
    • コンストラクタでのプロパティ宣言は明記する。

これは書いても書かなくともよくて(省略された場合は自動的にpublic)、好みだと思うんだけど、最近Scalaを書くようになって、あっちがpublicはない、というルールなので、それに合わせる事に。

1
2
3
4
5
6
7
8
9
class Person {
    fullName: string;
    private room: Room = null;
    constructor(public firstName: string, public lastName: string, private age: number) {
        this.fullName = [firstName, lastName].join(" ");
    }
    openDoor() { }
    private lookDoor() { }
}

こんな感じかなぁ

追加あれば書く。