【问题标题】:What does the type { [x: string]: any } mean? [duplicate]类型 { [x: string]: any } 是什么意思? [复制]
【发布时间】:2019-12-06 22:24:03
【问题描述】:

我读了这个article,但我看不懂签名:

type FuncWithOneObjectArgument<P extends { [x: string]: any }, R> = (props: P) => R;

{ [x: string]: any} 是什么意思?我想它是一个字典,其值为any 类型和键......什么?列表?字符串?! x 是什么意思?我试图删除x,但它会导致语法错误...如何读取类型?

【问题讨论】:

  • 哦,天哪...所以它是一个使用索引方法获取string 并返回any 的对象?
  • 它是一个具有字符串 properties 的对象,每个属性的值都是any 类型。例如{"name": "Alice", "age": 42, "boss": {"name": "Bob"}}
  • TS 文档中有关索引类型的更多信息:interfacesadvanced types

标签: typescript


【解决方案1】:

它定义了对象的键可以是什么。在您的情况下,您的密钥只能是string 类型。你的价值观可以是任何东西。

这背后的原因是,在打字稿中,您可以定义一个具有特定属性的对象:

type obj = {property1: string, property2: any};

这会创建一种对象类型,必须同时具有两个属性才能有效。

因此,没有直观的方法来定义键类型。 这就是为什么我们使用方括号。

type obj = {[keys: string]: any};

对于像 stringint 这样的类型,它似乎毫无意义,但你可以使用联合类型运算符来定义你的键可以是什么:

type obj = {[keys in 'key1'|'key2'|'key3']: any};

此合成器表示您的密钥只能是 key1key2key3

【讨论】:

  • 那么为什么我不能只写{ string: any } 呢?为什么我需要[] 括号和这个x
  • 因为,您没有设置键的值,而是定义了一个具有属性 string 的对象。
  • type obj = {[keys: 'key1'|'key2'|'key3']: any}; 至少在 TypeScript v3.6.3 中无效。定义映射类型的正确方法是type obj = { [keys in 'key1' | 'key2' | 'key3']: any; };
猜你喜欢
  • 1970-01-01
  • 2017-02-01
  • 2011-07-03
  • 2013-07-13
  • 1970-01-01
  • 2012-11-10
  • 1970-01-01
  • 2020-05-12
  • 2016-07-18
相关资源
最近更新 更多