不一致隐含一个“任何”类型错误

Posted

技术标签:

【中文标题】不一致隐含一个“任何”类型错误【英文标题】:Inconsistent implicitly has an 'any' type error 【发布时间】:2017-11-16 00:31:41 【问题描述】:

我使用的是 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】:

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

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

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

在这种情况下,很明显编译器无法推断回调签名。因此,如果 TypeScript 在您的情况下的行为不一致,那就见仁见智了。

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

【讨论】:

以上是关于不一致隐含一个“任何”类型错误的主要内容,如果未能解决你的问题,请参考以下文章

反应/打字稿:参数“道具”隐含了“任何”类型错误

Eclipse 编译错误:“类名”类型的层次结构不一致

c#错误不一致的可访问性:参数类型'HRDMSV1.User'比方法更难访问

引用 NSManagedObject 子类的协议中出现不一致的“未知类型名称”错误

数据库中字段类型和代码里面的类型不一致不出错?

Oracle Open Cursor for Using 给出错误 ORA-00932:不一致的数据类型