2017-10-10 7 views
1

タイプスクリプト&リアクション初心者はここに。 constructor(foo: string)の入力タイプが{foo: string}と一致しないため、なぜTypeScriptが私に叫ばないのですか? (注:それらのうちの1つは文字列、もう1つはオブジェクトです)タイプコピーがタイプミスをキャッチしない(反応するTSX)

TypeScriptはこれをうれしくコンパイルします。もちろん、結果のコードは爆発します。 tsconfig.jsonが提供するすべてのオプションをオンにしようとしました。私はtypescript 2.5.3を使用しています。

これを避けるために、typescriptの設定、コードの変更、または何か他の方法がありますか?任意のアイデアが評価され、私の目標は安定したコードを書くことです。

import * as 'react'からの反応; *「react-dom」からのReactDOMとしてのインポート。

class App extends React.Component<{ foo: string }, { foo: string }> { 
    // expects string 
    constructor(foo: string) { 
     super(); 
     this.state = { 
      foo: foo 
     } 
    } 
    render() { 
     return <div>{this.state.foo}</div> 
    } 
} 

// Passes object { foo: string } 
ReactDOM.render(<App foo="foo" />, document.getElementById('root')) 

EDIT:簡素化質問

+1

あなたは、これは正しい、活字されていないことを実現していますか? – Amit

+0

@あなたが言うようになった今、私は尋ねる時に気づいていませんでした。ありがとう。だから、JSX→TS→JSの適切なワークフローの考え方は? – zupa

+0

いいえ、個人的に、私はこの理由で正確に反応しません。私はこの構文が厄介で気を散らすことがわかります。 – Amit

答えて

1

ますあなたが探しているコンパイラの苦情を受け取りますpropssuper()に渡すことを忘れないでください。これはReact.Componentを拡張するだけの一部であり、should always be done.

enter image description here

+0

ありがとう、マイク、これはそれだった!あなたは私の一日を完全にあなたの助けによって作りました。 – zupa

+0

私はあなたに賞金をあげたいと思っていましたが、明らかに私は23時間後にしかできません。さらなる回答を避けるために、ここに文書化してください。 – zupa

0

あなたの懸念:あなたは常にクラスを継承し、独自のコンストラクタを提供することができるので

// WRONG, to work, it should be: 
// constructor(props Props) { 
constructor(foo: string, bar: string) { 
    super(); 
} 

が無効です:

class A { 
    constructor(a: number) { } 
} 

class B extends A { 
    // ALLOWED 
    constructor(b: string) { 
    super(123) 
    } 
} 
+0

答えをありがとう。実際には、それは私の問題ではありません。コンストラクタの型は、 'ReactDOM.render(、root)'という呼び出しの不一致で、2つの文字列ではなく1つのオブジェクトを渡します。 – zupa

関連する問題