TypeScriptのES6 Moduleでexport varしたものに書き込む

TypeScriptで、次のようにしたい時があります。

export var field1 = "foo";
import {field1} from "./export";
// エラーになる
field1 = "bar";

しかし、エラーになります。

Invalid left-hand side of assignment expression.

方法1:namespace で囲む

これは、変数を namespace(旧 module )で
囲ってあげることで解決できます。

export namespace fields {
  export var field1 = "foo";
}
import {fields} from "./export";
fields.field1 = "bar";

前は、namespace を、module と定義していましたが、
ES6 module と混同してしまうので、
これからは、namespace を使います。

方法2:setter となる関数を使う

var field1 = "foo";
export function setField1(text:string) {
  field1 = text;
}
import {setField1} from "./export";
setField1("bar");

まとめ

仕様がムズカシイ。
どうやら export default var とかもエラーになるから、
直接フィールドを export するのは良くないのかもしれないです。

Webpackで、CSS、Lessをロードする

こんにちはー!

Webpack、知っていますか。
require() などでできた、ファイルの依存関係を、簡単にしてくれます!
Browserify に似ていますが、Webpack はスタイルシート、JSON、画像なども一緒にできます!

CSSを読む

というわけで、スタイルシートをロードしましょう!
うまくいかない場合は、このリポジトリを見てください。

shundroid/webpack-stylesheet-example
Contribute to webpack-stylesheet-example development by creating an account on GitHub.

まず、フォルダー内で、次のコマンドを打ってください。

npm i --save-dev webpack

次に、css を読む、loaderを追加します。
その時、css-loader のほかに、style-loader を入れます!ここでハマった・・

npm i --save-dev style-loader css-loader

ファイルの構成は、次のようになります。

  • main.js
  • style.css
  • webpack.config.js
  • index.html

main.jsは、次のように書いてください。

require("./style.css"); // cssを読み込む

// alertとかをしておくと、読み込まれているかがわかりやすい
// alert("hello");

style.css

body {
  background-color: skyblue;
}

webpack.config.js

module.exports = {
  entry: './main.js',
  output: {
    filename: 'bundle.js'
  },
  module: {
    loaders: [
      { test: /\.css$/, loader: 'style!css' }
    ]
  }
};

index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <script type="text/javascript" src="bundle.js"></script>
</head>
<body>
</body>
</html>

この状態で、Webpackを実行!

$ webpack
Hash: XXX
Version: webpack 2.0.6-beta
Time: 1009ms
    Asset   Size  Chunks             Chunk Names
bundle.js  12 kB       0  [emitted]  main
    + 6 hidden modules

bundle.jsが生成されます。

index.htmlを開くと、水色のページが表示されます。

Lessを読む

less-loaderを使用します。less もいります。

npm i --save-dev less-loader less

先ほどの style.css を、style.less に変更してください。

style.less

@color: orange;
body {
  background-color: @color;
}

Lessが動いているか確かめるので、変数を使いました。

main.jsを編集します。

// require("./style.css"); となっていたところを
require("./style.less"); // にする。

webpack.config.js も編集します。

// { test: /\.css$/, loader: 'style!css' } となっていたところを、
{ test: /\.less$/, loader: 'style!css!less' } // にする。

webpack を実行!

webpack

index.html を開くと、ページがオレンジ色になります。

まとめ

  • css-loader、less-loader を使うと、スタイルをスクリプトに変換して、js、typescipt などと合体できる!
  • css-loader を入れるときは、style-loader も入れる。
  • less-loader を入れるときは、style-loader、less も入れる。

TypeScriptのIDEをNetBeansにした

こんにちはー。
TypeScript、使っていますか?

今まで、Visual Studio Code を、
エディタとして使っていましたが、
作っていたアプリが大きくなってきたので、
NetBeansを使うことにしました!

TypeScript Editorプラグインを入れる

デフォルトでは TypeScript は使えないので、
プラグインを入れましょう!

https://github.com/Everlaw/nbts/releasesから、
「XXX.nbm」の最新版をダウンロードしましょう。

メニューバーの、ツールからプラグインを開きます。
Netbeans-tsplugin-install

  1. ダウンロード済み タブを開く
  2. プラグインの追加で、ダウンロードしたファイルを選択
  3. インストールし、IDEを再起動

補完を使いやすく

初期設定では、「 . 」を入力するまで、補完されません。
この設定を変えたいと思います。

  • ツールから設定を開く。

Netbeans-ts-setting

  1. エディタを選択
  2. コード補完タブへ
  3. 言語をJavaScriptにする
  4. 可能性のあるすべての状況に変更
  5. OKをクリック

便利な機能

宣言へ移動

これは、VSCodeでもあります。
宣言(定義されている場所)へ移動したい変数、プロパティなどにカーソルを置き、
Ctrl+B!!
もしくは、右クリックからナビゲート、宣言へ移動。
ファイルをまたがってもできます。

Ctrl+マウスポインタ

VSCodeでもあります。
変数名、型を取得できます。

使用状況を検索

これが一番やりたかった!
Visual Studio とかだと、開いてるファイル内でしかできないけど、
NetBeansはプロジェクト内でできる!!
変数にカーソルを置き、Alt+F7もしくは、右クリックから使用状況を検索。

netbeans-ts-usages

わーお!

2016/01/30 追記:
VSCodeでも、同じような機能がありました!

【感動】VSCodeのTypeScriptで、「Find Usages」相当の機能が使えた!
ここで書いたように、VSCodeでは、TypeScriptで「Find Usages」という、WebStormとかで、変数、関数などがどこで使用できるかをプロジェクト内で検索し、表示してくれる...

最後に

こんな感じに、大きなコードとかも楽に扱える便利な機能もあるので、
ぜひ使ってみてください!

GulpでTaskに引数を使う

Gulpで、タスクをより便利にしたいとき、引数が使いたくなります。
こんな感じです。

gulp build --dev

これは、npmのモジュール、「minimist」を使うとできます。

npm i minimist
var minimist = require("minimist");
gulp.task("build", function() {
  var env = minimist(process.argv.slice(2));
  if (env.dev) {
    // --devが入っているとき
  } else {
    // 通常時
  }
});

–と-の違い

次のようなコマンドにしてみます

gulp build -dev

--dev ではなくて、 -dev を使ってみました。

こうするとどうでしょう。 env 変数の中を見てみます。

d、e、v オプションに分かれている
d、e、v オプションに分かれている

d、e、vに分かれています。つまり、

gulp build -d -e -v

とやったのと同じになるらしいです(今知った)!

ちなみに --dev でやると・・

devオプションになっています!!

参考

JavaScript - gulp.jsのコマンドライン引数で、環境別にminify条件を切り替える - Qiita
フロントエンド開発効率化のため、この度初めてタスクランナーを使ってみました。最近はGruntよりgulpの方が盛り上がってるようなのでgulpを選択。javascriptの開発をし...

Visual Studio Code で便利なショートカット!

こんばんは。

Visual Studio Code 使ってますかー!!

GitとTypeScriptの補完をプラグインなしでやってくれて便利です!

さて、今回はよく使っているショートカットキーと

デフォルトにないけどよく使うショートカットキーを紹介します!

(ぼくはWindowsなのでCtrlになりますがMacだとCommandキーなのかな?)

デフォルトにあるショートカットキー

Ctrl + Shift + P

コマンドパレットを開きます。超便利です。

Ctrl + Tab (エディタで)

workbench.action.quickOpenNavigateNext らしいです。

VSCodeにはタブはありませんが、作業中のファイルを切り替えてくれます。

Ctrl + Shift + Tab (エディタで)

Ctrl + Tabの逆バージョン

Ctrl + Shift + F (どこでも)

フォルダーを開いているとき、すべてのファイルから検索ができます!!

デフォルトにないから追加するショートカットキー

設定の方法

Ctrl + Shift + P でコマンドパレットを開き、Preferences: Open Keyboard Settings
keybindings.jsonに、次のような形式でキーバインドを書きます。

{
  "key": "バインドするキー(例: ctrl+alt+o)",
  "command": "コマンド 左側のファイルの下の方にずらっと。"
}

Open Recent Folder

コマンドは workbench.action.openRecent です。過去に開いたフォルダーを表示してくれます。

ぼくは Ctrl + Alt + O にバインドしています。

KeyBindを設定する

workbench.action.openGlobalKeybindings です。KeyBindを設定してくれる画面になります。

最後に

VSCodeは、こんな感じで自分風にアレンジがすぐにできるので、ぜひ使ってみてください!!

TypeScriptで、関数を型にする

Typescriptの型として、
「number」「string」「boolean」などとありますが、
実は、関数も型にできます!

var function1:(arg1:number, arg2:string)=>boolean;

こんな感じ。

(引数名:型, 引数名:型 .....)=>戻り値

戻り値がないときは、voidを指定できます。

どんなときにつかうの?

コールバック引数を使いたい

function progressA(callback: (msg:string)=>void) {
  callback("hoge");
}

progressA((msg) => {
  console.log(msg);
});

関数を配列とする

var fnArray:Array<(msg:string)=>void> = [];
fnArray.push((msg) => {
  alert(msg);
});
fnArray.push((msg) => {
  console.log(msg);
});
fnArray.forEach(i => {
  // 関数だから呼び出せる
  i("Hello, TypeScript!");
});

AddEventListenerの引数にも!

lib.d.tsを見てみると、

addEventListener(type: "click", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;

引数listenerの型にも使われています!

TypeScript楽しい!奥深い!

Javascriptでアニメーションを簡単に使える「move.js」を使ってみる

簡単な記法で、アニメーションをすることができます。

中では、transition-delayとかを使っているようです。

インストール

bower i move.js
  • i と書くと、installを略すことができます。

普通にやると怒られる!

中でonload時にdocument.bodyを呼び出しているので、

普通にscriptタグで読み込んでもエラーが出てしまいます。

次のように読み込みましょう!

アニメーションしよう!

まず構文。

move("クエリ")/*..... アニメーション処理 */.end();

move()からend()の間に処理を書くわけです。
処理は、公式サイトにたくさん書いてあります。
ここでは一部を紹介します。

cssプロパティを指定する

.set("CSSプロパティ名", 値)

例:

move("div.box")
  .set("opacity", 0)
  .end();

アニメーションの時間を指定する

.duration("秒数")

例:

move("div.box")
  .set("opacity", 0)
  .duration("1s");
  .end();

移動する

.translate(x, y)

例:

move("div.box")
  .translate(100, 80)
  .duration("0.5s")
  .end();

アニメーションが終わった後に実行する

.then()/* 処理 */.pop()

例:

move("div.box")
  .translate(100, 80)
  .then()
  .set("opacity", 0)
  .pop()
  .end();

例では、移動をしてから、opacityを0に指定します。

便利なので、使ってみてください!