不一致隐含一个“任何”类型错误
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 在您的情况下的行为不一致,那就见仁见智了。
但是,您为什么还要提供两种不同的回调签名?第二个就足够了,因为正如我所说,参数总是可以省略的。
【讨论】:
以上是关于不一致隐含一个“任何”类型错误的主要内容,如果未能解决你的问题,请参考以下文章
c#错误不一致的可访问性:参数类型'HRDMSV1.User'比方法更难访问