javascript - Có thể mở rộng các kiểu trong Typescript không?
Giả sử tôi có kiểu sau:
type Event = {
name: string;
dateCreated: string;
type: string;
}
Bây giờ tôi muốn mở rộng loại này, tức là
type UserEvent extends Event = {
UserId: string;
}
Điều này không hoạt động. Tôi làm thế nào để làm điều này?
Câu trả lời #1
Từ khóa extends chỉ có thể được sử dụng cho các interface và class.
Nếu bạn chỉ muốn khai báo một kiểu có thêm các thuộc tính, bạn có thể sử dụng kiểu giao nhau:
type UserEvent = Event & {UserId: string}
CẬP NHẬT cho TypeScript 2.2, bây giờ có thể có một interface mở rộng kiểu giống đối tượng, nếu kiểu đó thỏa mãn một số hạn chế:
type Event = {
name: string;
dateCreated: string;
type: string;
}
interface UserEvent extends Event {
UserId: string;
}
Nó không hoạt động theo chiều ngược lại - UserEvent phải được khai báo dưới dạng interface, không phải type nếu bạn muốn sử dụng cú pháp extends.
Và vẫn không thể sử dụng extend với các loại tùy ý - ví dụ, nó sẽ không hoạt động nếu Event là một tham số kiểu mà không có bất kỳ ràng buộc nào.
Câu trả lời #2
bạn có thể giao nhau các kiểu:
type TypeA = {
nameA: string;
};
type TypeB = {
nameB: string;
};
export type TypeC = TypeA & TypeB;
ở đâu đó trong mã của bạn, bây giờ bạn có thể làm:
const some: TypeC = {
nameB: 'B',
nameA: 'A',
};
Câu trả lời #3
Một kiểu mở rộng tổng quát có thể được viết như sau:
type Extension<T> = T & { someExtensionProperty: string }
Câu trả lời #4
Bạn cũng có thể làm điều đó bằng cách sử dụng type bên cạnh interface:
type Event = {
name: string;
dateCreated: string;
type: string;
}
type UserEvent = {
UserId: string;
} & Event
Câu trả lời số 5
Những gì bạn đang cố gắng đạt được tương đương với
interface Event {
name: string;
dateCreated: string;
type: string;
}
interface UserEvent extends Event {
UserId: string;
}
Cách bạn định nghĩa các loại không cho phép chỉ định kế thừa, tuy nhiên bạn có thể đạt được điều gì đó tương tự bằng cách sử dụng các loại giao nhau, như artem đã chỉ ra.
