Typecript gán giao diện hoặc kiểu cho Record <string, string>
Sau khi đọc câu hỏi này hoặc bài viết này , tôi vẫn còn một chút bối rối về sự khác biệt nhỏ giữa dấu interfacevà a type.
Trong ví dụ này, mục tiêu của tôi là gán một đối tượng đơn giản cho một Record<string, string>loại rộng hơn :
interface MyInterface {
foobar: string;
}
type MyType = {
foobar: string;
}
const exampleInterface: MyInterface = { foobar: 'hello world' };
const exampleType: MyType = { foobar: 'hello world' };
let record: Record<string, string> = {};
record = exampleType; // Compiles
record = exampleInterface; // Index signature is missing
Thử nó
Việc gán này có thể thực hiện được khi khai báo đối tượng của tôi với a type, nhưng không khả thi khi khai báo đối tượng tương tự với an interface. Nó nói rằng chữ ký chỉ mục bị thiếu, nhưng với sự hiểu biết (hạn chế) của tôi về chữ ký chỉ mục, không có chữ ký chỉ mục nào MyTypevà MyInterfacethực sự có.
Lý do tại sao dòng cuối cùng không biên dịch trong khi dòng trước đó?
Trả lời
Record<string, string>giống như { [key: string]: string }. Một tập hợp con được phép gán cho kiểu chữ ký chỉ mục này chỉ có thể thực hiện được nếu tất cả các thuộc tính của kiểu đó được biết và có thể được kiểm tra dựa trên chữ ký chỉ mục này. Trong trường hợp của bạn, mọi thứ từ exampleTypeđều có thể được chuyển nhượng cho Record<string, string>. Điều này chỉ có thể được kiểm tra đối với các kiểu chữ của đối tượng, vì kiểu chữ của đối tượng không thể thay đổi sau khi bạn khai báo chúng. Do đó, chữ ký chỉ mục được biết đến.
Nguồn: https://github.com/microsoft/TypeScript/pull/7029
Ngược lại, các giao diện không phải là cuối cùng tại thời điểm bạn khai báo chúng. Luôn có khả năng thêm thành viên mới vào cùng một giao diện do hợp nhất khai báo.