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

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

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

相关·内容

领券