Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/438.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 函数式编程接口js_Javascript - Fatal编程技术网

Javascript 函数式编程接口js

Javascript 函数式编程接口js,javascript,Javascript,我在互联网上看到了函数式编程的接口 有一些其他语言的示例,但我的问题是我可以用javascript创建接口吗 我不需要每件事都非常严格 例如,用于从数据库获取行的接口: 在OOP中: interface DBGet { public function getResults($filters){} } 和执行: class MySQLDb implements DBGet { public function getResults($filters){ ...... } } 我

我在互联网上看到了函数式编程的接口

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

我不需要每件事都非常严格

例如,用于从数据库获取行的接口:

在OOP中:

interface DBGet {
 public function getResults($filters){}
}
和执行:

class MySQLDb implements DBGet {
  public function getResults($filters){
    ......
  }
}
我可以用函数式编程在JavaScript中转换代码吗


谢谢,JavaScript没有接口的概念

有关更多详细信息,请参阅。它基本上是这样说的:

没有“这个类必须有这些函数”的概念(即, 没有接口本身),因为:

  • JavaScript继承基于对象,而不是类。那不是个好主意 在你意识到之前,这是一件大事:
  • JavaScript是一种非常动态的语言 类型化语言--您可以使用适当的方法创建对象, 这将使它符合接口,然后取消定义所有 使它符合的东西。颠覆这个类型太容易了 系统——即使是意外不值得去尝试 首先要做一个类型系统
  • 编辑 但是,您可以使用TypeScript。然而,对于一个更传统的OO类型的系统实现,使用它们有一些注意事项,当代码被转换为普通JavaScript时,它们只是从代码中剥离出来

    编辑2 以下是使用JavaScript实现目标的一些方法:

    注意:中介绍了Lambda arrow语法

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

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

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

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

    然而,主要的一点仍然存在:JavaScript并没有将您的对象保持在特定的契约中。因此,在程序运行期间的任何时间,您都可以将
    mySqlGetResults
    重新分配为
    “som string”
    ,并将其传递到您喜欢的任何地方,直到运行时为止,不会收到任何错误消息。这取决于您对可能不是您所认为的变量进行检查,以及处理您可能不确定对象是否按您所认为的定义的任何情况。

    接口与函数式编程没有直接关系。如果您想使用接口和类,可以尝试使用typescript。Typescript与函数式编程配合得很好,因为在将函数传递给其他函数之前,您可以声明并检查函数的外观。我不想使用OOP,我想问函数式编程如何解决问题-我希望这些函数带有这些参数-如果不是程序死亡的话。我能用函数式语言解决吗?比如haskell或其他语言。你的第一个问题是:我能用javascript制作接口吗。答案是:没有,但是你可以使用typescript。你的第二个问题是:如何以函数式风格重写你的课堂示例。答案是:您可以编写一个函数来接收另一个函数作为其参数。然后,您可以使用typescript界面对参数进行类型检查。虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能无效。-@Vishal你是对的。我从链接的答案中添加了一些信息。谢谢。很好,但我想把它用于函数式编程。例如,我将如何实现一些接口,比如getRows函数。我希望getRows接受2个参数,并且我可以有不同的实现:从数据库,从内存,所有这些都使用相同的参数。在JavaScript中,您可以通过多种方式来实现这一点,因为该语言不要求您使用具体的类型系统。我将用一些示例代码更新我的答案。
    const mySqlDbGet = {
        getResults: () => {
            // MySQL implementation of "getResults"
        }
    };
    
    const postgreSqlDbGet = {
        getResults: () => {
            // PostgreSQL implementation of "getResults"
        }
    };
    
    methodThatTakesAFunction(mySqlDbGet.getResults);
    methodThatTakesAFunction(postgreSqlDbGet.getResults);
    
    const mySqlGetResults = () => {
        // MySQL implementation of "getResults"
    };
    
    const postgreSqlGetResults = () => {
        // PostgreSQL implementation of "getResults"
    };
    
    methodThatTakesAFunction(mySqlGetResults);
    methodThatTakesAFunction(postgreSqlGetResults);