2017-10-10 55 views
1

TypeScript &在這裏反應新手。爲什麼TypeScript不會因爲constructor(foo: string)輸入類型不匹配{foo: string}? (注意:其中一個是一個字符串,另一個是對象。)typescript不捕捉類型不匹配(反應TSX)

TypeScript將很高興地編譯這個,當然最終的代碼也會崩潰。我試圖打開tsconfig.json必須提供的所有選項。我正在使用typescript 2.5.3。

是否有任何方式,如打字稿配置,代碼更改或其他任何硬化代碼以避免這種情況?任何想法讚賞,我的目標是編寫穩定的代碼。

import * as React from'react'; import * as'ReactDOM from'react-dom';

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')) 

編輯:簡化問題

+1

你一定要明白,這不是打字稿,對不對? – Amit

+0

@Amit,現在你說,我知道,但是在提問的時候我沒有意識到。謝謝。那麼,任何關於去JSX - > TS - > JS的正確工作流程的想法是什麼? – zupa

+0

不,個人而言,我不喜歡正是因爲這個原因作出反應。我覺得這個語法尷尬和分心。 – Amit

回答

1

你會得到你正在尋找的編譯器投訴如果你記得通過propssuper()。這僅僅是延長React.Component的一部分,should always be done.

enter image description here

+0

非常感謝Mike,這就是它!你在你的幫助下完成了我的一天。 – 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個字符串。 – zupa