类型“null”不可分配给类型“HTMLInputElement”ReactJs

IT技术 reactjs typescript reference
2021-04-13 04:46:10

我正在尝试将数据与typescript一起引用到 reactJS 中。在执行此操作时,我收到以下错误

Type 'null' is not assignable to type 'HTMLInputElement'

请让我知道这里到底有什么不正确,我使用了 React https://reactjs.org/docs/refs-and-the-dom.html 中的文档, 但我认为我在这里做错了。以下是范围片段

  class Results extends React.Component<{}, any> {
  private textInput: HTMLInputElement;
  .......
  constructor(props: any) {
    super(props);

    this.state = { topics: [], isLoading: false };

    this.handleLogin = this.handleLogin.bind(this);
    }

     componentDidMount() {.....}

    handleLogin() {
    this.textInput.focus();
    var encodedValue = encodeURIComponent(this.textInput.value);
   .......
}

  render() {
    const {topics, isLoading} = this.state;

    if (isLoading) {
        return <p>Loading...</p>;
    }

    return (
        <div>
              <input ref={(thisInput) => {this.textInput = thisInput}} type="text" className="form-control" placeholder="Search"/>
              <div className="input-group-btn">     
                           <button className="btn btn-primary" type="button" onClick={this.handleLogin}>

   ...............

知道我在这里可能缺少什么吗?

3个回答

产生错误是因为类型定义说输入可以是nullHTMLInputElement

你可以"strict": false在你的tsconfig.json

或者您可以强制输入为HTMLInputElement类型

<input ref={thisInput => (this.textInput = thisInput as HTMLInputElement)} type="text" className="form-control" placeholder="Search" />

这种方式也是有效的(使用明确的赋值断言(typescript >= 2.7)

<input ref={thisInput => (this.textInput = thisInput!)} type="text" className="form-control" placeholder="Search" />
感谢您的建议,我使用了“thisInput as HTMLElement”的方法,但现在它给出了另一个错误。说 ..“'HTMLElement' 类型中缺少属性 'accept'”
2021-05-25 04:46:10
我的错,我没有注意到它是一个HTMLInputElement. 我已经更新了答案
2021-06-09 04:46:10
只是指出示例中的错字。HTMLEInputlement应该是HTMLInputElement@lleon
2021-06-09 04:46:10

这确实是由于您正确且值得称道的使用了:

"strict": "true"

其中设定了一些规则,包括所有重要的:

"strictNullChecks": "真"

处理潜在的空值

处理这个问题的正确方法是检查元素实际上不是空的,因为几乎所有用于查询元素的方法都可能无法找到。

在下面的示例中,if 语句充当类型保护,因此类型的HTMLElement | null范围缩小为仅HTMLElement

const elem = document.getElementById('test');

if (elem) {
  elem.innerHTML = 'Type here is HTMLElement, not null';
}

处理 HTML 元素类型

要将类型从 缩小HTMLElementHTMLInputElement,您可以采用“我知道更好”的方法并使用类型断言(使一类细微错误成为可能):

const example = <HTMLInputElement> elem;

或者您可以使用自定义类型保护来正确执行此操作,下面的示例将HTMLElement | null其范围缩小到HTMLInputElement它不为空,并且具有正确的标记名称:

function isInputElement(elem: HTMLElement | null): elem is HTMLInputElement {
  if (!elem) {
    // null
    return false;
  }

  return (elem.tagName === 'INPUT')
}

更新后的类型保护调用如下所示:

const elem = document.getElementById('test');

if (isInputElement(elem)) {
  console.log(elem.value);
}
“值得称赞”......我个人认为无论如何它都是一个杯子游戏+1
2021-06-18 04:46:10

我在使用 ref 之前使用 if 条件解决了react

  if (this.ref.current) {

      this.editor = monaco.editor.create(
          this.ref.current,
          { automaticLayout: true }
      );

      monaco.editor.setTheme('vs-dark');
      this.editor.setModel(this.model);
  }