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}>
...............
ここで何が欠けているのでしょうか?
入力はnull
またはHTMLInputElement
である可能性があると型定義で示されているため、エラーが生成されます
"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" />
これは、実際、次の正しい使用と称賛に値する使用が原因です。
"strict": "true"
すべて重要なものを含むいくつかのルールを設定します:
「strictNullChecks」:「true」
これを処理する正しい方法は、要素が実際にnullでないことを確認することです。これは、要素を照会するために使用するほとんどすべてのメソッドが1つの検索に失敗する可能性があるためです。
次の例では、ifステートメントはタイプガードとして機能するため、HTMLElement | null
はHTMLElement
に絞り込まれます。
const elem = document.getElementById('test');
if (elem) {
elem.innerHTML = 'Type here is HTMLElement, not null';
}
タイプをHTMLElement
からHTMLInputElement
に絞り込むには、「I know better」アプローチを使用し、タイプアサーションを使用します(微妙なエラーのクラスを可能にします)。
const example = <HTMLInputElement> elem;
または、カスタムタイプガードを使用して適切に行うことができます。以下の例ではHTMLElement | null
そして、それが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);
}
私はrefを使用する前にif条件を使用して反応することで解決しました
if (this.ref.current) {
this.editor = monaco.editor.create(
this.ref.current,
{ automaticLayout: true }
);
monaco.editor.setTheme('vs-dark');
this.editor.setModel(this.model);
}