首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在typescript中从嵌套对象的属性中获取类型

在TypeScript中,可以使用索引类型和条件类型来从嵌套对象的属性中获取类型。下面是一个示例:

代码语言:txt
复制
type DeepKeyOf<T> = T extends object ? {
  [K in keyof T]: K | `${K & string}.${DeepKeyOf<T[K]> & string}`
}[keyof T] : never;

function getNestedType<T, K extends DeepKeyOf<T>>(obj: T, key: K): K extends `${infer P}.${infer R}` ? (P extends keyof T ? (T[P] extends object ? DeepKeyOf<T[P]> : never) : never) : (key extends keyof T ? T[key] : never) {
  const keys = key.split('.') as (keyof T)[];

  let result: any = obj;
  for (const k of keys) {
    result = result[k];
  }

  return result;
}

使用示例:

代码语言:txt
复制
interface Person {
  name: string;
  age: number;
  address: {
    city: string;
    postalCode: string;
  };
}

const person: Person = {
  name: "John",
  age: 30,
  address: {
    city: "New York",
    postalCode: "12345"
  }
};

const name: string = getNestedType(person, "name"); // "John"
const city: string = getNestedType(person, "address.city"); // "New York"
const postalCode: string = getNestedType(person, "address.postalCode"); // "12345"
const invalidKey: never = getNestedType(person, "invalidKey"); // Error: Argument of type '"invalidKey"' is not assignable to parameter of type '"name" | "age" | "address" | "address.city" | "address.postalCode"'

在上面的示例中,我们定义了一个DeepKeyOf类型,它可以递归地获取嵌套对象的属性键。然后,我们定义了一个getNestedType函数,它接受一个对象和一个属性键,并返回该属性的类型。该函数使用了索引类型和条件类型来处理嵌套属性键的情况。

请注意,这只是一个简单的示例,可能无法处理所有复杂的情况。在实际使用中,您可能需要根据具体的需求进行适当的修改和扩展。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

TypeScript对象类型定义几种方式

前言 在 TypeScript ,以下几种方式用于定义对象: 接口(Interface) 常用场景: 接口用于定义对象结构,尤其是当对象结构比较复杂、需要复用或者要用于类类型定义时。...(Type Alias) 是最常用定义对象类型方式,尤其是在大型应用程序或库。...接口在扩展和复用方面有优势,而类型别名更为灵活,适合定义复杂联合类型和交叉类型。 类(Class) 在需要封装对象行为时使用较多,例如在面向对象编程创建多个实例时。...它提供了更多功能,构造函数、方法和继承。 对象字面量(Object Literal) 适用于简单场景,通常在局部变量或临时对象定义中使用较多。...总体来说,接口和类型别名是最常见选择,特别是在 TypeScript 类型系统,它们提供了最好类型安全和灵活性。

40610
  • 何在JavaScript访问暂未存在嵌套对象

    其中之一就是当你试图访问嵌套对象时,会遇到这个错误 Cannot read property 'foo' of undefined 在大多数情况下,处理嵌套对象,通常我们需要安全地访问最内层嵌套值。...为 name 属性。...Oliver Steele嵌套对象访问模式 这是我个人最爱,因为它使代码看起来干净简单。 我 stackoverflow 中选择了这种风格,一旦你理解它是如何工作,它就非常吸引人了。...做法是检查用户是否存在,如果不存在,就创建一个空对象,这样,下一个级别的键将始终存在对象访问。 不幸是,你不能使用此技巧访问嵌套数组。...除了安全访问嵌套对象之外,它还可以做很多很棒事情。

    8K20

    TypeScript 基础类型:原始类型对象类型、数组类型、元组类型、枚举类型和联合类型

    TypeScript 强大类型系统使得开发者能够更轻松地编写可维护、可扩展代码。本文将详细介绍 TypeScript 基础类型,包括原始类型对象类型、数组类型、元组类型、枚举类型和联合类型。...原始类型TypeScript ,有以下几种原始类型:数字类型数字类型用于表示整数或浮点数。可以使用 number 关键字来声明数字变量。...可以使用 object 关键字来声明对象类型对象类型对象类型用于表示一个对象,其中包含多个键值对。可以使用 {} 或者 object 关键字来声明对象类型对象类型可以指定属性名和属性类型。...例如:enum Color { Red, Green, Blue,}let color: Color = Color.Green;在枚举类型,每个枚举成员都有一个与它关联数字值,默认 0 开始...总结本文详细介绍了 TypeScript 基础类型,包括原始类型对象类型、数组类型、元组类型、枚举类型和联合类型等方面。

    57530

    两个角度看 Typescript 类型是什么?

    每个角度都从这三个问题来解释 以下三个问题对于理解类型是如何工作非常重要,需要从这两个角度每一个角度来回答。 myVariable 类型 MyType 意味着什么?...相反,我们采取了一种更为静态观点: 源代码有个位置,每个位置都有一个静态类型。在支持 Typescript 编辑器,如果我们将鼠标悬停在某个位置上方,就可以看到该位置静态类型。...这种检查两种方法(大致)是: 在标准类型,如果两个静态类型具有相同标识(“名称”) ,则它们是相等。一种类型是另一种类型类型,它们类型关系是显式声明。...具有标准类型语言有 c++ 、 Java、 c# 、 Swift 和 Rust 在结构类型系统,如果两个静态类型具有相同结构(如果它们部分具有相同名称和相同类型) ,则它们是相等。...具有结构类型语言有 ocaml/reasonml、 Haskell 和 TypeScript 下面的代码在标准类型系统中产生类型错误(第 A 行) ,但在 Typescript 结构类型系统是合法

    1.5K20

    两个角度理解 TypeScript 类型是什么

    翻译:疯狂技术宅 作者:Dr. Axel Rauschmayer 来源:2ality.com 正文共:1537 字 预计阅读时间:7 分钟 ? TypeScript类型是什么?...在支持 TypeScript 编辑器,如果将光标悬停在 location 上方,则可以看到该 location 静态类型。...大致有两种检查方法: 在名义类型系统,两个静态类型如果具有相同标识(“名称”)则相等。如果明确声明了它们类型关系,则一种类型是另一种类型类型。...以下代码在名义类型系统中会产生类型错误(A 行),但在 TypeScript 结构类型系统是合法,因为类 A 和类 B 具有相同结构: class A { name = 'A'; } class...手册类型兼容性”一章:https://www.typescriptlang.org/docs/handbook/type-compatibility.html TypeScript 规范

    1.5K00

    【Kotlin】:: 双冒号操作符详解 ( 获取引用 | 获取对象类型引用 | 获取函数引用 | 获取属性引用 | Java Class 与 Kotlin KClass )

    一、:: 双冒号操作符 ---- 在 Kotlin , :: 双冒号操作符 作用是 获取 类 , 对象 , 函数 , 属性 类型对象 引用 ; 获取这些引用 , 并不常用 , 都是在 Kotlin...反射操作时才会用到 ; 相当于 Java 反射 类 字节码类型 Class 类型 , 对象类型 Class 类型 , 对象函数 Method 类型 , 对象属性字段 Field 类型 ;...KClass 说明 Kotlin 引用类型 KClass 提供了很多有用属性 , : public actual val simpleName: String?...} 2、获取对象类型引用 在 Kotlin , 使用 :: 双冒号操作符 获取 对象类型引用 代码格式为 : Java或Kotlin实例对象::class 获取 对象类型引用 类型 为 KClass... , : 获取 String 字符串类型引用 , 代码为 : "Tom"::class 获取 String 对象类型引用 类型 为 KClass , 在某种程度上

    4.7K11

    零学习python 】43. Python面向对象编程实例属性和类属性

    实例属性、类属性 在面向对象开发,使用类创建出来实例是一个对象,那么,类是否是一个对象呢?...实例属性 通过类创建对象被称为实例对象对象属性又称为实例属性,记录对象各自数据,不同对象同名实例属性,记录数据各自独立,互不干扰。...p2 = Person("李四",20) 类属性属性就是类对象所拥有的属性,它被该类所有实例对象所共有,类属性可以通过类对象或者实例对象访问。...dog1 = Dog() print(dog1.type) # 结果为 “dog” 类属性和实例属性同名,使用实例对象访问是实例属性属性只能通过类对象修改,不能通过实例对象修改 class...: class Dog(object): count = 0 # 公有的类属性 __type = "狗" # 私有的类属性 print(Dog.count) # 正确

    15110

    何在 WPF 获取所有已经显式赋过值依赖项属性

    获取 WPF 依赖项属性值时,会依照优先级去各个级别获取。这样,无论你什么时候去获取依赖项属性,都至少是有一个有效值。有什么方法可以获取哪些属性被显式赋值过呢?...如果是 CLR 属性,我们可以自己写判断条件,然而依赖项属性没有自己写判断条件地方。 本文介绍如何获取以及显式赋值过依赖项属性。...---- 需要用到 DependencyObject.GetLocalValueEnumerator() 方法来获得一个可以遍历所有依赖项属性本地值。...因此,你不能在这里获取到常规方法获取依赖项属性真实类型值。 但是,此枚举拿到所有依赖项属性值都是此依赖对象已经赋值过依赖项属性本地值。如果没有赋值过,将不会在这里遍历中出现。...,同时有更好阅读体验。

    19540

    零学习python 】44.面向对象编程私有属性和方法

    私有属性和方法 在实际开发对象某些属性或者方法可能只希望在对象内部别使用,而不希望在外部被访问到,这时就可以定义私有属性和私有方法。...但是,通过一些代码,我们也可以在外部访问一个对象私有属性和方法。..._Person__money) # 使用对象名._类名__私有属性名 可以直接访问对象私有属性 p._Person__shopping(100) # 使用对象名...._类名__函数名 可以直接调用对象私有方法 print(p._Person__money) 注意:在开发,我们强烈不建议使用 对象名._类名__私有属性方式来访问对象私有属性!...定义方法访问私有变量 在实际开发,如果对象变量使用了 __ 来修饰,就说明它是一个私有变量,不建议外部直接使用和修改。如果硬要修改这个属性,可以使用定义get和set方法这种方式来实现。

    13210

    深入学习下 TypeScript 泛型

    在今天内容,我们将尝试 TypeScript 泛型真实示例,并探索它们如何在函数、类型、类和接口中使用。...此 BooleanFields 类型一个使用场景是创建一个选项对象。假设您有一个数据库模型,例如用户。 数据库获取此模型记录时,您还将允许传递一个指定要返回哪些字段对象。...,它具有嵌套属性多级结构。...使用 NestedOmit 泛型,传入类型,然后列出要省略属性键。 请注意如何在第二个类型参数中使用点符号来标识要省略键。然后将结果类型存储在 Result 。...发生这种情况时,您可以使用内置助手对象中省略该字段。 这将返回 b 字段类型,即省略了 c 原始类型。现在评估结束,TypeScript 返回您要使用类型,并省略嵌套字段。

    39K30

    深入学习下 TypeScript 泛型

    在今天内容,我们将尝试 TypeScript 泛型真实示例,并探索它们如何在函数、类型、类和接口中使用。...此 BooleanFields 类型一个使用场景是创建一个选项对象。假设您有一个数据库模型,例如用户。 数据库获取此模型记录时,您还将允许传递一个指定要返回哪些字段对象。...,它具有嵌套属性多级结构。...使用 NestedOmit 泛型,传入类型,然后列出要省略属性键。 请注意如何在第二个类型参数中使用点符号来标识要省略键。然后将结果类型存储在 Result 。...发生这种情况时,您可以使用内置助手对象中省略该字段。 这将返回 b 字段类型,即省略了 c 原始类型。现在评估结束,TypeScript 返回您要使用类型,并省略嵌套字段。

    15310

    Stream流用于按照对象某一属性来对集合去重+简单数据类型集合去重

    上次对Stream流来进行分组文章很多人看,想看可以来这: Stream流来进行集合分组 这次小编又带来Stream去重,话不多数,直接上代码: 这是对简单数据类型去重 //字符串集合进行简单去重...(其他数据类型去重一样) List stringList = Arrays.asList("伽罗", "貂蝉", "芈月", "伽罗"); //jdk1.8Stream...JSON.toJSONString(stringList)); /** * 执行结果:["伽罗","貂蝉","芈月"] * */ 对对象某一个属性来进行去重...NoArgsConstructor public class Hero { //英雄id private int id; //名字 private String name; //类型...private String type; } //进行对象某个属性进行去重 List list = Arrays.asList(

    1.6K20

    TypeScript 进阶,深入理解并运用索引访问类型提升代码质量

    TypeScript,索引访问类型代表了我们处理类型方式一大转变。这个特性允许我们在保持TypeScript类型安全同时,利用JavaScript动态特性。...这种能力在创建能够适应 ComponentConfig 任意属性并返回相应类型函数时非常有用。 动态获取用户属性值 假设我们需要编写一个函数,根据属性名称动态获取用户资料对象值。...处理复杂数据结构 这种技术不仅适用于单个属性,还能扩展到数组和其他复杂结构,允许在嵌套对象或数组中提取深层次类型,实现强类型化。...这种技术允许我们直接在函数或代码其他部分使用提取类型,确保一致性并利用TypeScript类型检查能力处理复杂嵌套结构。 索引访问类型不仅是TypeScript一个特性,更是一种范式。...结束 在这篇文章,我们深入探讨了TypeScript索引访问类型,这一关键特性极大地增强了我们处理复杂数据结构能力。

    15910
    领券