当前位置: 首页 > 面试题库 >

挑 ~~使用动态/计算键键入~~

宋昕
2023-03-14
问题内容

最新的@types/reactv15.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"

我无法找到一个解决方案,比拥有一个单独的其他updateNameupdateAge功能。有谁知道如何Pick与动态键值一起使用?


问题答案:

因此,在进行了更多研究之后,我可以提供一些有关上述代码中发生的情况的上下文。

当你这样做const name = 'Bob'变量的类型name'Bob' 不是
字符串。但是,如果你更换constletlet name = 'Bob')的变量name将是类型string

这个概念称为“扩大”。基本上,这意味着类型系统尝试尽可能明确。由于const无法重新分配,TypeScript可以推断出确切的类型。let语句可以重新分配。因此,TypeScript将string(在上面的示例中)推断为的类型name

也会发生同样的情况const key = e.currentTarget.name as keyof Personkey将是(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||