LoginSignup
12
12

More than 5 years have passed since last update.

TypeScriptの自分用メモ

Last updated at Posted at 2013-04-18

関数

関数オーバーロードのシグネチャは関数宣言の直前に記述する。

function add(a: number, b: number): number;
function add(a: string, b: string): string;
function add(a, b) {
    return a + b;
}

console.log(add(1, 2));
console.log(add("foo", "bar"));

// invalid
//console.log(add(1, "hoge"));

0.9から導入された定数値によるオーバーロード

ローカル変数、型、メンバーはそれぞれ別々の名前空間を持つ。

ただし0.9ではコンパイルエラーになる。
```typescript
// valid
interface I {}
export var I = 1;
var I: I = {};

console.log(I); // => 1
```

型が宣言できる文はclass, interface, module, enum, importの5つ。

class C {
    attr = "class";
}
// valid
var c: C;
var _C = C;

// invalid
//var C: C;

interface I {
    attr: string;
}
// valid
var i: I;
var I: I;

module M {
    var attr = "module";
}
// valid
var m: M;
var _M = M;

// invalid
//var M: M;

型宣言ができる文はモジュール直下のみで記述できる。

// invalid
if(true) {
    //class C {}
    //interface I {}
    //module M {}
}

class D {
    //class C {}
    //interface I {}
    //module M {}
}

型名にはJavaScriptの予約語に加え、any, number, string, booleanが使えない。

// invalid
//class any {}
//interface boolean {}
//module string {}

クラス型のインターフェスの記述例

interface I {
    new ();
}

class C {}

// valid
var i: I = C;

演算子はNumber型とnumber型、String型とstring型などを区別する。

// valid
function add_num(a: number, b: number) => a + b
function add_str(a: string, b: string) => a + b

// invalid
//function add_num(a: Number, b: Number) => a + b
//function add_str(a: String, b: String) => a + b

インターフェース

interfaceとmoduleは、同じモジュール内からはRubyのオープンクラスのように拡張することができる。

interface A {
    str: string;
}

interface A {
    num: number;
}

// valid
var a: A = { str: "a" , num: 1};

// invalid
//var a: A = { str: "a" };
//var a: A = { num: 1 };

モジュール

export文はモジュール直下でのみ記述できる。

module M {
    // valid
    export var a = 1;

    if(true) {
        // invalid
        //export var b = 1;
    }
}

モジュールの種類は3つある。

  • グローバルモジュール
  • ファイル単位のモジュール(External module)
  • モジュール文によるモジュール(Internal module)

lib.d.tsで定義されるインターフェースは、グローバルモジュールで定義される。

ソースファイル直下にexport文とimport文がない場合、そのスクリプトはグローバルモジュール上で実行される。

foo.ts
// <Global module>
// ┣ "lib.d.ts"
// ┣ interface Object
// ┣ interface Array
// ┣      :
// ┣ "foo.ts"
// ┗ interface Object { foo: string; }

// ビルトイン型のObject型と同じモジュール空間内なので、このinterface文はビルトインObject型を拡張する。
interface Object {
    foo: string;
}

var obj = {};
obj.foo = "foo";

ソースファイル直下にexport文やimport文がある場合、そのスクリプトはグローバルモジュール内に作られる、ファイル単位のモジュールでラップされた形で実行される。

foo.ts
// <Global module>
//  ┣ "lib.d.ts"
//  ┣ interface Object
//  ┣ interface Array
//  ┣      :
//  ┗ <"foo.ts" module>
//      ┣ export var a = 1;
//      ┗ interface Object { foo: string; }

export var a = 1;

// ここからはビルトイン型のObject型が見えないので、新しくfoo.Objectインターフェースが宣言される。
interface Object {
    foo: string;
}
// valid
var obj: Object = { foo: "foo" };

// invalid
//var obj2 = {};
//obj2.foo = "foo";    // ビルトイン型のObjectにはfooプロパティが宣言されていないのでエラーになる。
12
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
12