Typescript不检查接口声明的函数参数类型

时间:2016-02-21 19:57:02

标签: typescript

我在编译下面的代码时遇到了两个错误,但是typescript编译时没有任何错误。

interface IFoo{
    Bar(callback: (arg:string) => void):void;
}

class Foo implements IFoo {
    public Bar(callback: () => void):void{
        callback();
    }
}

var foo: IFoo;
foo = new Foo();
foo.Bar(() => {
    console.log("Hi");
})

预期错误1:IFoo.Bar需要一个函数参数,该参数本身采用字符串参数。但是,当Foo实现IFoo时,Foo.Bar被声明为带有NO参数的函数参数。我希望这是一个类型错误。

预期错误2:foo的类型为IFoo。使用函数参数调用foo.Bar,该函数参数不带参数,这与IFoo中Bar的定义相反。我希望这是一个类型错误。

因此,在声明接口方法的具体实现时,以及在调用接口方法时,似乎都没有强制执行函数签名的类型。

显然,我误解了typescript如何处理接口声明的函数参数的类型检查。有人可以解释为什么这个编译没有错误吗?

1 个答案:

答案 0 :(得分:5)

TypeScript FAQ回答了这个问题。以下是答案的文字:

这是预期和期望的行为。 首先,请参阅常见问题解答顶部的“替代性”入门 - handlercallback的有效参数,因为它可以安全地忽略额外的参数。

其次,让我们考虑另一个案例:

let items = [1, 2, 3];
items.forEach(arg => console.log(arg));

这与“想要”错误的示例是同构的。 在运行时,forEach使用三个参数(值,索引,数组)调用给定的回调,但大多数情况下回调仅使用一个或两个参数。 这是一种非常常见的JavaScript模式,必须明确声明未使用的参数会很麻烦。