我目前正在做一个简单的反应应用程序。
这是我的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
来修复它,但仍然出现相同的错误,我做错了什么以及为什么打字稿就像这样。我对此非常陌生,通过这个例子,我正在尝试udnertand反应如何一起工作。
答案 0 :(得分:5)
仅通过声明一个完全传递给组件的对象,我解决了很多类型的错误(Microsoft closed issue。这些错误类型为{<3>},不能分配给'IntrinsicAttributes和IntrinsicClassAttributes 类型。
>以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>
);
}
答案 1 :(得分:3)
您需要做的是正确声明组件类型以包括道具类型:
interface IMyProps {
myValue: boolean,
}
const MyComponent: React.FC<IMyProps> = (props: IMyProps) => {
...
}
export default MyComponent;
然后您可以将其用作:
import MyComponent from '../MyComponent';
...
return <MyComponent myValue={true} />
瞧,打字稿很高兴。这样做的好处是,打字稿现在正在检查是否仅传递它们在props接口中实际存在的参数(可以防止输入错误等)。
对于标准组件,它将类似于(在Swapnill的示例中已经存在):
class MyComponent extends React.Component<IMyProps, IMyState>{
constructor(props: IMyProps){}
}
export default MyComponent;
答案 2 :(得分:2)
也有同样的问题。
您已在App类的Prop接口上定义了名为term的成员,但在创建App元素时未提供值。
尝试以下操作:
ReactDOM.render(<App term="Foo" />, document.getElementById('root') as HTMLElement);
答案 3 :(得分:2)
问题是您没有导出界面,应该始终导出界面道具。所以:
export interface Props {
term: string;
}
是解决方案。
答案 4 :(得分:1)
此处的问题与您的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
来提供类型,但我强烈建议您不要遵循这条“邪恶”路径,如果您真的想利用打字稿。在你的情况下,似乎你没有指定状态类型并使用它,修复它将解决这个问题。
编辑1
在界面SearchBarProps
中,optionalArgument
成为可选参数,因为我们在其前面添加了问号?
,因此<SearchBar term='some term' />
即使您不知道也不会显示任何错误t明确通过optionalArgument
希望这能解决你的问题!
答案 5 :(得分:0)
我也面临着同样的问题。添加以下代码以使用.tsx组件。
export interface Props {
term: string;
}
或
export type Props = {
term ?: string;
}
我不知道确切原因,但是我认为打字稿在编译阶段会标记类型错误。让我知道它是否对您有用。
答案 6 :(得分:0)
我并不为此感到骄傲,但是考虑到该线程中的其他解决方案,这似乎很公平。
此示例显示了@react-native-community/slider
的自定义版本,具有一些默认属性,但能够从外部接收(并覆盖):
function CustomSlider(props: SliderProps) {
return (
<Slider
style={{ width: '100%', height: 40, marginTop: 12 }}
minimumValue={0}
minimumTrackTintColor="#000000"
maximumTrackTintColor="#000000"
{...(props as any)}
/>
);
}