我正在使用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
应该同样接受,否则两者都应该是错误的。 那是不一致我的意思。
我试着阅读规范。
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 :(得分:0)
问题在于TypeScript编译器无法确定您的回调是否为Callback1或Callback2类型(因为在定义函数时总是可以省略参数)。
以下列方式定义回调时问题变得更加明显:
export type Callback1 = (a: string) => void;
export type Callback2 = (a: number) => void;
在这种情况下,很明显编译器无法推断回调签名。如果你案件中TypeScript的行为不一致,那么就是一个意见问题。
但是,为什么你甚至提供两种不同的回叫签名?第二个就足够了,因为正如我所说,参数总是可以省略。