2017-06-14 86 views
2

我正在使用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 

是accpeted,

foo.setCb((a1) => {}); // error Parameter 'a1' implicitly has an 'any' type. (parameter) a1: any 

应同样接受,或两者应该是错误。 那就是不一致我是说。

我试着阅读规范。

https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#34-union-types https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#3117-type-inference

但是,我找不到任何有关该问题的原因。我不确定我是否正确理解该规范。

任何想法?

回答

0

问题是,TypeScript编译器无法确定您的回调是Callback1还是Callback2类型(因为您在定义函数时总是可以省略参数)。定义回调时,按以下方式

的问题变得更加明显:

export type Callback1 = (a: string) => void; 
export type Callback2 = (a: number) => void; 

在这种情况下,很显然,编译器不能infere回调签名。因此,如果TypeScript在您的案例中的行为不一致,那么这是一个意见。

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

相关问题