reactjs - 使用 typescript react 在构造函数中声明一个属性

标签 reactjs typescript

从 draft-js 文档中,可以(在 vanilla React 中,没有 typescript )设置 Draft-js 环境,注意 onChange 属性可以直接在构造函数中声明:

import React from 'react';
import ReactDOM from 'react-dom';
import {Editor, EditorState} from 'draft-js';

class MyEditor extends React.Component {
  constructor(props) {
    super(props);
    this.state = {editorState: EditorState.createEmpty()};
    this.onChange = (editorState) => this.setState({editorState});
  }
  render() {
    const {editorState} = this.state;
    return <Editor editorState={editorState} onChange={this.onChange} />;
  }
}

但是,当我尝试对 Typescript/React(下面的代码)执行相同操作时,出现此错误

错误 TS2339:属性“onChange”在类型“Main”上不存在。

class Main extends React.Component<MainProps, MainState> {

    constructor(props) {
    super(props);
    this.state = { todos: [], editorState: EditorState.createEmpty() };
    this.onChange = (editorState) => this.setState({ editorState });
  }

我还尝试将 onChange 作为属性添加到 props

interface MainProps {
    model: Model;
    onChange: Function;
}

在 typescript/react 中声明这样一个函数属性的合适方法是什么?

最佳答案

试试这个:

class Main extends React.Component<MainProps, MainState> {
    constructor(props) {
        super(props);
        this.state = { todos: [], editorState: EditorState.createEmpty() };
        this.onChange = (editorState) => this.setState({ editorState });
    }

    onChange: (state: MainState) => void;

}

我还没有测试过,但我认为它应该可以工作。


编辑

是的,那里有个问题我没有注意到,应该是:

class Main extends React.Component<MainProps, MainState> {
    constructor(props) {
        super(props);

        this.state = { todos: [], editorState: EditorState.createEmpty() };
        this.onChange = (editorState) => this.setState({
            editorState: editorState
        } as MainState);
    }

    onChange: (state: MainState) => void;

}

type assertion如果 todos 属性不是可选的,则需要 (as MainState),如果它是可选的 (todos?: any[]) 则有不需要断言。

至于似乎与onChange 定义重复的部分,在Mixins part of the typescript docs 中有简要说明。 ,但在您的示例中,类中的定义:

onChange: (state: MainState) => void;

让编译器知道 Main 的实例有一个名为 onChange 的方法,它接收一个 MainState 并返回 void.
但是这个方法的实现只有在ctor中创建实例时才会赋值:

this.onChange = (editorState) => this.setState({ editorState });

如果缺少定义,则 ctor 中的赋值将产生编译错误:property 'onChange' does not exist on type 'Main'

关于reactjs - 使用 typescript react 在构造函数中声明一个属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37302382/

相关文章:

javascript - 验证表单中的非法字符

javascript - 当用户在 Angular 6 中键入时更改输入字段文本

angular - TypeScript getter setter 约定

javascript - TS |元素隐式具有 'any' 类型,因为类型 'string' 的表达式不能用于索引类型 'Record<SecurityMode, boolean>'

javascript - 如何在 ReactJS 中使列表中的项目可点击

reactjs - NEXT JS - 如何删除查询参数?

reactjs - Material UI - 如何更改 FormControlLabel 中标签的字体大小

typescript - typescript 中的 never 和 void 有什么区别?

javascript - RxJS - 如何共享昂贵的 observable 的输出,但如果在 N 秒后再次请求它,如何重新运行该 observable?

javascript - 从异步函数获取数据到另一个函数 React JS