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

后端 未结 3 1537
粉色の甜心
粉色の甜心 2021-02-19 01:28

I am trying to reference data into reactJS along with typescript. While doing this I am getting below error

Type \'null\' is not assignable to type \'HTMLInputEl         


        
相关标签:
3条回答
  • 2021-02-19 01:30

    The error is produced becase the types definitions says input can be null or a HTMLInputElement

    You can set "strict": false in your tsconfig.json

    Or you can force the input to be HTMLInputElement type

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

    This way is also valid (using definite assignment assertions (typescript >= 2.7))

    <input ref={thisInput => (this.textInput = thisInput!)} type="text" className="form-control" placeholder="Search" />
    
    0 讨论(0)
  • 2021-02-19 01:45

    This is, indeed, caused by you correct and commendable use of:

    "strict": "true"
    

    Which sets a few rules including the all important:

    "strictNullChecks": "true"

    Handling Potential Nulls

    The correct way to handle this is to check that the element isn't in fact null, because almost every method you use to query an element may fail to find one.

    In the example below, the if-statement acts as a type guard, so the type of HTMLElement | null is narrowed to just HTMLElement.

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

    Handling HTML Element Types

    To narrow the type from HTMLElement to HTMLInputElement, you can take an "I know better" approach and use a type assertion (making a class of subtle errors possible):

    const example = <HTMLInputElement> elem;
    

    Or you can use a custom type guard to do it properly, the below example takes HTMLElement | null and narrows it to HTMLInputElement if it isn't null, and has the correct tag name:

    function isInputElement(elem: HTMLElement | null): elem is HTMLInputElement {
      if (!elem) {
        // null
        return false;
      }
    
      return (elem.tagName === 'INPUT')
    }
    

    The updated type guard call looks like this:

    const elem = document.getElementById('test');
    
    if (isInputElement(elem)) {
      console.log(elem.value);
    }
    
    0 讨论(0)
  • 2021-02-19 01:54

    I solved in react using if condition before i use ref

      if (this.ref.current) {
    
          this.editor = monaco.editor.create(
              this.ref.current,
              { automaticLayout: true }
          );
    
          monaco.editor.setTheme('vs-dark');
          this.editor.setModel(this.model);
      }
    
    0 讨论(0)
提交回复
热议问题