参数类型中属性名的奇怪Typescript语法



我在一个打字文件中遇到了下面的语法,我不认识它,也无法在文档中找到它。看起来groups参数应该是一个具有groupName属性的对象,但是我不理解用于属性名称的语法。有人能开导我吗?

export declare type CustomPatternMatcherFunc = (
  /**
   * The full input string.
   */
  text: string,
  /**
   * The offset at which to attempt a match
   */
  offset: number,
  /**
   * Previously scanned Tokens
   */
  tokens: IToken[],
  /**
   * Token Groups
   */
  groups: {
    [groupName: string]: IToken[] // <-- here
  }
) => CustomPatternMatcherReturn | RegExpExecArray | null

当然。给你:https://www.typescriptlang.org/docs/handbook/2/objects.html#index-signatures

但是让我快速解释一下它是关于什么的:

你可以声明一个"泛型"键在一个对象内,让我们说你想提供一个对象,你不知道如何调用键,例如在一个映射,你映射(因为我在不和机器人最近工作)命令为不和机器人的静态答案的映射,然后你知道,键应该是一个字符串,命令的名称,值应该是一个字符串,静态答案的命令。

现在,在声明类型时,您实际上并不知道键是如何命名的,但您始终知道键是字符串,值也是字符串。要声明这样的类型,可以使用索引签名:

type T = {[commandName: string]: string}

的语法可能会有些混乱,因为你分配了一个"name"键类型,但如果您有更复杂的类型,例如

,它就会派上用场

const obj = {key1: "test", key2: "test2"}
type ObjT = typeof obj
type T = {[key in keyof ObjT]: ObjT[key]}

这个例子有点没有意义,但是"name"你有一个类似于你要映射的键的类型,所以它是一次key1;然后ObjT[key]类似于ObjT["key1"],这是key1的值类型,在这个例子中是"test1",然后是"key2"。该类型本质上是{key1: "test1", key2: "test2} -正如我所说的,没有意义。

快速注意:对于我给出的第一个示例,有一种更快的语法可能被认为更干净:Record<string,string>。它本质上与我上面所做的相同,是一个具有字符串键和字符串值的对象。

最新更新