当前我的类型定义为:
interface Param {
title: string;
callback: any;
}
我需要这样的东西:
interface Param {
title: string;
callback: function;
}
但第二个不被接受。
V1.4中的Typescript具有type
关键字,该关键字声明类型别名(类似于C/C++中的typedef
)。您可以这样声明回调类型:
type CallbackFunction = () => void;
该函数声明一个不接受任何参数也不返回任何内容的函数。接受零个或多个任意类型参数但不返回任何参数的函数将为:
type CallbackFunctionVariadic = (...args: any[]) => void;
然后你可以说,比如,
let callback: CallbackFunctionVariadic = function(...args: any[]) {
// do some stuff
};
如果您想要一个函数接受任意数量的参数并返回任何内容(包括void):
type CallbackFunctionVariadicAnyReturn = (...args: any[]) => any;
您可以指定一些强制参数,然后指定一组附加参数(例如一个字符串、一个数字,然后指定一组附加参数),这样:
type CallbackFunctionSomeVariadic =
(arg1: string, arg2: number, ...args: any[]) => void;
这对于EventEmitter处理程序之类的东西很有用。
可以用这种方式对函数进行强烈的类型化,尽管如果试图用类型别名来确定所有内容,您可能会得意忘形,并遇到组合问题。
全局类型function
可用于此目的。
此外,如果您打算用0个参数调用此回调并忽略它的返回值,则()=>void
类型匹配所有不带参数的函数。
这里的答案和问题有太多的改进,更不用说唯一稍微复杂一些但却是最佳实践的方法:
问题的解决方案
interface Easy_Fix_Solution {
title: string;
callback: Function;
}
注意:请不要使用function
,因为您很可能不需要任何
回调函数。具体一点是可以的。
对该解决方案改进
interface Safer_Easy_Fix {
title: string;
callback: () => void;
}
interface Alternate_Syntax_4_Safer_Easy_Fix {
title: string;
callback(): void;
}
注:原作者是正确的,不接受论点,返回void更好…它更安全,它告诉接口的使用者,您不会对它们的返回值执行任何操作,也不会向它们传递任何参数。
更好的是使用泛型。这个接口也可以用于前面提到的()=>void
函数类型。
interface Better_still_safe_but_way_more_flexible_fix {
title: string;
callback: <T = unknown, R = unknown>(args?: T) => R;
}
interface Alternate_Syntax_4_Better_still_safe_but_way_more_flexible_fix {
title: string;
callback<T = unknown, R = unknown>(args?: T): R;
}
注意:如果您现在不能100%确定回调签名,请选择上面的void选项,如果您认为可以继续扩展功能,请选择这个通用选项。回调通常会接收某种类型的参数,有时回调orchestrator甚至会对返回值执行某些操作。
还有一个稍微高级一点的用法,除非你需要它,否则你不应该使用它
这允许T中任何类型的任意数量的参数。
这里有更多细节。
interface Alternate_Syntax_4_Advanced {
title: string;
callback<T extends unknown[], R = unknown>(...args?: T): R;
}
目前,我的类型定义为: 我需要这样的东西: 但第二条不被接受。
我想创建一个方法,它可以具有任意数量的参数和任何数据类型的任何方法。 为。我想动态调用以下所有方法void method1(int x,int y)void method2(int x,String y)void method3(Float x,Long y,String z) 我正在使用反射来这样做。现在我讨论了如何在调用这个动态方法的过程中向这些方法传递参数。我做了多远... 如何调用MyMe
问题内容: ./chains.go:26:10:不能在作业中使用UpperCaseHandler(typefunc(asl.MessageDelivery))作为asl.MessageHandler类型./chains.go:37:86:无法使用RepeatHandler(类型func(asl.MessageDelivery))与Repeater.ConsumeFunc的参数中的asl.Messa
在TypeScript中,我可以将函数的一个参数声明为类型函数。是否有一种“类型安全”的方式来完成这件事,而这是我所缺少的?例如,考虑以下内容: save回调不是类型安全的,我给它一个回调函数,其中函数的参数是一个字符串,但我传递给它一个数字,并且编译时没有错误。我可以在保存类型安全函数中设置结果参数吗? TL;DR版本:在TypeScript中是否存在与.NET委托等价物?
问题内容: 我想让一个函数在Swift中接受任何数字(Int,Float,Double,…) 不使用NSNumber 问题答案: 更新: 以下答案原则上仍然适用,但是Swift 4完成了数字协议的重新设计,因此通常不需要添加自己的数字协议。在构建自己的系统之前,请查看标准库的数字协议。 在Swift中,这实际上是不可能的。为此,您需要创建一个新协议,并使用您将在泛型函数中使用的任何方法和运算符进行