Chuyện gì đang xảy ra
Vấn đề là đó instanceof
là một cấu trúc từ JavaScript và trong JavaScript, instanceof
mong đợi một giá trị cho toán hạng bên phải. Cụ thể, trong x instanceof Foo
JavaScript sẽ thực hiện kiểm tra thời gian chạy để xem liệu có Foo.prototype
tồn tại ở bất kỳ đâu trong chuỗi nguyên mẫu của x
.
Tuy nhiên, trong TypeScript, interface
s không có bộ phát. Điều đó có nghĩa là không Foo
hoặc Foo.prototype
tồ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. Foo
chỉ 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 class
thì sao?"
Bạn có thể bị cám dỗ để chuyển từ một interface
sang 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ó x
và loại y
đó có cùng một loại, nhưng nếu bạn thử sử dụng instanceof
trê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, instanceof
sẽ 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
.