Typescript 不一致隐式具有';任何';类型错误

Typescript 不一致隐式具有';任何';类型错误,typescript,type-inference,union-types,Typescript,Type Inference,Union Types,我使用的是TypeScript版本2.3.2。 我在使用noImplicitAny选项时遇到了一个传输文件错误。我觉得错误是不一致的 代码如下: // Transpile with noImplicitAny export type Callback1 = (a1: string) => void; export type Callback2 = (a1: string, a2: string) => void; export class Foo { setCb(cb:

我使用的是TypeScript版本2.3.2。 我在使用noImplicitAny选项时遇到了一个传输文件错误。我觉得错误是不一致的

代码如下:

// Transpile with noImplicitAny

export type Callback1 = (a1: string) => void;
export type Callback2 = (a1: string, a2: string) => void;

export class Foo {
    setCb(cb: Callback1 | Callback2): void {
    }
}

let foo = new Foo();
foo.setCb((a1) => {});  // error Parameter 'a1' implicitly has an 'any' type. (parameter) a1: any
foo.setCb((a1: string) => {}); // no error
foo.setCb((a1, a2) => {});  // no error
foo.setCb((a1: string, a2: string) => {}); // no error
我想如果

foo.setCb((a1, a2) => {});  // no error
已被接受

foo.setCb((a1) => {});  // error Parameter 'a1' implicitly has an 'any' type. (parameter) a1: any
应该以同样的方式接受,或者两者都是错误的。 这是不一致的,我是说

我试着阅读说明书

然而,我找不到这种行为的原因。我不确定我是否正确理解规范


有什么想法吗?

问题是TypeScript编译器无法确定回调类型是Callback1还是Callback2(因为定义函数时总是可以忽略参数)

通过以下方式定义回调时,问题变得更加明显:

export type Callback1 = (a: string) => void;
export type Callback2 = (a: number) => void;
在这种情况下,编译器显然无法推断回调签名。因此,如果TypeScript在您的案例中的行为不一致,这是一个意见问题

但是,为什么还要提供两个不同的回调签名?第二个参数本身就足够了,因为正如我所说的,参数总是可以省略的