Veryon890
Veryon890

Reputation: 400

TypeScript : Argument of type 'string | number' is not assignable to parameter of type 'number'

I have an interface as shown below for typing an object.

export interface IList{
  name: string;
  age: number;
  option: number;
  quantity: number;
  priority: number;
}

Due to some requirement I have to assign a "string" to the "priority" property at the end of all operations before sending it to the backend.

As I've to assign a string, I tried using a union operator :-

priority : number | string;

But all the other pieces of code wherever I used other operations taking this as a number into consideration is also throwing me the below error:

Argument of type 'string | number' is not assignable to parameter of type 'number'
  Type 'string' is not assignable to type 'number'.

How do I get around this and use priority as a both a string and number to type my object.

Here is one condition where I am using the "IList" interface as a type and assigning a number if multiGroupHeader is true, else I have to assign a string :-

  public updatePriorities(Lists) {
    if(!this.multiGroupHeader){
    const priorities = Lists.map((list:IList) => list.priority);
    const uniquePriorities = [...new Set(priorities)];
    if (uniquePriorities.length === 1 && uniquePriorities[0] === 1) {
      return;
    }
    uniquePriorities.sort((priority1: number, priority2: number) => priority1 - priority2);
    const updatedPriorities = uniquePriorities.map((priority: number, index: number) => {
      return index + 1;
    });

    uniquePriorities.forEach((id: number, index: number) => {
      Lists.forEach((list: List) => {
        if (list.priority === id) {
          list.priority = updatedPriorities[index];
        }
      });
    });
   } else {
     Lists.forEach((list:List) => list.priority = "CURRENT");
   }
  }

Upvotes: 1

Views: 7242

Answers (1)

Darsshan
Darsshan

Reputation: 956

The way you have constructed your interface, it should not have any typescript errors unless you're not following the contract of that interface.

I am assuming you are doing something like this:

 interface IList{
     name: string;
     age: number;
     option: number;
     quantity: number;
     priority: number | string;
 }

 class Test {
  constructor() {
    let listItem: IList = {
        name: "John Doe",
        age: 23,
        option: 2,
        quantity: 2,
        priority: 2
     };
    }
 }

This should not give you any errors. To check the type errors of this, you can use TypeScript Playground. There should be no reason for a workaround.

This is the link to the code above: https://www.typescriptlang.org/play/#code/JYOwLgpgTgZghgYwgAgJIBlgGcwG8BQyyIcAthAFzI5SgDmA3IcnHZcQK6kBG0TRAewAOYYAJBUQXXlH7IAjhzjhgYAJ6TpfZkNoDa6zT2jIAPtTC0QjfAF98+BABs4WLMgAqEHMgJEiCOI0HAhg+gAUAJS+zP7+ThBgyE7YYKiQpFQYqcgAvDFxhf4k5FQARABSAgAWIMgAIgIQZQA0sUX+rOwATADMbR2FwqLiVN0Dg-6KyqKGyOPtg7piBhrzi-62ckT29kA

I would recommend you to try it out there and see what are the actual contract errors you're facing.

Upvotes: 2

Related Questions