在我们使用pinia时会接受参数,一般来说是传递两个参数
setGlobalState(...args: ObjToKeyValArray<GlobalState>) {
this.$patch({ [args[0]]: args[1] });
}
例如此时传递的是globalStore.setGlobalState("token", "123");
那么此时的args就是["token","123"]
这里定义的ObjToKeyValArray如下
type ObjToKeyValArray<T> = {
[K in keyof T]: [K, T[K]];
}[keyof T];
GlobalState定义的ts类型如下
export interface GlobalState {
layout: LayoutType;
language: LanguageType;
maximize: boolean;
primary: string;
isDark: boolean;
isGrey: boolean;
isWeak: boolean;
asideInverted: boolean;
headerInverted: boolean;
isCollapse: boolean;
accordion: boolean;
breadcrumb: boolean;
breadcrumbIcon: boolean;
tabs: boolean;
tabsIcon: boolean;
footer: boolean;
token: string;
userInfo: any;
sysInfo: any;
socket: any;
personnelBoard: Person | null;
assemblySize: AssemblySizeType;
}
解释一下上方ts定义
这段 TypeScript 代码定义了一个类型别名 `ObjToKeyValArray<T>`,它将一个对象类型 `T` 转换为由键值对数组组成的元组数组类型。让我解释一下它是如何工作的:
1. `type ObjToKeyValArray<T>`:这部分定义了一个类型别名 `ObjToKeyValArray<T>`,它接受一个泛型参数 `T`,表示输入的对象类型。
2. `{ [K in keyof T]: [K, T[K]] }`:这是一个映射类型(Mapped Type)。`keyof T` 表示获取对象 `T` 的所有键的联合类型。`[K in keyof T]` 使用映射类型来遍历对象 `T` 的所有键,并为每个键创建一个新的属性。
3. 对于每个键 `K`,`[K, T[K]]` 表示一个由键和对应值组成的元组。这就是把对象的键值对转换为数组的操作。例如,如果对象 `T` 的类型是 `{ foo: string; bar: number }`,那么 `[K, T[K]]` 就会分别变成 `['foo', string]` 和 `['bar', number]`。
4. `[keyof T]`:这部分是为了获取映射类型 `{ [K in keyof T]: [K, T[K]] }` 中所有属性的联合类型,即所有键值对数组组成的数组类型。
综上所述,`ObjToKeyValArray<T>` 接受一个对象类型 `T`,并将其转换为由该对象的所有键值对组成的元组数组类型。