在编译下面的代码时,我期待两个错误,但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 回答
这在TypeScript FAQ中得到了解答 . 这是答案的文字:
这是预期和期望的行为 . 首先,请参阅常见问题解答顶部的"substitutability"入门 -
handler
是callback
的有效参数,因为它可以安全地忽略额外的参数 .其次,让我们考虑另一个案例:
这与"wanted"错误的示例同构 . 在运行时,
forEach
使用三个参数(值,索引,数组)调用给定的回调,但大多数情况下回调仅使用一个或两个参数 . 这是一种非常常见的JavaScript模式,必须明确声明未使用的参数是很麻烦的 .