首页
学习
活动
专区
工具
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函数,它接受一个对象和一个属性键,并返回该属性的类型。该函数使用了索引类型和条件类型来处理嵌套属性键的情况。

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

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

相关·内容

何在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 基础类型,包括原始类型对象类型、数组类型、元组类型、枚举类型和联合类型等方面。

30730

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

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

1.4K20

两个角度理解 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.3K10

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

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

11810

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

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

15740

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

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

10810

深入学习下 TypeScript 泛型

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

38.8K30

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.5K20

分享 30 道 TypeScript 相关面的面试题

公共属性(通常称为“鉴别器”)允许我们在联合内类型之间安全地切换,从而更轻松地使用此类对象。 12、继承在 TypeScript 如何发挥作用?...派生类还可以重写继承方法或属性,甚至用新方法或属性扩展对象结构。 13、装饰器在 TypeScript 扮演什么角色?...20、描述 TypeScript 索引签名用途和语法。 答案:TypeScript 索引签名允许对象具有某种类型动态属性。...23、您将如何在 TypeScript 创建和使用 mixin? 答案:Mixin 是一种可重用组件创建类模式。...typeof 运算符在类型上下文中使用时,获取变量、常量或对象文字类型,这对于基于现有对象形状创建类型非常有用,而无需手动重复其结构。

49330

Web前端面试敲重点知识,14个TypeScript核心基础面试题和答案

6、TypeScript 声明变量有哪些不同关键字? 7、如何书写带有类型注释函数 ? 8、如何在 TypeScript 创建对象 ? 9、如何在 TypeScript 中指定可选属性 ?...有时你想将值存储在变量,但事先不知道该变量类型 当你没有明确提供类型时,TypeScript假定变量是any类型,并且编译器无法周围上下文中推断出类型 例如,该值来自 API 调用或用户输入。...函数是执行特定代码代码块 函数可以有选择地接受一个或多个参数,处理它们,并有选择地返回一个值。 image.png 8、如何在 TypeScript 创建对象 ?...它们类似于数组,有时也称为关联数组 但是,数组使用数字来索引值,而对象允许使用任何其他类型作为键 image.png 9、如何在 TypeScript 中指定可选属性 ? 通过添加 ?...对象类型可以具有零个或多个可选属性,在属性名称之后 image.png 10、说说枚举在 TypeScript 是如何工作

11.4K10

TypeScript是如何工作

如对于一个类实例对象,我们在使用这个对象时,只关心这个对象提供了哪些变量/方法;对于一个模块,我们在使用这个模块时,只关心这个模块导出了哪些对象。通过读取 Symbol,我们就可以获取这些信息。...Symbol declarations 属性是个数组,一般来说,这个数组只有一个对象。...这一点可以在 Preference typescript,能在 Extensions 下面找到 TypeScript 看出。更改这里面的配置,能控制插件各种行为。...由于 babel 自身并不具备打包功能,所以直接在命令行调用 babel 命令用处不大,本节主要讨论如何在 webpack 中使用 babel 处理 typescript。...当然,由于 babel 单文件特性,@babel/preset-typescript 对于一些需要收集完整类型系统信息才能正确运行 TypeScript 语言特性,支持不是很好, const enums

5.3K30
领券