2017-06-09 9 views
0

次のコンポーネントがあると、不足しているisUpdating小道具に関するエラーが発生します。どうすれば修正できますか?React/Reduxプロジェクトでは、reduxのconnect decoratorによって渡されたプロパティをTypescriptに認識させる方法を教えてください。

Error:(87, 27) TS2322:Type '{ name: "Fred"; }' is not assignable to type 'IntrinsicAttributes & IntrinsicClassAttributes> & Reado...'. Type '{ name: "Fred"; }' is not assignable to type 'Readonly'. Property 'isUpdating' is missing in type '{ name: "Fred"; }'.

interface ContaineeProps { 
    name: string; 
    isUpdating: string; 
} 

const Containee = (props: ContaineeProps) => <span>{props.name}</span>; 

interface MapStateToProps { 
    isUpdating: boolean; 
} 
const mapStateToProps = state => ({ isUpdating: state.years.yearsUpdating }); 

const ConnectedContainee = connect<MapStateToProps, null, ContaineeProps>(mapStateToProps)(Containee); 


interface Container { 
    name: string; 
} 

class Container extends React.Component<Container, {}> { 
    render() { 
    return (
     <ConnectedContainee name="Fred" /> 
    ) 
    } 
} 

編集:この質問はReduxの/反応/ typescriptですアプリケーションと、このエラーの理由について以下のベストプラクティスについての詳細です。私はいつも2つの場所で指定された小道具の型情報を必要としなければならないのですか?(コンポーネントの小道具のインターフェースとmapStateToProps関数のインターフェース)?

+0

VehiclesFormPropsとは何ですか? –

+0

@OliverCharlesworthうわー、私はそのような慎重な仕事のコピー/貼り付け/私の実際のコンポーネントから簡単な例を編集したと思った。本当に私は吸うことが分かった! (私の例を修正しました) –

答えて

1

受け取ったコンパイルエラーが正しいです。 ContaineePropsにはプロパティーisUpdatingが含まれているため、コンポーネントは使用時にこのプロパティが渡されることが想定されています。

<ConnectedContainee name="Fred" isUpdating="testing" />

isUpdatingContaineePropsにあるべきかどうか疑問がありますか?そうでない場合は、単純に削除して、コンパイルエラーがなくなるはずです。

ここにあることを予定している場合は、インターフェイスにisUpdating小道具が既にあるように別の名前を付けることをおすすめします。

更新

私はあなたのコメントを理解していれば、正しくあなたのコンポーネント内でそれにアクセスできるようにするには、あなたのContaineePropsisUpdating小道具を追加しました。これを行うには、両方のプロキシインターフェイスにプロパティを追加する必要はありませんが、実際には機能するとは思われません...

コンポーネントを両方のインターフェイスに統合する必要があります親コンポーネントから渡された小道具とreduxからマップされた小道具を含むインターフェース。ここ

は、例えば次のとおり

interface AllProps extends MapStateToProps, ContaineeProps {} 

const Containee = (props: AllProps) => <span>{props.name} {props.isUpdating}</span>; 

又は

const Containee = (props: ContaineeProps & MapStateToProps) => <span>{props.name} {props.isUpdating}</span>; 

props.isUpdatingは現在Reduxのストアからマッピングされたプロパティを指します。 isUpdatingの値をローカルに保存する場合は、コンポーネントのローカル状態を使用します。

+0

'Containee'コンポーネントは' isUpdating' propを必要とします。それは決して "手動で"それに渡されることはありません、それは常に接続の呼び出しを介してreduxストアから来るでしょう。私は 'ContaineeProps'で小道具を取り除くことができると理解していますが、コンポーネントのタイプ情報を' MapStateToProps'と 'ContaineeProps'の2つの場所に保持しなければなりません。これが通常はredux/react/typescriptアプリケーションで行われている方法であれば、あまりにも最適ではないようです。 –

+1

@DustinWyatt、私はあなたのコメントを反映するために私の答えを更新しました。お役に立てれば。 – Nick

関連する問題