typescript - "Kiểu tham số của chữ ký chỉ mục không thể là kiểu hợp (union type)." - tôi nên dùng gì thay thế?
Khi tôi cố gắng biên dịch mã Typescript này
interface Foo {
[foo: "hello" | "world"]: string;
}
Tôi nhận được thông báo lỗi này
Kiểu tham số của chữ ký chỉ mục không thể là kiểu hợp. Hãy xem xét sử dụng kiểu đối tượng ánh xạ thay thế.
Loại đối tượng ánh xạ là gì, và làm thế nào để tôi sử dụng nó?
Câu trả lời #1
Một kiểu đối tượng ánh xạ hoạt động trên một tập hợp các kiểu đơn và tạo ra một kiểu đối tượng mới, trong đó mỗi kiểu đơn đó được chuyển thành tên thuộc tính.
Ví dụ, cái này:
type Foo = {
[K in "hello" | "world"]: string
};
sẽ tương đương với
type Foo = {
"hello": string;
"world": string;
};
Hãy nhớ rằng một kiểu đối tượng được ánh xạ là một toán tử kiểu riêng biệt - cú pháp trong dấu ngoặc nhọn không thể được sử dụng trong các interface, hoặc các kiểu đối tượng có các thành viên khác. Ví dụ
interface Foo {
[K in "hello" | "world"]: string; // ❌
}
gây ra lỗi sau:
A computed property name in an interface must refer to an expression whose type is a literal type or a 'unique symbol' type.
Các kiểu đối tượng được ánh xạ rất hữu ích cho nhiều việc khác nhau. Đọc thêm tại đây: https://www.typescriptlang.org/docs/handbook/2/mapped-types.html
Câu trả lời #2
Cái này không hợp lệ:
type DirectiveType = 'package-as' | 'externals' | 'move-folders' | 'ignore';
type Directives = { [key:DirectiveType]?: RootDirectives };
export class PkgmetaFile {
private _directives: Directives = {};
}
Nhưng điều này là hợp lệ:
type DirectiveType = 'package-as' | 'externals' | 'move-folders' | 'ignore';
type Directives = { [Key in DirectiveType as string]?: RootDirectives };
export class PkgmetaFile {
private _directives: Directives = {};
}
