我在一个打字文件中遇到了下面的语法,我不认识它,也无法在文档中找到它。看起来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>
。它本质上与我上面所做的相同,是一个具有字符串键和字符串值的对象。