即使使用if语句,对象也可能未定义

时间:2019-11-01 07:22:42

标签: reactjs typescript

我遇到了打字稿错误if (this.state.uploadFile !== undefined) { const terms = this.state.uploadFile; // Logic } 。我正在使用Typescript创建SPA,并且在其中一个页面上,则可以上传文件。后端已经被写入,因此状态存储的文件将被制成服务器端读取的二进制代码。文件setstate设置为undefined。

我已经进行了几次搜索,但是解决方案似乎对我不起作用。第一个解决方案是创建一个if语句:

const terms = this.state!.uploadFile;

每当逻辑部分使用术语时,就会出现上述错误。

另一种解决方案是告诉编译器它已明确定义:

const terms = this.state.termSheet!;

这仍然引发相同的错误,并认为我可能已经放置了!在错误的位置,但是当我将其移至terms.getAsBinary()时,在调用Property 'getAsBinary' does not exist on type 'never'时会导致新错误,我收到错误// Imports class SubmitIssue extends React.Component<StylesProps> { state = { alert: false, amount: '', uploadFile: undefined, verify: false, } handleAmountChange(e) { this.setState({ amount: e.target.value }); } handleFileChange(e) { this.setState({ uploadFile: e.target.files[0] }); } handleVerifyChange() { this.setState({ verify: !this.state.verify }); } handleClick() { const config = { headers: { 'Content-Type': 'multipart/form-data' } }; const bodyFormData = new FormData(); bodyFormData.set('Amount', this.state.amount); bodyFormData.set('uploadFile', this.state.termSheet.getAsBinary()); bodyFormData.set('Verify', this.state.verify.toString()); axios.post( `${process.env.API_URL}RegisterIssue/Create`, bodyFormData, config ).then(res => { console.log(res); this.setState({ alert: true }, function() { this.sendData(); }); }).catch((error) => { console.log(error); }) } sendData() { const alertState = this.state.alert; this.props.parentAlertCallback(alertState); } render() { return ( // Design ); } } export default withStyles(styles)(SubmitIssue);

上下文中的代码

ArrayList<String> myList = new ArrayList<String>() {

    @Override
    public boolean remove(String str) {
      //If you want, you can throw Unsupported operation exception also.
      return false;
    }
  };

因此,我对于处理此错误的正确方法有些困惑。

1 个答案:

答案 0 :(得分:1)

这是因为您仅检查state.uploadFile而使用state.termSheet。 有两种可能的解决方案:

您设置了默认值(如果未定义terms):

const terms = this.state.termSheet ? this.state.termSheet : defaultValue;

或者您也检查if语句中的术语:

if (this.state.uploadFile && this.state.termSheet)