最新的@types/react
(v15.0.6
)利用TypeScript 2.1中添加的功能setState
,即Pick<S, K>
。这是一件好事,因为现在的输入是正确的,因为在更新之前,“不知道”的输入setState
是合并的this.state
,而不是替换它。
同样,使用Pick
使得setState
功能在允许输入方面非常严格。无法再将state
未在组件定义中定义的属性添加到中(的第二个泛型)React.Component
。
但是,也很难定义动态更新处理程序。例如:
import * as React from 'react';
interface Person {
name: string;
age: number|undefined;
}
export default class PersonComponent extends React.Component<void, Person> {
constructor(props:any) {
super(props);
this.state = {
name: '',
age: undefined
};
this.handleUpdate = this.handleUpdate.bind(this);
}
handleUpdate (e:React.SyntheticEvent<HTMLInputElement>) {
const key = e.currentTarget.name as keyof Person;
const value = e.currentTarget.value;
this.setState({ [key]: value });
}
render() {
return (
<form>
<input type="text" name="name" value={this.state.name} onChange={this.handleUpdate} />
<input type="text" name="age" value={this.state.age} onChange={this.handleUpdate} />
</form>
);
}
}
该setState
函数将引发以下错误
[ts] Argument of type '{ [x: string]: string; }' is not assignable
to parameter of type 'Pick<Person, "name" | "age">'.
Property 'name' is missing in type '{ [x: string]: string; }'.
即使类型key
是"name" | "age"
。
我无法找到一个解决方案,比拥有一个单独的其他updateName
和updateAge
功能。有谁知道如何Pick
与动态键值一起使用?
因此,在进行了更多研究之后,我可以提供一些有关上述代码中发生的情况的上下文。
当你这样做const name = 'Bob'
的变量的类型name
是'Bob'
不是
字符串。但是,如果你更换const
了let
(let name = 'Bob'
)的变量name
将是类型string
。
这个概念称为“扩大”。基本上,这意味着类型系统尝试尽可能明确。由于const
无法重新分配,TypeScript可以推断出确切的类型。let
语句可以重新分配。因此,TypeScript将string
(在上面的示例中)推断为的类型name
。
也会发生同样的情况const key = e.currentTarget.name as keyof Person
。key
将是(union)类型"name"|"age"
,这正是我们想要的。 但是 在表达式this.setState({ [key]: value });
变量key
中(错误地)将其扩展为string
。
tl; dr;
看来TypeScript中有错误。我将该问题发布到了Github仓库中,TypeScript团队正在调查该问题。:)
作为临时解决方法,您可以执行以下操作:
this.setState({ [key as any]: value });
我已经开始测试Firebase,我不知道关于索引的一件事。我正在根据我在Firebase上读到的内容创建一个结构--类似于用户和组的示例。JSON树如下所示: 谢了。
问题内容: 我有以下代码片段: 我将如何使用上面的代码来设置每个键的状态。 这是初始状态: 问题答案: 基本规则是: 我们可以使用 计算属性名称 概念,并使用任何 js表达式 动态计算对象属性名称。为此,我们需要将表达式放在里面。 像这样: 解: 按照您发布的代码,你需要把里面,就像这样: 或者我们可以先创建该对象,然后将该对象传递给函数,如下所示: 另外,您不需要。您可以直接使用新值更新状态变量
这是初始状态:
问题内容: 我有一个像这样的字符串: 我把它变成一个数组: 该数组可以具有任意数量的元素,例如1、2、5等。 如何为多维数组分配一个特定的值,但是如何使用上面创建的I标识要插入的位置? 喜欢: 抱歉,这个问题令人困惑,但是我不知道如何更好地解释它 问题答案: 这是不平凡的,因为您想嵌套,但是应该这样:
我目前正在寻找一种动态组装config-keys(回退处理)的方法,然后在我们的microprofile-config.properties文件中查找这些。这样的文件可能如下所示: 因此,当存在客户和子客户时,使用on 我得到这个问题的原因是我想使用注释,所以没有ConfigProvider.getConfig()。这意味着我必须在自定义的中组装动态配置键。 我知道ConfigSources是在服
这个问题要求在键盘上键入字符串所需的总时间,用一个手指表示为二维字符矩阵。 输入: 第一行包含n和m作为输入,表示键盘矩阵的维数 接下来的n行包含m个字符,每个字符表示键盘中的字符 下一行将包含字符串S 输出: 说明:手指最初位于键盘的第一个符号,因此按下该键所需的时间为0。之后,新键位于1,1,因此总时间为|1-0||1-0|即2。现在第三个键位于位置1,2,因此移动到该键的总时间为|2-1||