Design an interface that includes solely the modifiable fields from a broader interface

I have a unique situation where I am working with an interface that is based on a schema definition provided by a validation library. This schema includes some readonly values that are meant to be set by the server. However, when I am preparing data to send to the server, I want to reuse this interface as much as possible. In an ideal scenario, I would like to create a type transformation like:

type RemoveReadonly<T> = // ???;

// And apply it like
interface IFoo {
  a: number;
  readonly b: string;
}

type Transformed = RemoveReadonly<T>; // { a: number; }

To handle this, I am implementing a builder pattern for constructing data to be sent to the server. It would be beneficial to only allow setting mutable values in the internal partial representation I am creating, in order to prevent errors such as mistakenly sending a value for a readonly field at compile time.

I have been struggling to find an effective way to achieve this. While TypeScript does provide methods to eliminate the readonly property from an interface (to generate a Writable or Mutable version of the interface), there seems to be no straightforward approach to filter out or Exclude these values.

Answer №1

If you're looking to eliminate the readonly attribute from a specific type, there is a syntax available for that. However, filtering out readonly types can be more challenging and I haven't come across a straightforward solution for it.

type Writeable<T> = { -readonly [P in keyof T]: T[P] };
type MutableRequired<T> = { -readonly [P in keyof T]-?: T[P] }; // Removing readonly and ?

Check out this link for more information on TypeScript 2.8 release notes

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

Dynamically modifying the display format of the Angular Material 2 DatePicker

I am currently utilizing Angular 2 Material's DatePicker component here, and I am interested in dynamically setting the display format such as YYYY-MM-DD or DD-MM-YYYY, among others. While there is a method to globally extend this by overriding the " ...

Dynamic table row that expands to show additional rows sourced from various data sets

Is there a way to expand the table row in an angular-material table when it is clicked, showing multiple sets of rows in the same column as the table? The new rows should share the same column header but not necessarily come from the same data source. Whe ...

No bugs appeared in Next.js

I am currently in the process of migrating a large create-react-app project to NextJS. To do this, I started a new Next project using create-next-app and am transferring all the files over manually. The main part of my page requires client-side rendering f ...

Utilizing the Node.js `cluster` module in TypeScript/CommonJS with DT @types/[email protected]

I am currently managing a TypeScript application using Node's cluster API that was successfully built with Node 14.x and the cluster types from DT. Upon transitioning this application to Node 16.x, I updated the @types/node package from version 14.x ...

The issue with the React Hook for window resize not updating remains unresolved

I have a React Hook designed to update the window size on resize, but it's not functioning correctly. Can someone please help explain why this is happening and provide guidance on how to utilize this hook in another component to create a Boolean value ...

Update the input field's placeholder with the current date

Is it possible to dynamically set the placeholders for <input type='date' placeholder='{{ 'currentDate' }}'>? I have tried using the following variable: currentDate = this.datePipe.transform(new Date(), "yyyy-MM-dd& ...

NgFor is designed to bind only to Iterables like Arrays

After exploring other questions related to the same error, I realized that my approach for retrieving data is unique. I am trying to fetch data from an API and display it on the page using Angular. The http request will return an array of projects. Below ...

Are there any significant changes in Angular when transitioning from Angular 8 to 9 with regards to the nativeElement?

After upgrading my angular cli version to 9.1.4 from the previous version 8, I am wondering if there are any breaking changes related to nativeElement functionality. Below is a snippet of code from my TypeScript file where I have used nativeElement: impo ...

Transform a YAML document into either a JSON blueprint or a TypeScript structure

Currently seeking an efficient tool, preferably in Node JS, that can convert a YAML file from swagger into either a JSON SCHEMA or a typescript interface. The process I have used so far is: YAML->RAML->JSON SCHEMA->TYPESCRIPT interface STEP1: Co ...

Ways to expand a TypeScript interface and make it complete

I'm striving to achieve the following: interface Partials { readonly start?: number; readonly end?: number; } interface NotPartials extends Partials /* integrate Unpartialing in some way */ { readonly somewhere: number; } In this case, NotPar ...

I'm looking for a way to implement a jQuery-style initialization pattern using TypeScript - how can I

My library utilizes a jQuery-like initialization pattern, along with some specific requirements for the types it should accept and return: function JQueryInitializer ( selector /*: string | INSTANCE_OF_JQUERY*/ ) { if ( selector.__jquery ) return select ...

Typescript error: The 'datepicker' property is not found on the type 'IAugmentedJQuery'

Currently, I am working with AngularJS and Typescript. I encountered an error stating "Property 'datepicker' does not exist on type 'IAugmentedJQuery'.". Can someone please provide guidance on how to fix this issue? angular.element(&a ...

Can you suggest a way to revise this in order to include the type of property (string)?

Here is a snippet of working code that raises a question about refactoring to improve the readability and functionality. Consider renaming the method to isPropValueSame. import * as _ from 'lodash'; const diff = _.differenceWith(sourceList, comp ...

Retrieve all the characteristics accessible of a particular course

I am facing a situation where I have the following class structure: class A { id: number propertyA: string constructor(id: number) { this.id = id } } let a = new A(3) console.log(SomeFunction(a)) // expected output = ['id', ' ...

Avoiding circular imports in Angular modules

After restructuring my angular app from a monolithic shared feature module to smaller ones, I faced a challenge with what appears to be a cyclic dependency. The issue arises when I have components such as triggerA, modalA, triggerB, and modalB interacting ...

Monitor the input value for any changes in Angular 8 using the listen component

Hey there! I'm currently working with a component that includes the input @Input() userId: number[] = []; to receive a list of user IDs. Specifically, I have integrated this component into another one, such as the news component: <kt-user-post-li ...

Error in TypeScript: It is not possible to use a component with MUI styling as a JSX element

I can't figure out what's going wrong. I'm attempting to include a child component in the main page, and I have a feeling it has something to do with MUI styles being applied at the end. I removed all unnecessary code and still encounter thi ...

Using type definitions in non-TS files with VSCode: A beginner's guide

My code is not in TypeScript, shown here: // foo.js module.exports = app => { // some logic here } I want to enhance my development experience by using TypeScript definition files to specify the type of the argument app, enabling VSCode to provide ...

Angular 4 - Seeking clarification on the usage of *ngComponentOutlet

When using *ngComponentOutlet, the following code snippets are employed to handle the displaying: Below is a snippet of functional code: this.displayComponent({ 'objects':[ {component: ToDisplayAComponent, expanded: fals ...

Guide to Conditionally Importing a Module in Angular

I am currently developing a module for Search integration. Instead of directly importing the SearchModule inside my app.module.ts file, I would like to implement a method where an API is called and the SearchModule is imported based on the API response. @N ...