mirror of
https://github.com/ae-utbm/sith.git
synced 2024-12-22 15:51:19 +00:00
Add NestedKeyOf Type
This commit is contained in:
parent
baebc0b690
commit
1696a2f579
37
core/static/bundled/utils/types.d.ts
vendored
Normal file
37
core/static/bundled/utils/types.d.ts
vendored
Normal file
@ -0,0 +1,37 @@
|
||||
/**
|
||||
* A key of an object, or of one of its descendants.
|
||||
*
|
||||
* Example :
|
||||
* ```typescript
|
||||
* interface Foo {
|
||||
* foo_inner: number;
|
||||
* }
|
||||
*
|
||||
* interface Bar {
|
||||
* foo: Foo;
|
||||
* }
|
||||
*
|
||||
* const foo = (key: NestedKeyOf<Bar>) {
|
||||
* console.log(key);
|
||||
* }
|
||||
*
|
||||
* foo("foo.foo_inner"); // OK
|
||||
* foo("foo.bar"); // FAIL
|
||||
* ```
|
||||
*/
|
||||
export type NestedKeyOf<T extends object> = {
|
||||
[Key in keyof T & (string | number)]: NestedKeyOfHandleValue<T[Key], `${Key}`>;
|
||||
}[keyof T & (string | number)];
|
||||
|
||||
type NestedKeyOfInner<T extends object> = {
|
||||
[Key in keyof T & (string | number)]: NestedKeyOfHandleValue<
|
||||
T[Key],
|
||||
`['${Key}']` | `.${Key}`
|
||||
>;
|
||||
}[keyof T & (string | number)];
|
||||
|
||||
type NestedKeyOfHandleValue<T, Text extends string> = T extends unknown[]
|
||||
? Text
|
||||
: T extends object
|
||||
? Text | `${Text}${NestedKeyOfInner<T>}`
|
||||
: Text;
|
Loading…
Reference in New Issue
Block a user