TypeScript は Structural Type System ではない場合がある

Legalscape のしろくまです。

TypeScript の Type System では Nominal な比較が用いられることがあります。

class Product {
  private name: string;
}
class User {
  private name: string;
}

let p = new Product();
let u = new User();

// Type 'User' is not assignable to type 'Product'.
//   Types have separate declarations of a private property 'name'.(2322)
p = u;

解説

private または protected な property が同じ名前で別々に定義されている2つのクラスの型は等価な型とみなされません。

なぜなら private や protected な property は interface として公開されません。
よって同じ property 名でも異なる意図で使用されているとみなされ Type Error となります。

採用情報

Legalscape では TypeScript を使用しています。以下に採用情報ページへのバナーがありますので TypeScript に詳しい方のエントリーをお待ちしております。