type GetNamespaces<M> = {
[K in keyof M]: M[K] extends { namespace: string }
? M[K]['namespace']
: never;
}[keyof M];的使用场景
这个 GetNamespaces<M>
类型可以用于从一个对象类型 M
中获取具有 namespace
属性的子属性的集合。让我们来解释一下它的使用场景:
假设我们有一个对象类型 M
,其中包含多个属性,每个属性都是一个对象,而这些对象可能具有 namespace
属性。现在我们想要从这些对象中提取所有具有 namespace
属性的子属性的集合。
下面是一个示例,演示了如何使用 GetNamespaces<M>
:
// 定义一个接口,包含多个属性,每个属性都有一个 namespace 属性
interface ModuleMap {
user: {
namespace: 'user';
// 其他属性...
};
post: {
namespace: 'post';
// 其他属性...
};
comment: {
// 没有 namespace 属性
// 其他属性...
};
}
// 使用 GetNamespaces<M> 来获取具有 namespace 属性的子属性的集合
type Namespaces = GetNamespaces<ModuleMap>;
// 输出 Namespaces 类型
// 类型为:"user" | "post"
console.log(typeof ({} as Namespaces));
// 定义一个函数,接受一个 namespace 参数,表示所需的模块的命名空间
function loadModule(namespace: Namespaces) {
// 加载指定 namespace 的模块...
}
// 使用 loadModule 函数加载模块
loadModule('user'); // 可以正常调用,因为'user'是有效的命名空间
loadModule('post'); // 可以正常调用,因为'post'是有效的命名空间
// loadModule('comment'); // 这行代码会报错,因为'comment'不是有效的命名空间
在这个示例中,ModuleMap
是一个包含多个属性的接口,每个属性都是一个对象,可能包含一个 namespace
属性。通过使用 GetNamespaces<M>
,我们从 ModuleMap
中提取出所有具有 namespace
属性的子属性的集合,并将其赋值给 Namespaces
类型。最终,我们可以使用 Namespaces
类型来定义函数参数,确保只能传递有效的命名空间。