6

Tôi hiện đang triển khai đặc điểm kỹ thuật static land (thay thế cho vùng đất tưởng tượng). Tôi muốn không chỉ sử dụng các đối tượng đơn giản như các loại mà còn các lớp ES2015 với các phương thức tĩnh. Tôi đã triển khai thực hiện các phương thức tĩnh này dưới dạng các hàm mũi tên trong biểu mẫu được curried thay vì các hàm bình thường. Tuy nhiên, điều này là không thể với các lớp ES2015:Lớp học có chức năng mũi tên tĩnh

class List extends Array { 
    static map = f => xs => xs.map(x => f(x)) 
    static of = x => [x] 
} 

My map không cần nó riêng this, bởi vì nó chỉ đơn thuần là một hàm cà ri vào constructor List. Để làm cho nó hoạt động tôi phải viết static map(f) { return xs => xs.map(x => f(x)) }, những gì là rất khó chịu.

  • Tại sao tôi không thể sử dụng chức năng mũi tên cùng với biểu thức gán trong lớp ES2015?
  • Có cách nào ngắn gọn để đạt được mục tiêu của mình không?
+1

Nếu mọi thứ đều tĩnh, tại sao 'mở rộng mảng '? –

+0

bản sao có thể có của https://stackoverflow.com/questions/32545495/es6-class-instance-properties? – Bergi

+0

@ T.J.Ý tưởng là để làm cho một thư viện tĩnh hiện có tương thích với đất. Vì vậy, sẽ có các lớp với các thuộc tính không tĩnh, mà phải được mở rộng. – ftor

Trả lời

10

Tại sao tôi không thể sử dụng chức năng mũi tên cùng với biểu thức gán trong lớp ES2015?

Bởi vì đó chỉ là không phải là cách cú pháp lớp ES2015 được thiết kế   — cho bây giờ, xem dưới dòng dưới đây.

Có cách nào ngắn gọn để đạt được mục tiêu của mình không?

Nó không rõ ràng với tôi rằng bạn muốn lớp học ở tất cả, chỉ là một đối tượng: (. Bạn đã nói rằng việc mở rộng là rất quan trọng với những gì bạn đang làm)

const List = { 
    map: f => xs => xs.map(x => f(x)), 
    of: x => [x] 
}; 

nhưng nếu bạn muốn List để mở rộng Array (ví dụ, bạn sẽ có trường hợp) nhưng sau đó thêm những tĩnh học với nó, bạn sẽ cần một hai bước:

class List extends Array { 
} 
Object.assign(List, { 
    map: f => xs => xs.map(x => f(x)), 
    of: x => [x] 
}); 

Nếu bạn muốn chúng không được liệt kê hoặc không thể định cấu hình, v.v., bạn sẽ muốn Object.defineProperties thay vì Object.assign; Tôi sẽ để lại đó là một tập thể dục cho người đọc ...


Có một stage 2 proposal cho lớp "lĩnh vực", bao gồm các lĩnh vực tĩnh. Nếu nó tiến tới giai đoạn 4, cuối cùng nó sẽ là một phần của một đặc điểm kỹ thuật ngôn ngữ sắp tới (có lẽ ES2018; không chắc tại thời điểm này để làm cho ES2017 nhưng bạn không bao giờ biết).

Nó sẽ cho phép các trường tĩnh khai báo bên trong lớp, gần như chính xác theo cách bạn cho họ thấy:

// NOT IN THE LANGUAGE YET, BUT A PROPOSAL AT STAGE 2 
class List extends Array { 
    static map = f => xs => xs.map(x => f(x)); 
    static of = x => [x]; 
} 

Nếu bạn transpile với Babel, bạn có thể nói nó bao gồm Giai đoạn 2 đề xuất.

+1

Cảm ơn bạn đã liên kết và phản hồi nhanh. – ftor

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