2016-10-31 7 views
3

のparamタイプを宣言した場合:活字体の機能の実装ダウングレードパラメータの種類は、私はこのような関数インタフェースを持つ

interface Callback { 
    (a: string, b: number): void; 
} 

そして、私はこのようなパラメータの型を宣言せずにそれを実装することができます

const callback: Callback = (a, b) => { } 

この場合、TypeScriptは、callbackのパラメータタイプが実際に(a: string, b: number)であることを認識しています。

私は、このようなb: numberとして、入力された一つのパラメータでそれを宣言する場合は、:

const callback: Callback = (a, b: number) => { } 

他のパラメータaのタイプはanyになります。 Example in the Playground。奇妙なのは、コンパイラがタイプaが間違って定義できないためです。例えば、(a: boolean, b: number)は、パラメータが互換性がないと言うでしょう。パラメータタイプをaと推測しないのはなぜですか?


上記は簡単な例ですが、それは私に生成しようとしているいくつかの頭痛を与えているタイプセーフRedux reducer map:各関数はそのactionパラメータとしてIActionのサブタイプになりますので

interface IReducer<TState> { 
    (state: TState, action: IAction): TState; 
} 

interface IReducerMap<TState> { 
    [actionType: string]: IReducer<TState>; 
} 

interface MyState { hello: string; } 

interface MyAction extends IAction { say: string; } 

const myReducerMap: IReducerMap<MyState> = { 
    // Result: `(state: MyState, action: IAction) => MyState` 
    // But I get an error on `action.say` not defined in `IAction` 
    reducer1: (state, action) => { 
    return { hello: action.say }; 
    }, 

    // Result: `(state: any, action: MyAction) => computed` 
    reducer2: (state, action: MyAction) => { 
    return { hello: action.say + state.this_should_be_an_error }; 
    }, 

    // Works but relies on you to correctly defining state 
    reducer3: (state: MyState, action: MyAction) => { 
    return { hello: action.say }; 
    } 
} 

(この場合はMyAction)、その型をコールバックパラメータで宣言する必要があります。しかし、そのタイプを宣言すると、私はstateのタイプを失いました。私はそれを宣言しなければなりません。私が数十のコールバックと、すべてのコールバックに対してDataImportMappingStateのような実際の州名を持っているとき、これはかなり迷惑です。

+0

AFAIK、値から推論された型は、宣言された型を広げることができますが、それは非常に直観的です(多分、私が紛失しているものがあります)。 – ssube

答えて

4

aおよびbの推論は、文脈タイピングに由来します。以前は、すべてのパラメータに注釈が付けられていない場合、パラメータは文脈上の型付けのみとなりました。

This behavior has changed in the latest build of the TypeScript compiler直感的ではないようでした。現在、文脈による型付けは、明示的な型名を持たないすべてのパラメータに適用されます。

+0

私はあなたがロボットだと誓っています。もう一度ありがとうライアン、私はSOが私を許可するときに私は9分で受け入れるだろう。 :) – Aaron

関連する問題