の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
のような実際の州名を持っているとき、これはかなり迷惑です。
AFAIK、値から推論された型は、宣言された型を広げることができますが、それは非常に直観的です(多分、私が紛失しているものがあります)。 – ssube