不一致隐式地具有“任何”类型错误

时间:2017-06-14 03:26:07

标签: 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: 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

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

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

问题在于TypeScript编译器无法确定您的回调是否为Callback1或Callback2类型(因为在定义函数时总是可以省略参数)。

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

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

在这种情况下,很明显编译器无法推断回调签名。如果你案件中TypeScript的行为不一致,那么就是一个意见问题。

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