Тип '{}' не присваивается типу 'IntrinsicAttributes & IntrinsicClassAttributes
В настоящее время я делаю простое приложение для реагирования. это мой 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"
]
}
Я получаю разные ошибки после ошибок, и когда я исправляю одну ошибку, появляется другая, я не уверен, что я сделал, чтобы заставить ее вести себя так. Это последняя ошибка:
./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
но та же ошибка все еще появляется, что я делаю неправильно, и почему машинописный текст бахирует вот так. Я очень новичок в этом, и на этом примере я пытаюсь решить, как реагируют все вместе.
Ответы
Ответ 1
Просто эта же проблема.
У вас есть член, называемый термином, определенным в Prop inteface для вашего класса App, но вы не предоставляете значение при создании своего элемента App.
Попробуйте следующее:
ReactDOM.render(<App term="Foo" />, document.getElementById('root') as HTMLElement);
Ответ 2
Проблема здесь не в настройках 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
соответственно. Вы должны указывать propTypes и stateType при использовании машинописного текста.
Вы можете не давать тип с помощью ключевого слова any
, но я настоятельно рекомендую вам не следовать этому "злому" пути, если вы действительно хотите воспользоваться преимуществами использования машинописи. В вашем случае кажется, что вы не указали тип состояния и использовали его, исправление, которое решит эту проблему.
Редактировать 1
В интерфейсе SearchBarProps
optionalArgument
становится необязательным аргументом при добавлении вопросительного знака ?
перед ним, поэтому <SearchBar term='some term'/>
не будет показывать никаких ошибок, даже если вы не передадите optionalArgument
аргумент явно.
Надеюсь, это решает вашу проблему!
Ответ 3
Я тоже столкнулся с той же проблемой. Добавьте приведенный ниже код для работы с компонентами .tsx.
export interface Props {
term: string;
}
или же
export type Props = {
term ?: string;
}
Я не знаю точную причину, но я думаю, что typcript помечает ошибку типа во время фазы компиляции. Дайте мне знать, если это работает для вас.