在typescript中,如何在使用之前声明一个函数--C风格

时间:2017-02-04 23:20:00

标签: typescript

我有一个功能,例如

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

我的问题是,是否有可能预先声明一个函数,因此不必重复类型信息?这将是很好的,在某些情况下,在定义函数时,在相同类型中添加类型信息会产生非常长的行。

3 个答案:

答案 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)

这不是您正在寻找的答案,但我建议您不要尝试这样做。这有几个论点:

  • 这违背了语言设计者的意图。适当TypeScript的所有文档都使用了使用函数体指定参数类型的形式。
  • 与此相关,大多数生产代码都遵循这种模式。如果您计划开源,那么它将对产品起作用。同样,任何其他内部开发人员都会发现很难遵循。
  • 这使得代码更难以遵循。类型信息在一个地方,代码在另一个地方。如果要进行修改,则需要在两个位置进行修改。
  • 它打开了你的bug。 TypeScript具有函数重载功能。也许您在一个地方而不是另一个地方修改了args列表,编译器并不介意,并且您会收到运行时错误。击败类型系统的目的。
  • 看起来像C / C ++。这些语言具有声明和定义文件的历史原因。但是没有其他现代语言能够复制&#34;功能&#34;。它源于早期编译器和计算机的限制,而且处理起来很麻烦。

如果您发现参数太多,还有其他解决方案。例如,您可以将它们打包成一个对象。您可以使用构建器模式。您可以将函数分组到一个对象中,并在构造时提供所有参数,并让每个对象在字段上运行。