2017-01-30 18 views
5

Tôi có thể hợp nhất khai báo enum trong một tệp duy nhất, ví dụ:TypeScript: mở rộng nhập enum

export enum Test { 
    value1 = <any>'value1', 
    value2 = <any>'value2' 
} 

export enum Test { 
    value3 = <any>'value3' 
} 

Điều này làm việc tốt, nhưng ý định của tôi là có chung một enum mà tôi có thể mở rộng sau này, ví dụ:

// test.enum.ts 
export enum Test { 
    value1 = <any>'value1', 
    value2 = <any>'value2' 
} 

// place-to-extend-enum.ts 
import { Test } from './test.enum'; 

export enum Test { 
    value3 = <any>'value3' 
} 

Những gì tôi nhận được là

Individual declarations in merged declaration 'Test' must be all exported or all local.

Có cách nào để đạt được các hành vi mong muốn?

Trả lời

6

Trong tham khảo https://github.com/Microsoft/TypeScript/pull/6213 bạn có thể làm:

// test.enum.ts 
export enum Test { 
    value1 = <any>'value1', 
    value2 = <any>'value2' 
} 

// place-to-extend-enum.ts 
import { Test } from './test.enum'; 

declare module './test.enum' { 
    export enum Test { 
    value3 = <any>'value3' 
    } 
} 

... Magic! ;)

+0

này mang lại cho tôi 'Lỗi: (25 , 14) TS1066: Trong khai báo enum môi trường xung quanh thành viên phải là biểu thức liên tục.', do đó, nó không thực sự làm việc với các chuỗi. Nhưng tôi phải thừa nhận, nếu tôi không chỉ định 'value3' nó hoạt động. +1 mặc dù – smnbbrv

+0

Nó hoạt động với các loại 2,4 mà hỗ trợ nguyên bản enum như chuỗi – Chklang

+0

ok, quản lý để làm cho nó hoạt động, chỉ v2.4 và vẫn còn nó không tạo ra một enum mới. Tuy nhiên, nó biến đổi cái hiện tại, vì vậy nói cách khác nó vẫn không thể có một enum khác ... Ngoài ra, câu trả lời có vẻ tốt đẹp với tôi. Cảm ơn! – smnbbrv

1

Sau một số nghiên cứu, tôi phải thừa nhận rằng tôi không thể tìm được cách siêu phù hợp để thực hiện điều đó.

Nhưng có hai giải pháp có thể không phải là xấu và không hôi thối nhiều.

Đầu tiên là triển khai enum tùy chỉnh - theo cách này không cho phép tiêu thụ các enums hiện có. Đây có lẽ là giới hạn duy nhất của phương pháp này. Khác hơn là nó trông đơn giản và khá bản địa.

Một cách khác là một cuộc tấn công lớn với [sáp nhập enums thành một giá trị với một khai báo kiểu riêng biệt. Bằng cách này cho phép tiêu thụ đã tồn tại, thực sự enums; tuy nhiên nó ít thoải mái hơn khi sử dụng vì có hai thực thể cần biết: giá trị enum và kiểu enum.

1

Tôi thấy một cách mà bạn có thể thêm chức năng/phương thức bổ sung vào một enum hiện có. này là bằng cách tạo ra các chức năng trong một không gian tên tương tự như kiểu enum: Đây

enum Weekday { 
    Monday, 
    Tuesday, 
    Wednesday, 
    Thursday, 
    Friday, 
    Saturday, 
    Sunday 
} 
namespace Weekday { 
    export function isBusinessDay(day: Weekday) { 
     switch (day) { 
      case Weekday.Saturday: 
      case Weekday.Sunday: 
       return false; 
      default: 
       return true; 
     } 
    } 
} 

const mon = Weekday.Monday; 
const sun = Weekday.Sunday; 
console.log(Weekday.isBusinessDay(mon)); // true 
console.log(Weekday.isBusinessDay(sun)); // false 

Bạn có thể xem thông tin đầy đủ ở đây https://basarat.gitbooks.io/typescript/docs/enums.html tại phần "Enum với chức năng tĩnh"

Các vấn đề liên quan