不确定这是否可能…但是我正在尝试使用接口的键将接口转换为元组。
接口:
interface User {
_id: string;
first_name: string;
last_name: string;
address: {
firstLine: string;
secondLine: string;
state: string;
zip: string;
details: {
active: boolean;
primary: boolean;
}
}
}
新的类型应该允许我创建这样一个数组:
const args: UserKeysTuple = ["_id", ["address", ["zip", "details": ["active"]]];
顺序不重要
在某种程度上使用映射类型是可能的:
type KeyTuple<T> = {
[Key in keyof T]:
T[Key] extends object ?
T[Key] extends Date ?
Key :
NestedTuple<T, Key> :
Key
}[keyof T][]
type NestedTuple<T, K extends keyof T> = [K, KeyTuple<T[K]>];
type UserKeysTuple = KeyTuple<User>;
这有一些限制,其中包括:
- 这是一个烂摊子;参见
Date
的特殊情况,因为它是一个对象,但通常被视为原语 - 这个不检查重复,所以一个键可以被列出多次而没有错误 游乐场