技術向上

プログラミングの学び、気になるテクノロジーやビジネストレンドを発信

構造的部分型【TypeScript】

ダックタイピングのようなものです。構造が一致するならば、異なる型であっても同じようなものとして扱うことができます。

class Options {
    sync: boolean;
    constructor(){
        this.sync = true;
    }
}

class Options2 {
    constructor(public sync?: boolean, name?: string) {     // プロパティ宣言でも可能
    }
}

function doProcess(options: Options): void {
    ...
}

var opts = new Options();
var opts2 = new Options2();
opts.sync = true;

doProcess(opts);
doProcess({
    sync: true
});    // 構造が同じなので、Options型でなくても引数に指定できる
doProcess(opts2);    // 構造が同じ(sync: booleanが定義されている)なので、Options型でなくても引数に指定できる


Options2型の場合、syncの他にname: stringも定義されていますが、問題ありません。
ただし、オブジェクトリテラルの場合、関数の引数に指定された型と完全に一致する必要があります。プロパティは事前に定義されている必要があるからです。

doProcess({
    sync: true,
    name: "ss"    // nameプロパティは事前に定義されていないため、エラーになる
});


TypeScript早わかりチートシート【1.5.3対応】 - Build Insider