ソフトウェアエンジニアの日常の雑記

日々思ったことをまとめます

Typescriptの各種シグニチャが難しい...

Javaとかやってる人がTypescriptって比較的カンタンに学習できると思うんですが、各種シグニチャが結構難しい。

インデックスシグニチャ

配列の添字を定義できる。この場合は、数値。文字列を指定すれば文字列でもできる。

interface SampleA {
    [index: number]: boolean;
}
var a: SampleA = {};
a[1] = true;

console.log(a[1]);

===
true
===

コールシグニチャ

オブジェクト型が関数っぽく使えるみたいです。

interface SampleA{
  (word: string): string;
}

var a = SampleA = function(word: string): string{
  return "call sig:" + word;
}

console.log(objB("typescript"));


== 実行
call sig, typescript
==

メソッドシグニチャ

関数を呼び出すためのインターフェースを定義できる。

interface SampleA{
    sample(x:number):string;
    sample(x:string):string;
}

class SampleAImpl implements SampleA {
    sample(x:any): string {
        return "class: " + x;
    }
}

var a : SampleA = new SampleAImpl();
console.log(a.sample("a"));
console.log(a.sample(1));
// console.log(a.sample(true)); numberとstring以外の型がSampleAに定義されてないから使えない

=== 実行
class: a
class: 1
===

プロパティシグニチャ

プロパティ名とその型を定義するものです。これが定義されて、プロパティ名が同じで型が異なるものは作れない。

interface SampleA {
    property: string;
}
var a: SampleA = {
    property: "property sig.";
};

console.log(a.property);

=== 実行
property sig.
===

コンストラクタシグニチャ

オブジェクト型にnew演算子が使えることを定義します。 implementsできないから、この形になったのかなー。 Javaにないからちょっと使うイメージが。

interface SampleA {
    new (x:string): SampleAImpl;
}
class SampleAImpl {
    constructor(private x: string){
    }

    public echo():string {
        return this.x;
    }

}
var a: SampleA = SampleAImpl;
var b: SampleAImpl = new a("Hello,Typescript.");
console.log(b.echo());

===
Hello,Typescript.
===

まぁ実践で使い方を覚えようかと思います。