我正在将Typescript与React一起用于项目。主组件通过此接口获得通过状态。
interface MainState {
todos: Todo[];
hungry: Boolean;
editorState: EditorState; //this is from Facebook's draft js
}
但是,下面的代码(仅摘录)不会编译。
class Main extends React.Component<MainProps, MainState> {
constructor(props) {
super(props);
this.state = { todos: [], hungry: true, editorState: EditorState.createEmpty() };
}
onChange(editorState: EditorState) {
this.setState({
editorState: editorState
});
}
}
编译器抱怨说,在onChange
我仅尝试为一个属性设置状态的方法中,该属性todos
和该属性hungry
在type中丢失{ editorState: EditorState;}
。换句话说,我需要在onChange
函数中设置所有三个属性的状态,以使代码得以编译。为了使其编译,我需要做
onChange(editorState: EditorState){
this.setState({
todos: [],
hungry: false,
editorState: editorState
});
}
但目前没有理由在代码中设置todos
和hungry
属性。在打字稿/反应中仅对一个属性调用setState的正确方法是什么?
react的定义已更新,其签名setState
现在为:
setState<K extends keyof S>(state: Pick<S, K>, callback?: () => any): void;
凡Pick<S, K>
被内置其中在打字稿2.1添加类型:
type Pick<T, K extends keyof T> = {
[P in K]: T[P];
}
有关更多信息,请参见映射类型。
如果仍然存在此错误,则可能需要考虑更新您的反应定义。
我正面临着同样的事情。
我设法解决这个烦人的问题的两种方法是:
(1)投射/断言:
this.setState({
editorState: editorState
} as MainState);
(2)将接口字段声明为可选:
interface MainState {
todos?: Todo[];
hungry?: Boolean;
editorState?: EditorState;
}
如果有人有更好的解决方案,我将很高兴知道!
虽然这仍然是一个问题,但是有两个关于将解决此问题的新功能的讨论:
部分类型(现有类型的可选属性)
以及
Object.assign和React组件setState()的更准确键入
问题内容: 我希望能够实例化一个Typescript类,在运行时可以获取该类和构造函数的详细信息。我想编写的函数将包含类名和构造函数参数。 问题答案: 您可以尝试: 编辑 此版本可在TypeScript操场上使用,例如:
问题内容: 我想为我的纯功能组件定义,但出现类型错误: 我知道我可以这样写: 有没有更好的添加方法? 问题答案: 您可以这样输入: 然后,你可以写,而无需强制转换的类型(会)。
我一直在捕捉非数字时遇到问题。 我试过了,但抓不住。如果我让它捕获非数字,但不让用户再次尝试输入。。。它完全停止了我的代码。 这是我的密码:
问题内容: 我有一个JPA实体,其属性设置为 但是,当我在JBoss 6上进行部署时,该应用程序会抛出一条错误消息: 我使用Hibernate 3.5作为JPA 2.0实现。 我应该使用什么来引用外键列? 问题答案: 使用代替:
我使用json-schema,并希望只允许在此文件中声明的属性通过验证。例如,如果用户在他们的json对象中传递一个“名称”属性,它将失败这个模式,因为“名称”在这里没有作为属性列出。 是否有一些类似于“必需”的功能只允许列出的属性通过?
问题内容: 我有以下组成部分: 是否可以选择需要更新哪些状态属性及其值? 我已经试过了: 这样它就可以像这样使用: 但它不起作用(状态无法更新)。 问题答案: 您可以通过两种方式做到这一点: 或有点更高级: 假设是要更新的属性的名称。