2017-04-13 17 views
1

ここでは、2つのテンプレートを取り込むインターフェイスを示します。返される関数は(これが反応-Reduxの上のテイクである)のいずれかのテンプレートの一部でなければなりません:テンプレートの一部が正常に動作しない

:今

export type IState<TState, TOwnProps> = { 
    connect: (mapStateToProps: MapStateToProps<TState, Partial<TOwnProps>>) =>() => any; 
} 
export type MapStateToProps<TState, TStateProps> = (state: TState) => TStateProps; 

を、ここではこれを使用したいと思う状態の一例です

interface IAppState { 
    services: string[] 
} 

interface IAppProps { 
    services: string[]; 
    count: number; 
} 

const MyState: IState<IAppState, IAppProps>; 
MyState.connect(
    (state) => { 
     return { 
      services: state.services, 
      foo: null 
     } 
    } 
); 

MyState.connectは、(それを行う)1つの機能を期待する必要があります。引数の型はIAppStateである必要があります。しかし、返品はPartial<IAppProps>であると考えられます。しかし、あなたが見る通り、私はfoo: nullも返しており、サービスはこれについて不平を言っていません。

私はここで間違っていますか?

+0

オプション 'strictNullCheck'は有効になっていますか? – Paleo

答えて

0

あなたはこのしよう:

MyState.connect(
    (state) : Partial<IAppProps> => { 
     return { 
      services: state.services, 
      foo: null 
     } 
    } 
); 

をコンパイラが文句を開始します。ここで起こるのは次のとおりです。

内部ラムダ関数のタイプは() => {services:IAppState, foo:null}と推定されます。これは、() => Partial<IAppProps>と互換性があるため、接続するパラメータとして渡すことができます(すべての必須フィールドがあります)。したがって、コンパイラはオブジェクトリテラルの型を比較せず、関数の型を比較します。

厳密に言えば、const x : {foo:number} = {foo:1, bar:2};でも、値にはすべての必須プロパティがあるため、型保証されます。しかし、通常、オブジェクトリテラルを書くときには、より厳密なチェックが望ましいです。そのため、typescriptには別の規則があります:Object literal may only specify known properties.。このルールは関数の戻り値には当てはまりません。

+0

2つのもの。 1)私は実際に完全に異なる 'インタフェース'を完全に '(状態):Partial 'に設定することができ、コンパイラは文句を言わない。何故ですか?私は、関数呼び出しが '(state):Partial 'だけを受け入れるべきであることを 'IState'で明確に定義しました。 2)関数に対して戻り値の型を再度設定しないことをお勧めします。私は 'State'インターフェースを一度定義し、全てのタイプをチェックしたいだけです。 – Kousha

関連する問題