这个类型定义中,通过 [K in keyof T]``,遍历了
T对象中的每个属性
K,然后通过
K extends string ?来判断
K是否为字符串类型,如果是,则继续判断
T[K]是否是一个嵌套的对象类型,如果是,则返回
{Path<T[K]>},这里使用了递归调用
Path<T[K]>来处理多层嵌套属性。如果
T[K]不是嵌套的对象类型,则返回属性名
K。如果
K不是字符串类型,则返回
never`。
type Path<T> = {
[K in keyof T]: K extends string
? T[K] extends Record<string, any>
? `${K}.${Path<T[K]>}`
: K
: never;
}[keyof T];
验证
interface IConfig {
host: string;
port: string;
db: {
host: string;
port: number;
}
}
type IConifgPath = Path<IConfig> // "host" | "port" | "db.host" | "db.port"