这实际上并不是一个错误的签名。可以使用单个参数作为字符串调用它,它会忽略该参数。请记住,这是 Javascript 的工作方式,Typescript 会编译为 Javascript:
function bar() {
console.log('bar');
}
bar('baz'); // no error at runtime in Javascript
同样,接口的签名表明该方法是无效的,这与实际返回字符串的方法兼容。如果调用者认为它是无效的,那么他们将永远不会观察到它返回一个字符串。如果他们认为obj.fn1() 没有返回任何内容,那么没有人会写以下内容:
let result = obj.fn1(); // why am I assigning the return value of a void method?
因此,尽管有“错误”的参数和返回类型,但该方法实际上可以安全地使用,就好像它接受一个字符串并且不返回任何内容一样,因此它与接口的签名兼容。
这一切都很好,但是 Typescript 可以 被设计为在此处报告错误,并且错误消息可能对您的示例有所帮助。但是在很多情况下它不会有帮助。考虑这段代码:
let names = ['Alice', 'Bob', 'Clive'];
let counts: Record<string, number> = {};
names.forEach(name => counts[name] = 0);
Array.prototype.forEach 的签名表示callbackfn 的类型应该是:
(value: any, index: number, array: any[]) => void
但是箭头函数的类型是(name: string) => number。这具有较少的参数和非 void 返回类型。因此,这将与您的示例中的“错误”完全相同。当然,这是forEach的基本正确用法,Typescript抱怨也无济于事。