Chuyện gì đang xảy ra
Vấn đề là đó instanceoflà một cấu trúc từ JavaScript và trong JavaScript, instanceofmong đợi một giá trị cho toán hạng bên phải. Cụ thể, trong x instanceof FooJavaScript sẽ thực hiện kiểm tra thời gian chạy để xem liệu có Foo.prototypetồn tại ở bất kỳ đâu trong chuỗi nguyên mẫu của x.
Tuy nhiên, trong TypeScript, interfaces không có bộ phát. Điều đó có nghĩa là không Foohoặc Foo.prototypetồn tại trong thời gian chạy, vì vậy mã này chắc chắn sẽ bị lỗi.
TypeScript đang cố gắng cho bạn biết điều này không bao giờ có thể hoạt động. Foochỉ là một loại, nó không phải là một giá trị nào cả!
"Tôi có thể làm gì thay vì instanceof?"
Bạn có thể xem xét các bảo vệ kiểu và bảo vệ kiểu do người dùng xác định .
"Nhưng nếu tôi vừa chuyển từ an interface sang a classthì sao?"
Bạn có thể bị cám dỗ để chuyển từ một interfacesang a class, nhưng bạn nên nhận ra rằng trong hệ thống kiểu cấu trúc của TypeScript (nơi mọi thứ chủ yếu dựa trên hình dạng ), bạn có thể tạo ra bất kỳ đối tượng nào có hình dạng giống như một lớp nhất định:
class C {
a: number = 10;
b: boolean = true;
c: string = "hello";
}
let x = new C()
let y = {
a: 10, b: true, c: "hello",
}
x = y;
y = x;
Trong trường hợp này, bạn có xvà loại yđó có cùng một loại, nhưng nếu bạn thử sử dụng instanceoftrên một trong hai, bạn sẽ nhận được kết quả ngược lại với loại còn lại. Vì vậy, instanceofsẽ không thực sự cho bạn biết nhiều về kiểu nếu bạn đang tận dụng các kiểu cấu trúc trong TypeScript.
Foo | string.