How do I specifically indicate that K is the exact keyof T in TypeScript?

I am enhancing my pick function and here is my current implementation:

export function pick<T, K extends keyof T>(obj: T, keys: K[]): Partial<T> {
    const ret = Object.create(null)
    for(const key of keys) {
        ret[key] = obj[key]
    }
    return ret
}

This is what I aim to achieve:

export function pick<T, K extends keyof T>(obj: T, keys: K[]): K is keyof T ? T : Partial<T>

In other words, when all keys of T are passed, TypeScript should understand that it will return a complete T. If a subset of keys is provided, it should return a Partial<T> (or ideally, something like if K is in T, then T[K], otherwise undefined).

Is this feasible? It seems I can only use extends conditionals, not "exactly is" conditionals.


Alternatively, can I define the return type as something like {[K in keyof T]: T[K]}? However, I am unsure how to specify that the remaining keys will be undefined by negating in keyof.


The Pick<> helper is not suitable in this case because my approach differs - I always return exactly K keys.

Answer №1

To meet the requirement of K extends keyof T, an exact match between these two types is essentially the opposite constraint - keyof T extends K:

export function select<T, K extends keyof T>(obj: T, keys: K[]): keyof T extends K ? T : Partial<T> {
    const result = Object.create(null)
    for(const key of keys) {
        result[key] = obj[key]
    }
    return result
}

interface Values { property1: number, property2: number };

const complete: Values = select({property1: 1, property2: 2}, ['property1', 'property2']);
const incomplete: Partial<Values> = select({property1: 1, property2: 2}, ['property1']);

Try it out here!

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

Using array values with styled-components may lead to an object being potentially 'undefined'

Currently, I am developing a custom Skeleton component that allows for the input of a property called circleSizes. This property is an array of numbers used to define the width and height of the Skeleton element. Below is the code snippet for the componen ...

What is the most effective way to sort a list using Angular2 pipes?

I'm currently working with TypeScript and Angular2. I've developed a custom pipe to filter a list of results, but now I need to figure out how to sort that list alphabetically or in some other specific way. Can anyone provide guidance on how to a ...

Typescript interface requiring both properties or none at all

I possess key-value pairs that must always be presented together in a set. Essentially, if I have one key with its value A:B, then there should also be another key with its value C:D. It is permissible for the object to contain neither pair as well. (An ex ...

Enhance the array by updating objects within it using the spread operator

I'm looking to modify the name of the second object in a javascript/typescript array. Here's my array: let array = [{id:1,name:'One'}, {id:2, name:'Two'}, {id:3, name: 'Three'}] Is there a way to update the name of ...

The Angular2 promise resolves before the web service call has finished executing

I have a service in Angular 2 that contains a function responsible for providing data for a dropdown list. This particular function returns a promise. Below is the code snippet from the service: getStuff(): Promise<Stuff> { return t ...

Unlock the potential of Power BI with this step-by-step guide on enhancing the Circle Card visual by incorporating unique formatting

Power BI Tutorial: Adding Formatting Options to the Circle Card Visual After completing step 8, I copied the code into my VS Code and encountered 2 error messages: Error message: "import VisualSettings - Module '"./settings"' has no e ...

Learn the process of typing a property that will be displayed as a dynamic HTML element component

Looking for a way to render an HTML element dynamically based on a prop in a React component? interface ButtonProps { children: ReactNode; className?: string; as?: string; <--- ? [key: string]: unknown; } const Button = forwardRef({ children, ...

Error message encountered when trying to associate "can" with an ability instance within Types

Just copying example code from documentation import { createCanBoundTo } from '@casl/react'; import ability from './abilities'; export const Can = createCanBoundTo(ability); An error occurs on the last line: The exported variable & ...

Exploring the depths of nested data retrieval using the fp-ts library: a labyrinth

Embark on your journey into the world of functional programming in typescript using the fp-ts library. I find myself tangled in a complex web of nested data fetching, reminiscent of the ancient Egyptian pyramids. How can I tackle this problem with a more ...

What causes items within an Array() to be interdependent? (Javascript)

Here is what I attempted: let array = Array(2).fill([]); array[0].push(1); Expected result: array = [[1], []] Actual result: array = [[1], [1]] Can someone explain why the second element is affected by the first in this scenario? Appreciate any help in ...

Creating a new object and assigning it to an existing reference variable

As a newcomer to Angular, I am facing an issue related to assigning a JSON response from the server to a newly instantiated object. Within my code, I have defined a class called MyClass: export class MyClass { Id: number; } let obj: MyClass; myServi ...

Identifying when ngModel is dirty

In my application, the input fields are populated dynamically based on the API response. Each field has a corresponding set of buttons associated with it, which I only want to show when the field is edited. Here is an image of the form: https://i.sstatic ...

Can you specify the nature of the clear dispatch action?

Below is the code snippet in question: useEffect(() => { dispatch(fetchMovieDetails(movieId!)); return () => dispatch(fetchMovieDetails(movieId!, "clear")); }, [dispatch, movieId]); The issue at hand is that this code snippet i ...

Obtaining Prisma arguments by providing the table name as a string

Is there a way to retrieve the query arguments for a Prisma function by only passing the table name? Currently, I know I can obtain the table by providing the table name as a string in the following manner: function (tablename: string) { await prisma.[tab ...

The exploration of child routes and modules

I'm currently working on a somewhat large project and I've decided to break it down into modules. However, I'm facing an issue with accessing the routes of admin.module.ts. In my app.module, I have imported the admin Module. imports: [ Br ...

Minimize the count of switch cases that are not empty

How can I optimize the number of cases in my switch statement to align with SonarQube recommendations? Currently, I have 37 cases in a switch statement, but SonarQube recommends only 30. I believe that my code is functioning correctly, and the issue lies ...

Error message: The issue arises when trying to incorporate jQuery-UI into an Angular 4 application due to the undefined status of

I'm currently working on integrating jQuery-UI into an application to utilize some sliders. I've successfully installed the typings for jQuery by running: npm install @types/jquery --save And it seems I've also installed the jQuery-UI typi ...

Check the compatibility of Angular 9 using TypeScript alongside Mocha and JavaScript syntax

After transitioning to Angular 9 (Type Script) from Angular.js, we aim to stick with Mocha for writing tests while maintaining the JavaScript syntax instead of using TypeScript in Mocha. Is it viable to write JavaScript tests for Type Script code, specifi ...

Getting a file object with v-file-input in Nuxt.js

For my Nuxt.Js apps, I utilized Vuetify.js as the UI framework. In order to obtain the file object when uploading files, I incorporated the v-file-input component from Vuetify.js and wrote the following code snippet: <template> <div> ...

Error thrown due to syntax issues in react.d.ts declaration file in TypeScript

Currently, I am attempting to integrate react with typescript in my project. However, typescript is generating syntax errors for the react.d.ts file sourced from Github: https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/react The encountered ...