6

我目前正在实施static land规范(幻想土地的替代方案)。我不仅要使用普通对象作为类型,还要使用静态方法使用ES2015类。我已经将这些静态方法实现为咖喱形式的箭头函数,而不是常规函数。但是,这是不可能的ES2015类:具有静态箭头功能的类

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

map并不需要自己this,因为它仅仅是对List构造一个咖喱功能。为了使其工作,我必须写static map(f) { return xs => xs.map(x => f(x)) },这是非常烦人的。

  • 为什么我不能在ES2015类中使用箭头函数和赋值表达式?
  • 无论如何,有没有简明的方法来实现我的目标?
+1

如果一切都是静态的,为什么'扩展数组'? –

+0

https://stackoverflow.com/questions/32545495/es6-class-instance-properties可能的重复? – Bergi

+0

@ T.J。这个想法是使现有的图书馆静态土地兼容。所以会有非静态属性的类,它们必须被扩展。 – ftor

回答

10

为什么我不能在ES2015类中使用箭头函数和赋值表达式?

因为那是ES2015类语法是不如何设计  — 现在,请参阅下面的线下。

是否有简明的方法来实现我的目标呢?

目前还不清楚,我认为你想要类可言,只是一个对象:(。你说,延长对你在做什么重要的)

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

但是如果你想List扩展Array(例如,你将有实例),但是这些静态添加到它,你需要两个步骤:

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

如果你希望他们不可枚举的或不可配置,等等,你会想Object.defineProperties而非Object.assign;我会离开,作为一个练习留给读者......


有A类stage 2 proposal“领域”,包括静态字段。如果进展到阶段4,最终它将成为即将到来的语言规范的一部分(可能ES2018;在这一点上不太可能使ES2017,但你永远不知道)。

这将允许类中声明的静态域,几乎是完全相同的方式,你向他们展示:

// 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]; 
} 

如果你有通天transpile,你可以告诉它包括第2点阶段的建议。

+1

感谢您的链接和快速回复。 – ftor