2017-06-14 88 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在您的案例中的行爲不一致,那麼這是一個意見。

但是,爲什麼你甚至提供了兩個不同的回調簽名?第二個就足夠了,因爲正如我所說的,參數總是可以省略的。

相關問題