Có thể mở rộng các loại trong Bản in?


153

Nói rằng tôi có loại 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 có thể làm cái này như thế nào?


3
Các typetừ khóa được sử dụng để xác định bí danh loại , chứ không phải giao diện hoặc các lớp học.
Khỉ Heretic

Câu trả lời:


281

Từ khóa chỉ extendscó thể được sử dụng cho các giao diện và các lớp.

Nếu bạn chỉ muốn khai báo một loại có các thuộc tính bổ sung, bạn có thể sử dụng loại giao nhau :

type UserEvent = Event & {UserId: string}

CẬP NHẬT cho TypeScript 2.2, giờ đây có thể có một giao diện mở rộng loại giống như đối tượng , nếu loại đáp ứng 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 cách khác - UserEventphải được khai báo là giao diện, không phải là typenếu bạn muốn sử dụng extendscú pháp.

Và vẫn không thể sử dụng extend với các loại tùy ý - ví dụ: nó không hoạt động nếu Eventlà tham số loại mà không có bất kỳ ràng buộc nào.


Tôi đang sử dụng TS v3.5.2 và tôi không thể có giao diện mở rộng một loại. interface A<T> extends B<T> {blar}Một giao diện chỉ có thể mở rộng một loại đối tượng hoặc giao điểm của các loại đối tượng với các thành viên được biết đến tĩnh
WORMSS 18/07/19

@WORMSS làm điều này gây interface Identifiable<T> extends T { id: string }ra lỗi cho tôi "Giao diện chỉ có thể mở rộng một loại đối tượng hoặc giao điểm của các loại đối tượng với các thành viên được biết đến tĩnh.ts (2312)"
maninak

22

bạn có thể giao nhau các loại:

type TypeA = {
    nameA: string;
};
type TypeB = {
    nameB: string;
};
export type TypeC = TypeA & TypeB;

Một nơi nào đó trong mã của bạn bây giờ bạn có thể làm:

const some: TypeC = {
    nameB: 'B',
    nameA: 'A',
};

6

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 xác định các loại không cho phép chỉ định thừa kế, tuy nhiên bạn có thể đạt được một cái gì đó tương tự bằng cách sử dụng các loại giao cắt, như artem đã chỉ ra.


8
Vâng, nhưng tôi không thích từ này interfacekhi tôi thực sự có nghĩa làtype
Kousha

Đủ công bằng, câu trả lời của artem sẽ phù hợp với bạn :)
olydis

-1

Có thể dưới đây phương pháp tiếp cận sẽ hữu ích cho ai đó TS với Reacjs

interface Event {
   name: string;
   dateCreated: string;
   type: string;
}

interface UserEvent<T> extends Event<T> {
    UserId: string;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.