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