あいつの日誌β

働きながら旅しています。

TypeScript で co + generators したい

どうした?

callback 地獄は嫌いです。

それで?

とりあえず環境を用意します

% mkdir practice-ts-generatpr && cd $_
% tslint init
% npm init --yes
% npm install co --save
% dtsm init
% dtsm install node --save

create generator.ts:

/// <reference path="./typings/bundle.d.ts" />
const co = require("co");

co(function*() {
  yield Promise.resolve(true);
  console.log("world");
});
console.log("hello");

ただし、Generators も Promise も es5 では使えない

% tsc async.ts
generator.ts(4,12): error TS1220: Generators are only available when targeting ECMAScript 6 or higher.
generator.ts(5,9): error TS2304: Cannot find name 'Promise'.

どうする?

tsc の compilerOptions で target を es6 にすればいける

% tsc generator.ts --target es6 && node generator.js
hello
world

ちなみに

ts-node を使いたい場合は引数で compilerOptions を指定できないっぽいので tsconfig.json で指定します。

create tsconfig.json:

{
  "compilerOptions": {
    "target": "es6",
    "module": "commonjs"
  }
}

実行

% ts-node generator.ts
hello
world

あと co の型はないらしい。まあ必要なのは型じゃないし。

% dtsm search tj/co
No results.

それとも TypeScript でこういう事したい場合は asycn/await とかなんだろうか。 もう JavaScript の変化の渦に溺れている気がする。

そういえば

この記事に出てくるソースコードは以下の環境で試しました。

% sw_vers
ProductName:    Mac OS X
ProductVersion: 10.11.3
BuildVersion:   15D21

% node -v
v4.2.6

% npm -v
2.14.12

% tsc -v
message TS6029: Version 1.5.3

% dtsm -v
0.13.0

% ts-node --version
0.5.5