Ways to prevent the modification of a getter object's value

I am encountering an issue with my getter function, 'data', which returns an object. I am only able to retrieve the value since no setter has been implemented.

Despite not being able to set the value directly, I am still able to modify the data object. How can I prevent this from happening?

dataClass.ts

interface dataInterface {
  test1: string;
  data: object;
}

class dataModel {
  private _data: dataInterface;
  get data(): dataInterface {
    return this._data;
  }
}

externalClass.ts

class externalClass {
  testData = new dataModel()

  testing(){
    this.testData.data.test1 = "WW"; // I can set a value even though data is meant to be read-only
    this.testData.data = {test1:"WW",data:{} // This should throw an error as expected
  }
}

After reviewing the code above, could you please provide guidance on how to prevent the modification of a getter object's value?

Thank you

Answer №1

One issue arises when attempting to modify the value of a read-only getter. This does not alter the reference stored in data, but instead updates a field within the object, which is permissible.

To address this, the Readonly mapped type can be used to designate all fields of the returned object as read-only:

interface dataInterface {
  test1: string;
  data: object;
}

class dataModel {
  private _data: dataInterface;
  get data(): Readonly<dataInterface> {
    return this._data;
  }
}

class externalClass {
  testData = new dataModel()

  testing(){
    this.testData.data.test1 = "WW"; // error
  }
}

Note: When dealing with nested structures, Readonly only enforces read-only on the first level. In such cases, creating a DeepReadonly type, as recommended here, may be necessary.

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

What is the method by which the Angular compiler handles instances of multiple template reference variables sharing the same name

I am eager to start contributing to Angular and have a unique idea for a feature. My proposal is to enhance the template compiler so that it issues a warning if a template contains two variables with identical names. I believe I am on the right track by ...

Enhancing code completion with IntelliSense for customized styled components' themes

When using a theme in styled components, I am attempting to enable IntelliSense. In my code snippet below (index.tsx), I utilize ThemeProvider: import React from 'react'; import ReactDOM from 'react-dom/client'; import { ThemeProvider } ...

Discovering the root cause of an Angular binding failure

In my Angular application, I have implemented support for multiple browser tabs using angular-redux @select and {{ property }} bindings. Everything was working fine until I decided to configure my angular store with the redux-state-sync middleware to use b ...

Configuring Jest for Typescript with Module Resolution

The current project utilizes ReactJS, Typescript, Webpack, and Jest. To optimize import and achieve module resolution, certain configurations were adjusted: TSConfig.js: "compilerOptions": { "baseUrl": "src",} Webpack.config.js alias: { Common: path. ...

Improving Performance with Reusing Selectors in Ngxs

Working with Angular using the container/presentation pattern and Ngxs presents a challenge for me. The issue I am facing is that I have one container component nested within another container component, both calling the same @Select: @Select(State.example ...

What strategies can I employ to optimize this code in RXJS and Angular?

Is it possible to streamline these nested arrays for more efficient execution after all subscriptions have been completed? I believe there may be a solution involving the use of pipes, mergeMaps, concatMaps, etc. this.teams = [ { Assignments: [{Id: ...

Tips for Observing angular forkJoin for multiple responses during unit testing with Jasmine

Currently, I am focusing on unit testing and I have a function that makes multiple API calls simultaneously. Although I have used spyOn on the service function, I am facing difficulty in returning multiple responses. Can anyone provide guidance on where I ...

Utilize an enum to serve as a blueprint for generating a fresh object?

I've defined an enum as shown below: export enum TableViewTypes { user = 'users', pitching = 'pitching', milestones = 'milestones', mediaList = 'mediaList', contacts = 'contacts' } ...

Using Stack and Drawer Navigations Together in React Native Navigation(v6)

I am looking to merge Stack and Drawer navigations. I have multiple screens and wish to display select screen labels in the drawer tab. <RootNavigatorStack.Navigator> <RootNavigatorStack.Screen name="DrawerTab" component={DrawerNavig ...

Initiating Angular APP_INITIALIZERThe Angular APP_INITIALIZER

I am a newcomer to Angular and currently utilizing Angular6 for development purposes. I have a specific query regarding my app. Before the app initializes, I need to invoke three services that provide configurations required by the app. Let's refer to ...

Passing layout to a Vue component using the setup script

LayoutComponent <template> //some code here ... <div> <slot></slot> </div> </template> In the composition api, it is possible to pass a layout by importing it and then passing it into t ...

Challenge encountered with TypeScript integration in the controller

I am currently in the process of converting a website from VB to C# and incorporating TypeScript. I have successfully managed to send the data to the controller. However, instead of redirecting to the next page, the controller redirects back to the same pa ...

Encountering an undefined value in Angular outside of the subscription

I am facing an issue where I need to use the value from the user outside the subscribe function in order to assign it to my tweet class. However, when I try to print it outside the subscribe function, it shows as undefined. Can anyone provide a solution fo ...

There is no assigned value in scope for the shorthand property. You must either declare one or provide an initializer

I'm just starting out with TypeScript. Encountering the error 'No value exists in scope for the shorthand property 'firstName'. Either declare one or provide an initializer.' while using Prisma with Next.js to create a new user in ...

Is it possible for an uninitialized field of a non-null literal string type to remain undefined even with strict null checks in

It seems that there might be a bug in Typescript regarding the behavior described below. I have submitted an issue on GitHub to address this problem, and you can find it at this link. The code example provided in that issue explains the situation more clea ...

Issues with responsiveness and calculated attributes in Vue 3 using the Composition API

Within this menu, there are different items: Item 1 (marked as number 1 in orange) with the path: http://localhost:8080/#/documents Item 2 (marked as number 2 in orange) with the path: http://localhost:8080/#/documents/1 Item 3 (marked as number 3 in or ...

Is there a way to inform TypeScript that an object can only return properties from values found within an array?

I am trying to ensure that the return object from a function in TypeScript only allows keys that correspond to string values present in an array passed as an argument to the function. The returned object should contain a subset of keys from a list of valid ...

Enhance your React Typescript High Order Component by incorporating additional properties and implementing them

I am in the process of creating a React HOC with specific requirements: It should take a component as input, modify the hidden property (or add it if necessary), and then return the updated component The rendered component should not display anything whe ...

Creating a Typescript version of the mongodb project aggregation functionality

Present scenario: I am currently working on creating a type-safe wrapper for the node-mongodb driver. I am facing challenges in determining the return type for the project aggregation stage. Feel free to check out the TypeScript Playground here class Base ...

Angular 11 is indicating that the type 'File | null' cannot be assigned to the type 'File'

Hey there, I'm currently diving into Angular and I'm working on an Angular 11 project. My task involves uploading a CSV file, extracting the records on the client side, and saving them in a database through ASP.NET Web API. I followed a tutorial ...