Putting together object attribute values in typescript

Is there a way in TypeScript to restrict the possible values of an object based on specific conditions? Here is my idea:

interface IObject = {
    key1: string;
    key2: string;
    key3: "A" | null;
    key4: (if key3 is 'A' then allow 'value1' or 'value2', else if it is null then allow "value3" or "value4") 
}

Can TypeScript handle this kind of restriction?

Answer №1

To define the type, you can do it in this manner:

type MyObject = {
  prop1: string;
  prop2: string;
} & ({
  prop3: "A",
  prop4: 'value1' | 'value2'
} | {
  prop3: null,
  prop4: "value3" | "value4"
})

This code creates a combination of all possible values for prop3 and prop4, then combines them with the other properties.

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

Basic exam but located in a place that is not valid

Here is a test I am working on: // import {by, element, browser} from "protractor"; describe('intro', () => { beforeEach(() => { browser.get(''); }); it('should have multiple pages', () => { let buttonOn ...

Troubleshooting server side rendering and Typescript in VueJs: An issue arises

I'm currently working on building a stack with Server Side Rendering (SSR) and Typescript. Things seemed to be going smoothly until I encountered the error: TypeError: Cannot read property 'render' of undefined. Below is the complete stack t ...

Node C++ Addon Typescript declaration file

I have developed a Node C++ Addon that wraps a class similar to the one outlined in the official Node documentation. By using require(), I am able to access my addon and retrieve the constructor for my class in order to instantiate it. const { MyClass } = ...

Create a solution that is compatible with both web browsers and Node.js

I am developing a versatile library that can be utilized in both the browser and in node environment. The project involves three json config files, with the latter two extending the tsconfig.json. tsconfig.json (contains build files) tsconfig.browser.js ...

Converting HTML to PDF with Angular 2

I'm looking for a solution to convert an HTML template to PDF and download the file in Angular 2. Specifically, I need TypeScript code that can achieve this. Can anyone provide guidance or share some sample code? ...

Is it possible for a service to retrieve a component's template?

I am faced with a scenario where two services (A and B) need to communicate with each other. Service A is required to build a chart based on asynchronous data received from service B, which is used in other areas so it operates independently. I attempted t ...

A warning has been issued: CommonsChunkPlugin will now only accept one argument

I am currently working on building my Angular application using webpack. To help me with this process, I found a useful link here. In order to configure webpack, I created a webpack.config.js file at the package.json level and added the line "bundle": "web ...

Arranging a list of objects in Angular 6

I am facing difficulties in sorting an array of objects The structure of the object is as follows: https://i.sstatic.net/z5UMv.png My goal is to sort the *ngFor loop based on the group_id property. component.html <ul *ngFor="let list of selectgi ...

Unable to modify the Jest mock function's behavior

The issue I am facing involves the following steps: Setting up mocks in the beforeEach function Attempting to modify certain mock behaviors in specific tests where uniqueness is required Encountering difficulty in changing the values from the in ...

Encountering issues with production deployment due to difficulties with CLI package.json scripts execution

Upon creating a basic application using the CLI tool (v6.3.0), I encountered an issue when attempting to push it to a production server. My deployment process involves using Shipit (although this may not be relevant), and part of it includes installing np ...

Display React elements on the web page

Seeking assistance from anyone! I've been grappling with a problem and can't seem to figure out a solution. Here's the scenario: My current setup involves a sidebar and a top bar for navigation in React. Check out my app so far in this imag ...

Guidance on incorporating a function as a prop in React using TypeScript

I'm currently learning TypeScript with React and ran into an issue. I attempted to pass a function as a property from my App component to a child component named DataForm. However, I encountered the following error: Type '(f: any) => any&ap ...

Transferring various sets of information into a single array

In an attempt to generate JSON data in an array for passing to another component, I followed a method outlined below. However, being relatively new to this field, my execution may not have been optimal as expected. employeeMoney: any[] = []; employeeId: an ...

Can sweetalert2 be used as a tooltip?

I have a query, is it feasible to include a tooltip in the alert message? Alternatively, could there be another tooltip option available? Swal.fire({ title: '<strong>An example with HTML tags</strong>', icon: 'info', ...

The outcome of a promise is an undefined value

I am facing an issue where I need to access the result of my API call outside the promise, but the value I receive is always undefined. Within the OrderService : public async getOrderPrice(device: string) : Promise<any> { this.urlOrderPrice = th ...

Retrieve a single user using a query in the GraphQL platform

I've been struggling to create a GraphQL query in Express that retrieves only one user instead of all users every time. This is the query I'm using, incorporating TypeORM as my ORM: import { GraphQLList, GraphQLID } from 'graphql'; imp ...

Cannot display value in NumericFormat when using MUI TextField due to prefix restrictions

When using MUI TextField with the NumericFormat and prefix prop, there seems to be an issue. If I start typing a number quickly, only one digit gets registered. On the other hand, if I type slowly all my numbers show up but the prefix disappears. All inp ...

What is the best way to initiate multiple processes in Node.js and ensure they finish before proceeding?

When working with Node.js and TypeScript, my goal is to initiate multiple processes using the spawn function. Afterwards, I aim to ensure all of these processes are completed before proceeding to execute any additional commands. ...

Exploring function overloading in Typescript using custom types

I encountered an issue here that I believe has 2 possible solutions. Let's start with my initial implementation using function overloading: type PostgresConnectionOptions = { dialect: "postgres"; config: pg.PoolConfig; }; type MysqlConne ...

Error in AWS Cloud Development Kit: Cannot access properties of undefined while trying to read 'Parameters'

I am currently utilizing aws cdk 2.132.1 to implement a basic Lambda application. Within my project, there is one stack named AllStack.ts which acts as the parent stack for all other stacks (DynamoDB, SNS, SQS, StepFunction, etc.), here is an overview: im ...