嵌套对象的keyof

嵌套对象的keyof

· 1 分钟阅读时长

需求

interface User {
  parent: {
    name: string;
  };

  age: number;
  name: string;
}

type Column = {
  key: keyof User;
};

const columns: Column[] = [
  {
    key: 'name'
  },
  {
    key: 'name1'
  },
  {
    key:'parent.name'
  }
];

解决办法

type Paths<T> = T extends object ? { [K in keyof T]:
  `${Exclude<K, symbol>}${"" | `.${Paths<T[K]>}`}`
}[keyof T] : never

type Column = {
  key: Paths<User>;
};

除了自己写Paths类型外,还可以使用现成的库,比如type-fest中的Path类型。

效果

const columns: Column[] = [
  {
    key: 'name'
  },
  {
    key: 'parent.name' // ok
  },
    {
    key: 'parent.name1' // error
  }
];

相关文档