搜索

Typescript 获取对象的所有键

发布网友 发布时间:1天前

我来回答

1个回答

热心网友 时间:2分钟前

在 TypeScript 中,理解和实现获取嵌套对象所有键的类型是一个挑战。基本的 keyof 方法适用于对象的第一层级,但针对嵌套结构,我们需要更复杂的解决方案。本文旨在展示如何构建一个递归类型,实现这一目标。

首先,让我们通过一个例子来深入理解需求。假设我们有这样一个对象:

typescript
const obj = {
name: "John",
details: {
age: 30,
address: {
city: "New York",
postalCode: "10001"
}
}
};

要获取此对象及所有嵌套对象中的键,我们需要一个可以递归遍历所有层级并收集键的类型。这涉及复杂性,尤其是对于多层嵌套结构。

解决这一问题的方法是定义一个递归类型。TypeScript 允许通过交叉类型实现这种递归定义。交叉类型是一种类型,它表示一个值具有交叉类型中所有类型的所有属性。

我们定义了一个名为 DeepKeys 的递归类型。这个类型检查输入类型 T 是否为对象。如果是,它将创建一个新对象,包含与原始对象相同键,但嵌套对象的键以字符串形式表示。如果 T 不是对象,则返回空字符串。以下是一个实现示例:

typescript
type DeepKeys =
T extends object
? {[K in keyof T]: K extends string | number ? `${K}.${DeepKeys<Extract` : never}
: never;

这个类型定义将对象分解为键和嵌套对象。每个键与递归调用 DeepKeys 的嵌套对象键连接。对于非字符串和非数字键,返回 never,以确保键的有效性。

定义类型后,我们可以轻松地获取任何带有嵌套对象的对象的键。下面是一个使用 DeepKeys 的方法示例:

typescript
function getAllKeys(obj: any): DeepKeys {
return Object.keys(obj) as DeepKeys;
}

const keys = getAllKeys(obj);
console.log(keys);

请注意,DeepKeys 类型存在一些。对象深度无限时,类型定义可能引发栈溢出错误。此外,对于具有多层嵌套的对象,结果类型可能非常复杂,可能导致处理难度增加。

总之,本文探讨了如何通过递归类型在 TypeScript 中获取对象及其所有嵌套对象的键。通过 DeepKeys 类型,我们可以实现这一目标,但需要考虑到类型定义的和复杂性。
声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
Top