网站搜索

typescript - <T extends object>(value: T): T,但将之前为 null 的类型改为 string 类型


我正在使用一个名为 pathmirror 的工具,它可以转换如下对象:

{a: {b: null} } 转换为 {a: {b: 'a.b'}

这对 redux 动作名称很有帮助。

我怎样才能为这个创建一个类型?

我目前有:

declare module "pathmirror" {
  export default function<T extends object>(value: T): {[key in keyof T]: object|string};
}

但是 object|string 并不反映递归性。

答案#1

您可以使用递归类型结合条件类型,将所有原始类型的字段转换为string,同时保留任何object类型的结构。

类型看起来会是这样的:

type  StringKeysObject<T> = {
    [P in keyof T]: T[P] extends number | string | null | undefined | boolean ? string : StringKeysObject<T[P]>;
};


function paths<T extends object>(value: T): StringKeysObject<T>{
  return null as any;
};


let dd = paths({
  a: {
    b: null
  }
})
let s = dd.a.b // string