How do I generate an object using a specified file path?

Just like how _.set works, I am looking to generate an object using a given Path.

For instance:

type Path = readonly ['a', 'b'];
type Object = SOMETHING<Path, {c: "foo"}>; // {a: {b: {c: "foo" } } }

Do you have any suggestions on how to achieve this functionality?

Answer №1

If you're looking to achieve this, consider utilizing a recursive conditional type that navigates through the path tuple:

type KeyPath = readonly PropertyKey[]
type SOMETHING<P extends KeyPath, T> =
  P extends readonly [infer Key, ...infer Rest]
  ? {[K in Extract<Key, PropertyKey>]: SOMETHING<Extract<Rest, KeyPath>,T>}
  : T 

type Path = readonly ['a', 'b'];
type Obj = SOMETHING<Path, {c: "foo"}>; // {a: {b: {c: "foo" } } }

The utilization of Extract is crucial as it ensures the inferred arguments meet the necessary constraints. The inclusion of Extract<Rest, KeyPath> could be omitted if the extends KeyPath was excluded from SOMETHING, but this would eliminate the tuple check on the path argument.

Take a look at TypeScript playground for more details

Similar questions

If you have not found the answer to your question or you are interested in this topic, then look at other similar questions below or use the search

Unable to retrieve information from service using Angular 1.6 and TypeScript

I'm having an issue retrieving data from a Service in my Controller. Here is the code for my Service file: import {IHttpService} from 'Angular'; export class MyService { public static $inject = ['$http']; constructor(private $htt ...

Angular selects the initial three arrays out of an array

In my code, I have a collection of arrays that are nested within another array. My task is to extract the first three arrays from this collection. For instance, consider the following example: [{[1]},{[2]},{[3]},{[4]}] I apologize for not presenting a p ...

Next.js Version 13 - Unable to find solution for 'supports-color' conflict

Currently in the midst of developing a Next.js 13 app (with TypeScript) and utilizing the Sendgrid npm package. An ongoing issue keeps popping up: Module not found: Can't resolve 'supports-color' in '.../node_modules/debug/src' ...

Is there a way for me to directly download the PDF from the API using Angular?

I'm trying to download a PDF from an API using Angular. Here's the service I've created to make the API call: getPDF(id:any) { return this.http.get( `url?=${id}`, { responseType: 'blob' as 'json', obs ...

How can I replace any non-alphanumeric characters in a string with an underscore using JavaScript or TypeScript?

There is a unique string generated from an external data source that I cannot manage. The system above me necessitates the IDs to adhere to this rule: "Field names should start with a letter and can solely consist of letters, numbers, or underscores (&apos ...

Encountering an Issue: The formGroup function requires an instance of a FormGroup. Kindly provide one

I am a beginner with Angular 2 and despite reviewing numerous stack overflow answers, I still can't resolve my issue. I have recently started learning about angular reactive forms and wanted to try out my first example but I'm facing some diffic ...

What is the best way to invoke a class function within a static object?

Here's an example for you: export class MyClass { myString: string; constructor(s: string) { this.myString = s; } myFunction() { return "hello " + this.myString; } } export class MainComponent { static object1: MyClass = JSON. ...

Having trouble compiling the sample JHipster Node.js application

I successfully cloned the jhipster-sample-app-nodejs repository from GitHub (link). Following all the compilation and execution instructions for the application, I have installed the necessary tools (npm, nodejs, yo). However, upon attempting to start th ...

A guide to seamlessly uploading files to s3 using nextjs, node, and typescript

I've been struggling to successfully upload a basic image to s3 using ts/nextjs/node. Despite having all the necessary credentials and code in place, I'm still unable to get it working. Can someone please provide clear instructions on how to achi ...

Executing a function within the same file is referred to as intra-file testing

I have two functions where one calls the other and the other returns a value, but I am struggling to get the test to work effectively. When using expect(x).toHaveBeenCalledWith(someParams);, it requires a spy to be used. However, I am unsure of how to spy ...

Access data inside nested objects with specified data type

Imagine the code snippet below: type Parent = { children: Child[] } type Child = { label: string } const parent: Parent = { children: [ { label: 'label1' }, { label: 'label2' } ] } How can I use generics to ...

Error: The module 'MyMaterialModule' encountered an unexpected directive 'angular-material'. To resolve this issue for angular 5, please include the @NgModule annotation

I am encountering this issue Found an Error: Module 'MaterialModule' is importing the directive 'MatPaginator' unexpectedly. Make sure to include @NgModule annotation. This is the material module I am using import { NgModule, Vie ...

Using @Input to pass data from a parent component to a

Looking to modularize the form code into a separate component for reusability? Consider using @Input and referencing it in the HTML to pass values to the post method. Here's how you can achieve this: Previously, everything worked smoothly when all th ...

Why is it that my TypeScript isn't permitting the definition of Tuple Types?

When attempting to define a tuple type in my code, an error is being thrown. Is there a specific configuration within my Node.js application that needs to be adjusted in order to accept tuple types? ...

What are the steps to imitate a controller?

How can I properly mock this code? I'm in need of some assistance. I'd like to create a test case for this controller. However, as a newcomer, I am struggling with where to begin and how to write the test case. import { Route } from '../co ...

What is the reason behind the inability to utilize page.locator within a page.waitForFunction?

Delving into Playwright for the first time, coming from a Cypress background where I am familiar with the cypress-wait-until function. I'm currently trying to wait until a specific number of DOM elements exist, and although I've found various so ...

Is it possible for TypeScript to deduce a function's return type from the values of its parameters?

In my API, a request object is used to retrieve a list of records. If the request object includes the property inlineCount, the API will return the data in the format { results: T[], inlineCount: number }. Otherwise, it will simply return T[]. The code sn ...

Leverage the generic parameter type inferred from one function to dynamically type other functions

I am in the process of developing an API for displaying a schema graph. Here is a simplified version of what it entails: interface Node { name: string; } type NodeNames<T extends Node[]> = T[number]["name"]; // Union of all node names as strings ...

Angular 6: A guide to dynamically highlighting navbar elements based on scroll position

I am currently building a single page using Angular 6. The page is quite basic, and my goal is to emphasize the navbar based on scrolling. Below is the code snippet I am working with: .sticky { position: sticky; top: 0; } #i ul { list-style-type: ...

Implementing Batch File Uploads using Typescript

Is there a way to upload multiple files in TypeScript without using React or Angular, but by utilizing an interface and getter and setter in a class? So far I have this for single file upload: <input name="myfile" type="file" multi ...