TypeScript выдает ошибку, если вместо возвращаемого значения выдает ошибку - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть эта функция:

public getObject(obj:IObjectsCommonJSON): ObjectsCommon {
    const id = obj.id;
    this.objectCollector.forEach( object => {
      if(object.getID() === id){
        return object;
      }
    });

    throw new Error(`Scene.getObject(). Object ${id} not found`); 
  }

И я получаю следующую ошибку TS:

Не все пути кода возвращают значение.

Это правда, потому что object.id не должен быть в массиве objectCollector, и в этом случае я выбрасываю ошибку.Как я мог сделать эту работу?Я пытался сделать

public getObject (obj: IObjectsCommonJSON): ObjectsCommon |void

Но это тоже не работает

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Ошибка внутри обратного вызова на forEach(), а не на вызов getObject().Обратите внимание, что даже если вы используете функцию со стрелкой, это все же функция.И return внутри обратного вызова возвращается из функции стрелки, а не из getObject().Обратите внимание, что для функций стрелок , x => {return y} эквивалентно x => y.Невозможно вернуться из внешней функции из функции стрелки.

Итак, это ваша функция:

object => {
  if(object.getID() === id){
    return object;
  }
}

И компилятор (если вы включили --noImplicitReturns) замечаетчто эта функция только иногда возвращает значение и поэтому жалуется.

Конечно, forEach() не волнует возвращаемое значение его обратного вызова, и это все равно не было вашим намерением.Исправление заключается в том, чтобы делать то, что предлагали другие ... использовать find() вместо forEach(): ... this.objectCollector.find(o => o.getID()===id) ... или использовать цикл for:

for (let object of this.objectCollector) {
  if (object.getID() === id) {
    return object; // no callback, this returns from the getObject function.
  }
}

Надежда, которая помогает;удачи!

0 голосов
/ 21 ноября 2018

Я бы использовал find() и добавил бы, если проверка выдает ошибку.

public getObject(obj:IObjectsCommonJSON): ObjectsCommon {
  const id = obj.id;
  const item = this.objectCollector.find(object => object.getID() === id);
  if (!item) {
    throw new Error(`Scene.getObject(). Object ${id} not found`);
  }
  return item;
}
...