Аргумент типа 'строка | число 'не присваивается параметру типа' число ' - PullRequest
1 голос
/ 06 марта 2020

Вопрос изменен Примером метода до конца: -

У меня есть интерфейс, как показано ниже для ввода объекта.

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

Из-за некоторых требований я должен назначить "string" для свойства "priority" в конце всех операций перед отправкой его в бэкэнд.

Поскольку я должен назначить строку, я попытался использовать оператор объединения: -

приоритет: номер | строка; Но все другие фрагменты кода, где бы я ни использовал другие операции, принимая это во внимание как число, также приводят к ошибке ниже:

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

Как мне обойти это и использовать приоритет как строку и число для ввода моего объекта.

Вот одно условие, в котором я использую интерфейс "IList" в качестве типа и присваиваю число, если multiGroupHeader имеет значение true, иначе мне нужно назначить строку: -

public updatePriorities(Lists: IList[]) {
  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: IList) => {
        if (list.priority === id) {
          list.priority = updatedPriorities[index];
        }
      });
    });
  } else {
    Lists.forEach((list: IList) => (list.priority = "CURRENT"));
  }
}

Ответы [ 2 ]

1 голос
/ 06 марта 2020

Один из способов обойти это - утвердить / сузить тип, прежде чем передать его функциям, которые ожидают только строку или число:

if (typeof list.priority === 'number') {
  // list.priority's type inside these braces is only 'number'
}

Существуют другие способы утвердить тип переменной тоже: https://www.typescriptlang.org/docs/handbook/basic-types.html#type -утверждения

0 голосов
/ 06 марта 2020

Вы можете привести к номеру:

const strOrNumber: string | number = 5;
const iAmSureThisIsANumber: number = strOrNumber as number;

Но, если он станет строкой, только перед отправкой его на сервер, было бы лучше иметь два IList. Да, это больше кода, но это делает вещи более явными.

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

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

С небольшим количеством сахара вы можете использовать тип утилиты .

type IListForServer = Omit<IList, 'priority'> & {priority: string};
...