TypeScript:为命名函数添加接口(函数声明)?

时间:2016-09-16 14:16:30

标签: typescript

刚开始使用Typescript,并为我的函数使用接口,如下所示:

interface StringFunction {
    (arg1:string):string
}

如果我将该接口声明为变量,我可以将该接口附加到函数:

let testFunction:StringFunction = function(arg1) {}

但我无法弄清楚我是如何(或可以?)用命名函数来做的。这不起作用:

function testFunction:StringFunction(arg1) {}

有没有办法做到这一点?

2 个答案:

答案 0 :(得分:2)

明确说明正在使用哪个接口的需要是名义类型系统的约束。 TypeScript是结构类型的,因此您无需显式声明函数实现接口。

例如,下面的testFunction完全可以接受,需要StringFunction - 并且编译器会检查它是否为。

interface StringFunction {
    (arg1:string):string
}

function testFunction(arg1) { return ''; }

var x: StringFunction = testFunction;

以下示例说明是否发生类型检查:

interface StringFunction {
    (arg1:string):string
}

function testFunction(arg1) { return 1; }

var x: StringFunction = testFunction; // Error

在这种情况下,testFunction不兼容,编译器会发出警告。

附加说明:

在严格模式下,您的原始功能确实需要类型信息(但答案仍然适用)。

function testFunction(arg1: string) { return ''; }

仅在没有用于推断类型的上下文的情况下才需要这样做,因此以下工作在严格模式下,即使它看起来缺少类型注释。 string上的arg1类型是上下文类型。

var x: StringFunction = (arg1) => { return ''; };

答案 1 :(得分:0)

您可以这样做,但是命名函数的语法有些不同。

interface StringFunction {
  (arg1:string): string
}

<StringFunction>function testFunction(arg1) {}

在这里,我们将testFunction投射到界面上。 arg1将是string。 确保类型为之前 function关键字。