我有一个功能,例如
function init(model: any, eventData: UserApplicationModel) : any
我想避免将类型信息与函数源代码混合。我试过(在同一个源文件中):
declare function init(model: any, eventData: UserApplicationModel) : any;
function init(model, eventData) {
// source code here
}
但我得到error TS2384: Overload signatures must all be ambient or non-ambient
。
我的问题是,是否有可能预先声明一个函数,因此不必重复类型信息?这将是很好的,在某些情况下,在定义函数时,在相同类型中添加类型信息会产生非常长的行。
答案 0 :(得分:2)
您可以使用type
定义函数签名,例如:
type init = (model: any, eventData: UserApplicationModel) => any;
然后通过将匿名函数表达式赋值给该类型的变量来初始化它:
var init: init = function (model, eventData) {
...
};
即使在功能体内也能提供完全的类型安全性。当盲目地将C代码转换为TypeScript时,这可能很有用。
答案 1 :(得分:0)
function init(model: any, eventData: UserApplicationModel) : any;
function init(model, eventData) {
// source code here
}
会做的伎俩。请注意省略declare
修饰符。
为此,类型签名需要直接位于相应的实现之上,如图所示。您可以以这种方式创建实现的多个重载。
在任何情况下,实际实现的类型签名都会被它上面的函数签名方便地掩盖。
<强>更新强>
我相信我可能误解了这个问题。这将为调用者提供类型化的函数签名,但不会隐含地为实现的参数和返回类型提供类型。该实现仅限于具有参数类型,参数arity和符合其上方的重载签名的返回类型。
答案 2 :(得分:0)
这不是您正在寻找的答案,但我建议您不要尝试这样做。这有几个论点:
如果您发现参数太多,还有其他解决方案。例如,您可以将它们打包成一个对象。您可以使用构建器模式。您可以将函数分组到一个对象中,并在构造时提供所有参数,并让每个对象在字段上运行。