函数式编程接口js

时间:2018-08-22 12:18:33

标签: javascript

我看到互联网上有用于功能编程的接口。

有一些其他语言的示例,但是我的问题是我可以用javascript制作接口吗。

我不需要一切都非常严格。

例如用于从数据库获取行的界面:

在OOP中:

interface DBGet {
 public function getResults($filters){}
}

和实现:

class MySQLDb implements DBGet {
  public function getResults($filters){
    ......
  }
}

我可以使用函数式编程来转换JavaScript中的代码吗?

谢谢

1 个答案:

答案 0 :(得分:0)

JavaScript没有接口的概念。

有关更多详细信息,请参见this other SO answer。本质上说:

  

没有“此类必须具有这些功能”的概念(即,   本身没有接口),因为:

     
      
  1. JavaScript继承基于对象,而不是类。那不是   直到意识到:
  2.   
  3. JavaScript是非常动态的   输入语言-您可以使用适当的方法创建对象,   这将使其符合接口,然后取消所有定义   使它符合要求的东西。颠覆类型是如此容易   系统-甚至不小心! -尝试不值得   并首先创建类型系统。
  4.   

编辑

但是,

可以使用TypeScript。 TypeScript introduces interfaces用于更传统的OO类型系统实现,但是,使用它们存在一些警告,并且无论如何将它们转换为原始JavaScript时,它们只会从代码中剥离。

编辑2

以下是使用JavaScript实现目标的几种方法:

注意:ES6中引入了Lambda箭头语法。

1-使用两个类(将lambda函数定义为属性)

class MySqlDbGet {
    getResults = (filters) => {
        // MySQL implementation of "getResults"
    };
}

class PostgreSqlDbGet {
    getResults = (filters) => {
        // PostgreSQL implementation of "getResults"
    };
}

methodThatTakesAFunction(new MySqlDbGet().getResults);
methodThatTakesAFunction(new PostgreSqlDbGet().getResults);

2-使用两个对象(将lambda函数定义为属性)

const mySqlDbGet = {
    getResults: () => {
        // MySQL implementation of "getResults"
    }
};

const postgreSqlDbGet = {
    getResults: () => {
        // PostgreSQL implementation of "getResults"
    }
};

methodThatTakesAFunction(mySqlDbGet.getResults);
methodThatTakesAFunction(postgreSqlDbGet.getResults);

3-使用两个变量来保存您的lambda函数

const mySqlGetResults = () => {
    // MySQL implementation of "getResults"
};

const postgreSqlGetResults = () => {
    // PostgreSQL implementation of "getResults"
};

methodThatTakesAFunction(mySqlGetResults);
methodThatTakesAFunction(postgreSqlGetResults);

然而,要点仍然存在:JavaScript不会将您的对象持有一定的合同。因此,在您的程序中随时 ,您可以将mySqlGetResults重新分配为"som string",并在任何地方将其传递给 < / em> ,直到运行时您都不会收到任何错误消息。您应自行检查可能不是您认为的变量的变量,并处理可能不确定是否按照您的想法定义对象的任何情况。