What is the best way to create a Record in TypeScript using a union as its key type from a function?

Here's a function I have:

const getQueryParams = (names) => {
  const urlParams = new URLSearchParams(window.location.search)
  return names.reduce((acc, curr) => {
    return {
       ...acc,
       [curr]: urlParams.get(curr),
    }
  }, {})
}

I want to define TypeScript types to achieve the following type for the output of the above function.

const params: Record<'a'|'b', string> = getQueryParams(['a', 'b'])

Can this be done? If so, how can it be accomplished?

Answer №1

This code snippet appears to be functioning correctly.

type ExtractQueryParams = <U extends string>(args: U[]) => Record<U, string | null>

export const extractQueryParams: ExtractQueryParams = params => {
  const queryParameters = new URLSearchParams(window.location.search)
  return params.reduce((result, current) => {
    return {
      ...result,
      [current]: queryParameters.get(current),
    }
  }, {} as ReturnType<ExtractQueryParams>)
}

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

The TS2345 error is triggered when using the fs.readFile function with specified string and

Attempting to utilize the fs.readFile method in TypeScript, my code looks like this... import {readFile} from 'fs'; let str = await readFile('my.file', 'utf8'); This results in the following error message: TS2345: Argumen ...

What is a suitable alternative to forkJoin for executing parallel requests that can still complete even if one of them fails?

Is there a more robust method than forkJoin to run multiple requests in parallel and handle failed subscriptions without cancelling the rest? I need a solution that allows all requests to complete even if one fails. Here's a scenario: const posts = th ...

Is TSC_WATCH utilizing the TSC_NONPOLLING_WATCHER?

Currently, I am engaged in a microservice integration project where I simultaneously run 8 typescript services using the command tsc-watch --preserveWatchOutput --onSuccess 'node build/index.js'. Surprisingly, these processes are utilizing 70% ...

Incomplete data from classification

Here's a scenario I'm dealing with: type FormatList = 'csv' | 'html' | 'xlsx' | 'pdf'; type FormatsMap = Record<Partial<FormatList>, string>; I want to create a simple object like this: { csv: ...

Enhance your Angular application with lazy loading and nested children components using named outlets

Let me start by explaining that the example provided below is a simplified version of my routes that are not functioning properly. I am working on an angular project, specifically a nativescript angular project, and I suspect the issue lies within Angular ...

Issues with Vercel deployment/building are occurring. The error message states: "Failed to compile. Type error: Unable to locate module ... or its associated type declarations

I'm attempting to launch my initial Next.js application using Vercel. Even though the app runs smoothly on my local machine (it builds locally with yarn run build and I can develop normally using yarn run dev), I am encountering issues with the build ...

Encountering an ERROR of TypeError when attempting to access the property 'length'

I encountered the following error message: ERROR TypeError: Cannot read property 'length' of undefined at eval (webpack-internal:///./node_modules/@angular/common/esm5/http.js:163) at Array.forEach () at HttpHeaders.lazyInit ...

When the query result is received in Angular TypeScript, translate epoch time into a time string

Here is the dilemma I am currently facing: I have an Angular script that requests data from a backend service and receives query results to display to the user. One of the fields in the query response is a time stamp, which is currently in epoch time forma ...

Ensure that the form is submitted only after confirming it in the modal with react-hook-form

**I am facing an issue with submitting react-hook-form on confirm in a modal component. Whenever the user selects confirm, I need the form to be submitted directly. I have tried writing the modal inside FormSubmitButton. Also, I have tried placing it insi ...

What are the steps involved in creating a definition file for npm?

Is there a recommended way to include a definition file (.d.ts) into an npm module as outlined in this guide? Specifically, how can I reference the node without using \\\ <reference /> due to restrictions? ...

Contact creation not working on non-HubSpot form popups

I'm currently experiencing an issue with my website that has non-Hubspot forms. We have successfully integrated the tracking code to generate cookies for users, track their sessions, and enable the non-Hubspot forms. However, we are facing a problem s ...

When trying to pass MaterialUI theme props to styled components, an error of 'Undefined' is encountered

I'm encountering difficulty accessing my Material-UI theme props within a styled component, resulting in errors like... TypeError: Cannot read property 'primary' of undefined or similar issues in the browser. Here is the custom theme I&apo ...

Create a fake version of ElementRef and simulate the getBoundingClientRect() function

Looking to simulate ElementRef and access getBoundingClientRect() I experimented with the code below, but it didn't yield the expected results. const mockHostRef = { nativeElement: { getBoundingClientRect: {top: 10, left: 10} } } {pr ...

Tips for locating the index of a substring within a string with varying line endings using Typescript

I am faced with the task of comparing two strings together. abc\r\ndef c\nde My goal is to determine the index of string 2 within string 1. Using the indexOf() method is not an option due to different line endings, so I require an altern ...

Unable to access attribute of instantiated class

I am relatively new to TypeScript and I recently encountered a problem that's stumping me. I'm working on setting up a REST API using Express. The setup involves a router that calls a controller, which in turn invokes a service method before ret ...

To handle async actions in Typescript with React and Redux, ensure that all actions passed to axios are plain objects. If you need to perform

Looking for assistance with Typescript, React, and Redux. export function fetchAllMeals (subject: string){ axios .get(`https://www.themealdb.com/api/json/v1/1/search.php?s=${subject}`) .then((response: any) => { console.log(response.data) ...

Variations in assets configuration for ng serve and ng build in Angular 5

Is it possible to specify different asset arrays when using ng build? "assets": [ "assets", "favicon.ico", { "glob": "**/*", "input": "../externalDir", "output": "./app/", "allowOutsideOutDir": true } ] In my scenario, I only want ...

The route will be altered once the route transition or animation has been initiated

As route change triggers an animation, I have a black div that slides from the bottom to the top of the page during transition. The animation of the sliding div is working correctly. However, the issue arises when the route changes simultaneously with the ...

Sequelize Date Range Error When Using Op.between with TypeScript

My goal is to retrieve all records from a MySql table that were created within a specific date range. To accomplish this, I created the following code snippet: import { Sequelize, Model, DataTypes, Op } from 'sequelize'; const sequelize = new ...

Steps for transforming a regular string into a template string

Consider the following scenario: var data = '{"message": "`${message}`"}'; var obj = JSON.parse(data); var templateValue = obj.message; //`${message}` var message = 'hello'; What is the best way to evaluate the ...