Can you explain the significance of "keyof" in the array's return type?

Recently, I came across an interesting TypeScript construct in a colleague's source code:

protected getData(): { [item in keyof Fruit]: any; } {
    return {
      color: [],
      tree: [],
    };
}

I'm puzzled by the return-type declaration { [item in keyof Fruit]: any; } in the signature. Can someone explain what this signifies?

Answer №1

When the getData function returns an object, we can assume that there is a key called item in that object, which must be of type keyof Fruit. If the type Fruit has distinct keys defined, then keyof Fruit represents a union type of each of those keys.

This return type is declared using an index signature.

For instance:

interface Fruit {
  color: string;
  tree: string;
}

type FruitKeys = keyof Fruit; // 'color'|'tree'

type Return = { 
   [item in FruitKeys]: any; // Index signature specifying how this type can be indexed.
}

const a : Return = {
  color: 'aaa', 
  tree: null,
  abc: '' // error because abc is not one of the keys of Fruit
}

A more concise way to define this would have been to use the Record utility type. This alternative implementation looks like:

function getData(): Record<keyof Fruit, any> {
    return  {
      color: [], 
      tree: [],
    };
}

Playground link

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

A guide on how to retrieve images from a URL and save them using Blob in Angular 5

In my web application, I have a few links that lead to files with different content types - some are application/pdf and others are image/jpeg. When clicking on these links, the file should download or save based on their respective type. While downloadin ...

Array filtering using one array condition and additional boolean conditions

Sorting through the carArray based on user-specified conditions. If a user selects the red checkbox, only cars with red paint will be displayed. If a user selects the green checkbox, only cars with green paint will be displayed. If both the red and green ...

Showing records from Firebase that are still within the date range

I'm currently developing an application that allows users to book appointments on specific dates. After booking, I want the user to only be able to view appointments that are scheduled for future dates. I've attempted to compare the date of each ...

The combination of Object.keys() and the find function

Having trouble figuring out why I'm getting an error when attempting to use ES6 .find on the following data in order to retrieve the record with id number 3. { {id:10,title:'Dairy & Eggs'} {id:7,title:'Laundry & Household'} {id ...

The error message "ER_BAD_FIELD_ERROR: The column 'table.column' is not recognized in the 'on clause'" is displayed

I am encountering a perplexing issue... I'm attempting to execute a query: SELECT ordenes_servicio.idorden, estatus_orden.descripcion AS estatus, tipo_orden.descripcion AS tipo_orden, usuario.nombre, ordenes_servicio.nombres_cliente, ordenes_servicio ...

Sorting mapped elements in Typescript+React: Best practices and techniques

Is there a way for me to sort the data that I retrieved using the fetch function by the value of price.amount? I know it needs to be done before mapping, but I'm unsure how to reference the amount field. I've tried looking at various tutorials, b ...

Steps to properly specify the Express Error Type

When defining the variable err, I have opted to use any due to uncertainty about the correct type. I was anticipating an express.Error type, but none was found. What would be the appropriate way to assign a type to err? // Addressing Syntax Error in JSON ...

What distinguishes ES6 from ES2015 in the TypeScript compiler option `--libs`?

Can you explain the distinction between ES6 and ES2015 in the TypeScript compiler option here? Also, what does --libs do? https://i.sstatic.net/iUv8t.png ...

What is the best way to retrieve the previous URL in Angular after the current URL has been refreshed or changed

Imagine being on the current URL of http://localhost:4200/#/transactions/overview/5?tab=2 and then navigating to http://localhost:4200/#/deals/detail/ If I refresh the deals/detail page, I want to return to the previous URL which could be something like h ...

Setting a TypeScript version in Atom: Step-by-step guide

I'm currently grappling with using a specific version of TypeScript in Atom. For an older project that relies on Backbone, the latest TypeScript version doesn't compile properly, so I need to use an earlier one. The closest solution I've co ...

An error of type TypeError has been encountered due to an invalid argument type. This occurred in the file located at {mypath}Desktop eddit ode_modules@redisclientdistlibclientRESP2encoder.js on line

Currently, I am diving into Ben's TypeScript GraphQL Redis tutorial for the first time. As a newcomer to TypeScript, I decided to give Redis a shot. However, when I added the property req.session.userId= user.id;, things took a turn. An error popped ...

Best practices for setting up PDAs in the Solana Anchor framework

Trying to create a basic Solana Program using Rust/Anchor that involves a PDA is causing a CPI error upon invocation, even though there doesn't appear to be any CPI happening (possibly due to the PDA account initialization). Below is the Program code ...

Skipping necessary module in TypeScript

There are times when I struggle to locate updated type definition files for a new version of a node package I am working with. For instance, I am facing difficulty in finding a recent type definition file for Mongoose. As a result, I encounter errors when ...

Observer function simulated by SinonStub

I am currently testing express middleware using sinon.js My goal is to verify that it sends a specific JSON response and prevents the request from moving on to the next middleware or request handler. const middleware = (req: Request, res: Response, nex ...

Issues with the Injector arise during the Angular 2 RC5 to RC6 migration

After smoothly running my Angular2 RC5 application, I decided to upgrade to RC6. However, upon doing so, my application ceased functioning and displayed the following error message: Error: Can't resolve all parameters for LoginComponent: (?, ?). M ...

BarChart is failing to exhibit data in tooltips when using dynamic keys

Query Description Hello! I'm currently tackling an issue with a bar chart. Everything is working smoothly, except for the default tooltip, which appears blank when hovering over the bars. My chart utilizes dynamic keys for the legends, and they are f ...

Step-by-step guide on utilizing the vendor.ts file available at https://angular.io/docs/ts/latest/guide/webpack.html

As per the guidelines provided at https://angular.io/docs/ts/latest/guide/webpack.html, it is recommended to include vendors like jQuery in the vendor.ts file. // Other vendors for instance jQuery, Lodash or Bootstrap // You can import js, ts, css, sass, ...

Executing a Function in a Service from a Component in Angular/TypeScript and Receiving a Return Value

I need guidance on how to effectively utilize the "getUserDocInfo()" function from a separate service within my component. How can I call this function and then leverage the data it returns for further operations? Component Example getToken(){ this. ...

Disabling breakpoints without bounds during TypeScript debugging in Visual Studio Code

While working on my Ubuntu machine using VS Code to debug a Nest.js TypeScript project, I am encountering issues with unbound breakpoints that are not being hit. Despite making various changes in the launch.json and tsconfig.json files, as well as trying o ...

Creating anonymous TypeScript class factories

Using TypeScript v2.2. In my codebase, there exists a class factory: export class A { name: string; } export function makeConstructor(name: string) { const newClass = class extends A { }; newClass.prototype.name = name; return newClass; } Howev ...