第二深度界面对象的键入键



在第三方库(我无法更改(上,我有以下接口:

interface MyInterface {
x: {
a: 1,
b: 2,
c: 3,
},
y: {
d: 4,
e: 5,
f: 6,
},
z: {
g: 7,
h: 8,
i: 9,
},
}

我想创建一个类型(Values2ndDepth(来描述接口中所有对象的所有键的并集,因此将强制执行以下操作:

let key: Values2ndDepth<MyInterface>;
key = 'a'; // ok
key = 'i'; // ok
key = 'j'; // error - as doesn't exist in the above.

我的一些尝试:

type Values2ndDepth<T extends object> = keyof T[keyof T];
type Values2ndDepth<T extends object> = T extends {[k: string]: (infer R)} ? keyof R : never;
type Values2ndDepth<T extends object> = T extends Record<string, infer R> ? keyof R : never;
type Values2ndDepth<T extends object, K extends keyof T = keyof T> = T[K] extends object ? keyof T[K] : never;

过了一段时间,我找到了解决方案!

type Values2ndDepth<T extends object, K extends keyof T = keyof T> =
K extends keyof T ? T[K] extends object ? keyof T[K] : never : never;
  • 确保K描述了T的密钥
  • 确保T[K]的值是另一个对象
  • T[K]的密钥

还有其他解决方案吗?也许是更优雅的?

最新更新