Open11

TypeScript入門

TkmyztTkmyzt

package-lock.json
→現在インストールされているパッケージの情報を記述したファイル

TkmyztTkmyzt

tsconfig.jsonはTypeScriptコンパイラに対する設定情報を記述したファイル。

TkmyztTkmyzt

compilerOptionsのtarget: "es2020"の意味、es2020にするとes2021以降の記法はes2020以下の記法に変換される

TkmyztTkmyzt

es2020までの記法はそのまま出力される

TkmyztTkmyzt

npx tscを実行する。そうするとtsconfig.jsonを参照しコンパイルされる。
npx ***はまずローカルのnode_modules/.bin/を見る。
あればそれを実行しなければリモートからインストールして実行し破棄する

TkmyztTkmyzt

2章 基本的な文法・基本的な型

文は式を部品として内包するイメージ。
=の右側に置けるか?で判断するのもありか。おけたら式。

プログラムは基本構成として、AとBによって構成されている。

式と文

=の右における、どちらのがでかい単位か?

= の右におけるものが式、でかい単位は文で文が式を包含する。

関数呼び出しは式か?分か?

関数呼び出しは一般的に返り値という結果を伴うため、式になる。式は値を返す。
const greeting = "hello";
const ye = "yeah";
greeting + ye の部分は返り値があるので式ということになる

では console.log(greeting + ye); はどうなるか?

式文に該当する。最後が、; セミコロンで終わり、返り値はない。console.logしているがただ出力しているだけで返り値はない。そう言ったものを式文というらしい。確かに返り値あるならconst a = greet();みたいな感じにするよな。greet();だけだったら式文ってことで、const a = greet();にするなら文やな。

比較の演算子
基本的には===, !==を使用する。==と!=は使うべきではないらしい。

!=, ==
!=と==は

両方とも、暗黙的に型変換をするのでstringのconst str = ”3”を使用して
console.log(str == 3);はtrueを返す。

TkmyztTkmyzt
&&||の意味合い、よく忘れる
// 下記みたいに使って、デフォルト値の設定に使うことが多いかも。左がtruthyなら左を使い、左がfalsyなら右を使う。
const minInstances = options.minInstances || 10;

// 条件付き実行系のイメージ, よくReactとかで使うね
onComplete && onComplete(result);

// isProduction && ****
// 本番環境のみ、v2の従業員一覧コンポーネントを使用する的なノリ
isProduction && <EmployeeV2 />

TkmyztTkmyzt

3章オブジェクトの基本とオブジェクトの型

type Human = {
    name: string,
    age: number,
}

interface Human {
    name:  string;
    age: number;
}

TypeScriptは上記のようにtype, interfaceのどちらも型定義に使える。しかしtypeの方ができることが多いのでtypeだけを使っておけば割と問題ないという説もある?まぁ結局は現場の思想に合わせるという事が多そうな気がしている。差分的な話で言うとプリミティブ型の型定義やユニオン型などはinterfaceでは定義できない。

// interfaceでは定義できない
type UserId = string;
type Humanoid = Human & {
    job: string;
}
TkmyztTkmyzt
  • インデックスシグネチャ
type ItemType = {
  quantity: number,
  price: number,
  ....,
}
type ItemDictionary {
    [key: string]:  ItemType
}

インデックスシグネチャっていう型の表現があって、keyがstringでvalueがItemTypeであるペアを幾つでも持ちうるっていう意味である。
例えば、keyにproductIdをとり、valueとしてそのproductに関するデータを持つものとすると、大量のproductをオブジェクトとして表現できる。下記のようなイメージ。配列に格納するより検索性が高い。

const item = {
    "product-001": {
        "price": 300,
        "quantity": 2
    },
    "product-009": {}
}

的なノリで表現できる。
item["product-001"]で取り出せる。配列だったら全部見ないといけない可能性もあるね

TkmyztTkmyzt

でも欠点もあって、この型を定義すると困るのが次パターン。

type hoge = { [key: string]: number };
const obj: hoge = { foo: 999}

console.log(obj.name); ってやると、undefinedが返ってきちゃう。
本来ないはず、どれもkeyがstringでvalueはnumber型のはず・・・

const fuga: { name: string} = { name: "Kenji" };
console.log(fuga.abc)

これはconsole.logのところでコンパイルエラーになるがインデックスシグネチャだとアクセスできちゃーう罠。インデックスシグネチャの方はこのオブジェクトはkeyがstringで値がnumberのものがいくらでも取れるよね〜だから今後入りうるからエラーにしちゃあかんよね、ってコンパイラを騙してる感じ?