私は現在、単純な反応アプリケーションを作成しています。これは私のindex.tsx
です
import * as React from 'react';
import * as ReactDOM from 'react-dom';
import App from './components/App';
import registerServiceWorker from './registerServiceWorker';
ReactDOM.render(
<App />,
document.getElementById('root') as HTMLElement
);
registerServiceWorker();
ここに私のapp.tsx
があります
import * as React from 'react';
import SearchBar from '../containers/price_search_bar';
interface Props {
term: string;
}
class App extends React.Component<Props> {
// tslint:disable-next-line:typedef
constructor(props) {
super(props);
this.state = {term: '' };
}
render() {
return (
<div className="App">
<div className="App-header">
<h2>Welcome to React</h2>
</div>
<p className="App-intro">
this is my application.
</p>
<div>
<form>
<SearchBar term={this.props.term} />
</form>
</div>
</div>
);
}
}
export default App;
また、私の検索バーコンテナ:
import * as React from 'react';
interface Props {
term: string;
}
// tslint:disable-next-line:no-any
class SearchBar extends React.Component<Props> {
// tslint:disable-next-line:typedef
constructor(props) {
super(props);
this.state = { term: '' };
}
public render() {
return(
<form>
<input
placeholder="search for base budget"
className="form-control"
value={this.props.term}
/>
<span className="input-group-btn" >
<button type="submit" className="btn btn-secondary" >
Submit
</button>
</span>
</form>
);
}
}
export default SearchBar;
そして最後に私のtsconfig.json
があります:
{
"compilerOptions": {
"outDir": "build/dist",
"module": "esnext",
"target": "es5",
"lib": ["es6", "dom"],
"sourceMap": true,
"allowJs": true,
"jsx": "react",
"moduleResolution": "node",
"rootDir": "src",
"forceConsistentCasingInFileNames": true,
"noImplicitReturns": true,
"noImplicitThis": true,
"noImplicitAny": false,
"strictNullChecks": true,
"suppressImplicitAnyIndexErrors": true,
"typeRoots": [
"node_modules/@types"
],
"noUnusedLocals": true
},
"exclude": [
"node_modules",
"build",
"scripts",
"acceptance-tests",
"webpack",
"jest",
"src/setupTests.ts"
]
}
エラーの後、さまざまなエラーが発生し続け、1つのエラーを修正するたびに別のエラーが表示されます。これは最新のエラーです。
./src/index.tsx
(7,3): error TS2322: Type '{}' is not assignable to type 'IntrinsicAttributes & IntrinsicClassAttributes<App> & Readonly<{ children?: ReactNode; }> & Reado...'.
Type '{}' is not assignable to type 'Readonly<Props>'.
Property 'term' is missing in type '{}'.
tsconfig.json
を変更して修正しようとしましたが、同じエラーが表示されます。何が間違っているのか、なぜTypeScriptがこのように動いているのですか。私はこれに非常に新しく、この例によって、反応がどのようにすべて一緒に機能するかを判断しようとしています。
これと同じ問題が発生しました。
AppクラスのPropインターフェイスで定義されたtermというメンバーがありますが、App要素を作成するときに値を提供していません。
以下を試してください:
ReactDOM.render(<App term="Foo" />, document.getElementById('root') as HTMLElement);
ここでの問題は、tslintの設定にありません。次のコードスニペットを見てください。
interface SearchBarProps {
term: string;
optionalArgument?: string;
}
interface SearchBarState{
something: number;
}
class SearchBar extends React.Component<SearchBarProps, SearchBarState> {
constructor(props: SearchBarProps){
super(props);
this.state = {
something: 23
};
}
render() {
const {something} = this.state;
return (
<div>{something}</div>
)
}
}
class SearchBar extends React.Component<SearchBarProps, SearchBarState> {
で、SearchBarProps
とSearchBarState
はそれぞれ、コンポーネントSearchBar
の予想される小道具のタイプと状態のタイプを示します。 TypeScriptを使用する場合は、propTypesとstateTypeを指定する必要があります。
キーワードany
を使用して型を指定することを避けることができますが、TypeScriptの使用を本当に活用したい場合は、この「悪」のパスをたどらないことを強くお勧めします。あなたの場合、状態のタイプを指定して使用していないようです。それを修正すると、この問題が解決します。
編集1
インターフェイスSearchBarProps
で、?
の前に疑問符<SearchBar term='some term' />
を追加すると、optionalArgument
はオプションの引数になります。 optionalArgument
を明示的に渡さない場合でもエラーが発生します。
これで問題が解決することを願っています!
私は多くの「「IntrinsicAttributes&IntrinsicClassAttributes」タイプに割り当てられない」タイプのエラー( Microsoftが発行した問題 )を解決しましたコンポーネントに完全に渡されるオブジェクトを宣言します。
OPの例では、term={this.props.term}
を使用する代わりに、{...searchBarProps}
を使用して動作させます。
render() {
const searchBarProps = { // make sure all required component's inputs/Props keys&types match
term: this.props.term
}
return (
<div className="App">
...
<div>
<form>
<SearchBar {...searchBarProps} />
</form>
</div>
</div>
);
}
私も同じ問題に直面しました。以下のコードを追加して、.tsxコンポーネントを操作します。
export interface Props {
term: string;
}
または
export type Props = {
term ?: string;
}
正確な理由は分かりませんが、TypeScriptはコンパイル段階で型エラーにフラグを立てると思います。うまくいくかどうか教えてください。