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

Typescript不检查接口声明的函数参数类型,typescript,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.Ba

编译下面的代码时,我预期会出现两个错误,但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被声明为接受一个没有参数的函数参数。我认为这是一个类型错误

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

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

显然,我误解了typescript如何处理接口声明的函数参数的类型检查。有人能解释一下为什么编译时不会出错吗?

这一点在中得到了回答。以下是该答案的文本:

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

第二,让我们考虑另一个例子:

let items = [1, 2, 3];
items.forEach(arg => console.log(arg));
这与“想要”一个错误的例子是同构的。 在运行时,
forEach
使用三个参数(值、索引、数组)调用给定的回调,但大多数时候回调只使用一个或两个参数。
这是一种非常常见的JavaScript模式,必须显式声明未使用的参数会很麻烦。

这当然可以解释这种行为。谢谢我仍然感到惊讶,这是这样设计的。由于Typescript允许我们专门声明函数上的可选参数,因此,如果函数是用未声明为可选的参数声明的,则它们确实不是可选的,这似乎是合理的。我认为,对于上面FAQ中引用的示例(以及我在上面发布的代码中的两个问题),只有当参数被指定为可选参数时,才应该编译。调用签名总是从调用方进行解释,其中可选性意味着“它可能丢失”,而不是“您可能看不到它”。一个回调读取
(x?:string)=>void
意味着“我可能用一个字符串参数调用您,或者我可能用零参数调用您”。不幸的是,每个人都误解了调用签名的这一方面,并在一堆回调签名中使用可选参数编写了定义文件(好像是由库作者来决定您必须查看哪些参数,而不是让您做出决定),因此类型系统在这种特定情况下忽略了可选性。我要补充的是,这与回调和接口无关。我认为,如果调用的函数的参数比预期的多,显然这不会导致任何错误。当您将此应用于回调时,会因为调用而变得有点违反直觉r vs称为反转。