2017-06-14 21 views
2

私はTypeScriptバージョン2.3.2を使用しています。 noImplicitAnyオプションでわかりやすいエラーが発生しました。私はそのエラーが何か矛盾していると感じます。ここで 不整合に暗黙的に「any」型エラーがあります

はコードです:

// 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

問題は、コールバックの型がCallback1かCallback2かどうかをTypeScriptコンパイラが判断できないことです(関数を定義するときに常にパラメータを省略できるため)。コールバックに以下の方法を定義する際に

問題はより顕著になる:

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

その場合には、コンパイラはコールバック署名をinfereことができないことは明らかです。あなたのケースでのTypeScriptの動作が矛盾している場合は、意見の問題です。

しかし、なぜ2つの異なるコールバック署名を提供するのですか?私が言ったように、パラメータはいつも省略することができるので、それ自身の2番目のもので十分でしょう。

関連する問題