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
