ディレクトリがなければ作成するNode.jsのコード

ディレクトリがなければ、作成する。
あれば何もしない。

index.ts

import * as fs from "fs";

if (!fs.existsSync(path)) {
    fs.mkdirSync(path);
}

console.log()を使うとTSLintが警告を出すとき

初期状態では、console.log()を使うとTSLintが警告を出します。

警告を無効にしたい場合は、tsconfig.jsonに”no-console”の設定を追加します。

{
    "extends": "tslint:recommended",
    "rules": {
        "no-console": [
            false
        ]
    }
}

TypeScriptでSet

Setは値が重複しないコレクションです。
同じ値は一つしか登録されません。

前準備

TypeScriptをインストールします。

npm install -g typescript
npm install -g typings

プロジェクトの初期設定を行います。

npm init
tsc --init
npm install tslint --save-dev
tslint --init

定義ファイルのインストール

npm install --save-dev @types/core-js

使用例

// オブジェクトを生成します
let set = new Set<string>(["node.js", "TypeScript"]);
// 値を追加します
set.add("JavaScript");
// 登録されている値の数
console.log(set.size); // => 3
// 値の有無
console.log(set.has("TypeScript")); // => true
// 値を削除する
set.delete("TypeScript");
// 値の有無
console.log(set.has("TypeScript")); // => false
// 値を順番に出力する
set.forEach((value) => console.log(value)); // => "node.js" "TypeScript"

Setオブジェクトを作成する

let set = new Set<string>();

引数で初期値を登録できます。

let set = new Set<string>(["node.js", "TypeScript"]);

値を追加する

addメソッドで値を登録します。

set.add("JavaScript");
set.add("Python");
set.add("C++");

値を削除する

deleteメソッドで値を削除します。

set.delete("Python");

値をクリアする

clearメソッドですべての値を削除します。

set.clear();

値に対して関数を実行する

forEachメソッドで値に対して関数を実行します。

set.forEach(value => console.log(value));

値の有無を調べる

let exist = set.has("TypeScript");

Iteratorを取得する

keysメソッドとvaluesメソッドは、どちらも値を登録した順番を保持するIteratorオブジェクトを返します。

console.log(set.keys());
//=> SetIterator { 'node.js', 'TypeScript', 'JavaScript' }

iterable

Setはiterableです。

Array.from()はiterableを受け取り、Arrayオブジェクトを生成します。

let ary = Array.from(set);

TypeScriptでAsync/Await

TypeScriptでAsync/Awaitを使ってみる。

動作環境

> tsc --version
Version 2.2.1

やりたいこと

サンプルとして、非同期で実行する3つの処理がある。
func1()、func2()、func3()とする。

func1()は”1秒後”に”1″を出力する。
func2()は”2秒後”に”2″を出力する。
func3()は”3秒後”に”3″を出力する。

function func1() {
    setTimeout(() => {
        console.log(1);
    }, 1000);
}

function func2() {
    setTimeout(() => {
        console.log(2);
    }, 2000);
}

function func3() {
    setTimeout(() => {
        console.log(3);
    }, 3000);
}

これを、321の順番に出力したい。

そのまま実行する

function func1() {
    setTimeout(() => {
        console.log(1);
    }, 1000);
}

function func2() {
    setTimeout(() => {
        console.log(2);
    }, 2000);
}

function func3() {
    setTimeout(() => {
        console.log(3);
    }, 3000);
}

function main() {
    func3();
    func2();
    func1();
}

main();

実行結果

1
2
3

関数は、func3()・func2()・func1()の順番に実行しても、出力は”123″の順番になる。

Promiseを使う

Promiseを使って書き直す。

func1()・func2()・func3()はPromiseを返すように変更する。

function func1(): Promise<any> {
    return new Promise<any>(resolve => {
        setTimeout(() => {
            console.log(1);
            resolve();
        }, 1000);
    });
}
function func2(): Promise<any> {
    return new Promise<any>(resolve => {
        setTimeout(() => {
            console.log(2);
            resolve();
        }, 2000);
    });
}
function func3(): Promise<any> {
    return new Promise<any>(resolve => {
        setTimeout(() => {
            console.log(3);
            resolve();
        }, 3000);
    });
}

Promiseのthen()を使って、順番に実行する。

function main() {
    func3().then(resolve => {
        return func2();
    })
    .then(resoluve => {
        return func1();
    });
}

main();

実行結果

3
2
1

期待する結果が得られた。

Async Awaitを使う

main()関数を修正する。

async function main() {
    await func3();
    await func2();
    await func1();
}

実行結果

3
2
1

期待する結果が得られた。

Promiseのthen()を使っていたコードよりも簡潔にコードを記述できた。

awaitをつけると、Promiseが終了するまで次の処理が始まらない。
awaitは、asyncがついた関数の中でなければ利用できない。

戻り値を受け取る

awaitを使うとき、戻り値を受け取ることができる。

次のコードでは、func1()が返すPromiseの戻り値を受け取り、出力する。

function func1(): Promise<string> {
    return new Promise<string>(resolve => {
        setTimeout(() => {
            console.log(1);
            resolve("OK");
        }, 1000);
    });
}

async function main() {
    const ret = await func1();
    console.log(ret);
}

main();