関数
関数オーバーロードのシグネチャは関数宣言の直前に記述する。
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プロパティが宣言されていないのでエラーになる。