2017-06-26 18 views
0

使用此代码时,我收到错误Property 'type' does not exist on type 'EventTarget'checked,valuename也是如此。React TypeScript 2.3 - > typesafe React Bootstrap FormControl onChange

继代码后,我可以看到FormEvent继承自SyntheticEvent,后者又有target: EventTarget。 EventTarget没有我之后的属性。如果我将event标记为anyevent: any),则代码完美无缺。我怎样才能解决这个问题?我尝试了一个正常的Html输入,然后通过将事件设置为React.ChangeEvent<HTMLInputElement>来工作。

handleChange(event: React.FormEvent<React.Component<ReactBootstrap.FormControlProps, {}>>) { 
    const target = event.target; 
    const value = target.type === 'checkbox' ? target.checked : target.value; 
    const name = target.name; 

    this.setState({ 
     [name]: value 
    }); 
} 
... 
<FormGroup controlId="Email"> 
    <Col componentClass={ControlLabel} sm={2}> 
     Email 
    </Col> 
    <Col sm={10}> 
     <FormControl name="email" type="email" value={this.state.email} onChange={(event) => this.handleChange(event)} placeholder="Email" /> 
    </Col> 
</FormGroup> 

与输入工作代码:

handleChange(event: React.ChangeEvent<HTMLInputElement>) { 
    ... 
} 

... 

<input 
name="email" 
type="email" 
value={this.state.email} 
onChange={(event) => this.handleChange(event)} /> 

回答

2

解决这样的:

handleChange(event: React.ChangeEvent<HTMLInputElement>) { 
    const target = event.target; 
    const value = target.type === 'checkbox' ? target.checked : target.value; 
    const name = target.name as any; 

    this.setState({ 
     [name]: value 
    }); 
} 

... 

<FormControl name="email" type="email" value={this.state.email} onChange={(event) => this.handleChange(event as any)} placeholder="Email" /> 
+0

什么的'onChange'事件处理程序使用的脂肪箭头(的好处,即'的onChange = { (event)=> this.handleChange(event as any)}')vs只是'onChange = {this.handleChange}'? –

+0

哎呀!好吧,我想我明白了为什么你不能使用第二个选项。根据TypeScript 2.X编译器,事件类型不兼容。 –

+0

我使用这个,因为箭头函数没有自己的'this'或'arguments binding'。 'this.setState'将无法正常工作。我可以使用绑定来实现相同的功能,但我认为这样更干净。 https://facebook.github.io/react/docs/handling-events.html – Ogglas