Javascript 函数是否有“接口”这样的概念?

Javascript 函数是否有“接口”这样的概念?,javascript,python,language-agnostic,Javascript,Python,Language Agnostic,我有各种函数接受相同的参数并返回相同的类型。它们做相似的事情(例如,用不同的近似方法进行积分),只是名称不同。我想强制所有变体具有相同的签名 这可以通过将它们包装到类中来实现,但在概念上没有理由这样做。那么,对于函数是否有类似于接口的概念?也就是说,有什么方法可以做类似的事情吗 abstract Double integration(Double[] xs, Double[] ys); Double RiemmannIntegration implements integration(...)

我有各种函数接受相同的参数并返回相同的类型。它们做相似的事情(例如,用不同的近似方法进行积分),只是名称不同。我想强制所有变体具有相同的签名

这可以通过将它们包装到类中来实现,但在概念上没有理由这样做。那么,对于函数是否有类似于
接口
的概念?也就是说,有什么方法可以做类似的事情吗

abstract Double integration(Double[] xs, Double[] ys);
Double RiemmannIntegration implements integration(...) {...}

显然,这个问题只适用于函数是第一类对象的语言(我对python/javascript最感兴趣)

在python中,可以强制执行类型检查

def type_check_decorator(args_types):
    def real_decorator(func):
        def wrapper(*args):
            # type checking
            for i, (a, t) in enumerate(zip(args, args_types)):
                if not isinstance(a, t):
                    raise ValueError('Type error on argument {}, should be {} but {} given'
                                     .format(i, t, type(a)))
            # execute real function
            return func(*args)
        return wrapper
    return real_decorator


my_interface = type_check_decorator([int, int])

@my_interface
def func1(a, b):
    return a + b
有了这个装饰师,你可能会

func1(1, 2)    # OK
func1(1.1, 2)  # ValueError: Type error on argument 0, should be <type 'int'> but <type 'float'> given
func1(1,2)#好的
func1(1.1,2)#ValueError:参数0上的类型错误,但应给定
要使用此装饰器,请将args_类型中的参数所需的类型作为数组,并将结果接口应用于定义的函数。对于“None-able”参数等效果,您可能仍然需要使用
键入
库,或者通过修改此代码来实现自己的功能。事实上,此装饰程序的优点是允许您定义任意类型检查例程(否则,
键入
可能会更好)


如果所有函数的键入要求完全相同,则可以去掉最外层的修饰符,使用硬编码的
arg\u types

您要查找的概念是函数的类型。具体来说,这是一种“更高种类”的类型,因为它是一种类型,而不是一种值类型

在Haskell这样的语言中,必须传递这样的函数参数。如果不显式地命名类型,编译器将为您推断它。但是如果您试图传递一个接受不同类型的不同函数,那么您将得到一个编译错误

C#有一种特殊的语法,用于声明函数类型,称为委托类型。Java8+有一个函数接口的概念,或者只有一个方法的接口,并且有一些语言特性,可以更容易地传递表示给定类型函数的对象


在JavaScript和Python中,对象实际上没有接口,至少没有显式的接口。但您可以实现的是协议,在协议中,您需要一个参数是一个接受特定参数并以特定方式运行的函数。Python标准库中的一个很好的例子是
sorted()的
key
参数
function:函数必须接受一个要排序的iterable项,并返回一个可比较的对象作为排序键。

是否希望在编译时强制执行此操作?在函数为一级对象的语言中,其可调用签名是其接口的一部分。另外,您给出的两个示例是没有类型的语言(默认情况下,至少JS有TypeScript,请参阅,Python有
类型
,请参阅)。@schwobasegll:最好是。用一种新的方法会发生什么class@blue_note:但是你说你对Python和JavaScript感兴趣,这两种语言没有任何类型的编译时检查,更不用说函数式了。“那没有道理!”丹尼尔普赖登:的确如此。然而,我最感兴趣的是这样的概念是否存在于任何语言中。此外,python有类型注释,typescript向javascript添加了类似的功能,因此可以实现类似的功能,或者在较新版本的python中,您可以使用
键入
模块。虽然这可能是有用的知识,但这并不能回答问题。