PropertyPath
Returns the valid property paths of the given object type as strings separated by dot(.).
Includes optional chaining(?) only for optional properties, and for nested objects, all depth paths are expressed as a union type.
- Differences from PropertyAllPath
- Depth limit (10 levels)
- Includes
optionalpaths only for actual optional properties
Interface
typescript
type PropertyPath<
T,
Limit extends unknown[] = []
> = Limit['length'] extends 10
? never
: {
[K in keyof T & string]: T[K] extends
| Record<PropertyKey, unknown>
| undefined
?
| K
| (T[K] extends Record<PropertyKey, unknown>
? `${K}.${PropertyPath<T[K], [...Limit, unknown]>}`
: `${K}?.${PropertyPath<
NonNullable<T[K]>,
[...Limit, unknown]
>}`)
: K;
}[keyof T & string];
Type Parameters
| Name | Constraint | Default | Description |
|---|---|---|---|
T | - | - | The target object type to extract paths from |
Limit | unknown[] | [] | Internal parameter for limiting recursion depth |
Usage
Basic Case
typescript
import { PropertyPath } from '@modern-kit/types';
type Paths = PropertyPath<{ a: string; b: { c: number; d: string } }>;
// "a" | "b" | "b.c" | "b.d"
Optional Property Case
typescript
import { PropertyPath } from '@modern-kit/types';
type Paths = PropertyPath<{ a: string; b?: { c: number; d: string } }>;
// "a" | "b" | "b?.c" | "b?.d"