Structural typing là gì?

Noun Programming

Cách tốt nhất để hiểu structural typing là so sánh nó với những gì không phải là structural typing. Hầu hết các typed language mà bạn có thể đã sử dụng là nominally typed. Hãy xem xét mã C# này (Java hoặc C++ sẽ trông giống nhau):


class Foo {
  public int x;
}
class Blah {
  public int x;
}

Mặc dù Foo và Blah có cấu trúc giống hệt nhau, nhưng chúng không thể được gán (assign) cho nhau. Đoạn mã sau:


Blah b = new Foo();

… tạo ra lỗi này:

Cannot implicitly convert type 'Foo' to 'Blah'

Cấu trúc của các lớp này là không liên quan. Một biến kiểu (type) Foo chỉ có thể được gán cho các thể hiện (instance) của lớp Foo (hoặc các lớp con (subclass) của chúng).

TypeScript hoạt động theo cách ngược lại. TypeScript coi các kiểu là tương thích (compatible) nếu chúng có cùng cấu trúc, do đó có tên structural typing.

Vì vậy đoạn code sau chạy mà không có lỗi:


class Foo {
  x: number = 0;
}
class Blah {
  x: number = 0;
}
let f: Foo = new Blah();
let b: Blah = new Foo();

Learning English Everyday