下面这段代码在 Typescript 4.3.3 会报错:
interface SomeMethod {
(message: string, ...meta: any[]): void; // #1
(data: object): void; // #2
}
declare const foo: SomeMethod;
function bar() {
const message = 'message';
const data = { key: 'value' };
const meta = [data, data];
// (message: string, ...meta: any[]): void
foo(message, ...meta);
foo.call(null, message, data); // TS2554: expected 2 arguments but got 3
foo(message, ...meta);
foo.call(null, message, ...meta); // TS2556: A spread argument must either have a tuple type or be passed to a rest parameter.
// (data: object): void
foo(data);
foo.call(null, data); // #3
}
如果交换 #1
和 #2
两行,就会变成 #3
报错:TS2345: Argument of type '{ key: string; }' is not assignable to parameter of type 'string'.
。
似乎 Typescript 在推断 Function.call
的参数类型时只考虑了最后一个重载?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.