Присвойте тип типу JSON, который может не анализироваться - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть этот бит кода. Распространенная проблема, когда я не всегда могу вспомнить, возвращает ли API JSON или проанализированный объект.

  github.repos.getForOrg({org}, (err: any, res: any) => {

      if (err) {
        return cb(err, null);
      }

      try {
        res = <Array<{ clone_url: string }>>JSON.parse(res);
      }
      catch (err) {
        // ignore
      }


      const cloneUrls = res.map(item => item.clone_url);

  });

Проблема, однако, заключается в том, что он распознает, что это массив, но он не фиксирует тип элемента в массиве. Это может быть ошибка TS, не уверен, кажется странным, хотя он может принять, что это массив, но не допустить знание типа элементов?

enter image description here

Ответы [ 2 ]

0 голосов
/ 15 сентября 2018

Я бы написал так:

let result: Array<{ clone_url: string }> = null;
if (res.constructor === Array) {
    result = res as Array<{ clone_url: string }>;
} else if (typeof res === 'string') {
    result = JSON.parse(res) as Array<{ clone_url: string}>;
} else {
    throw Error('unexpected type for github repo list response, neither array nor string');
}

После этого используйте result вместо res.

0 голосов
/ 15 сентября 2018

Поскольку res имеет тип any, TypeScript разрешит вызов любого имени метода (включая map) с любыми аргументами. Аннотируя res с типом any, вы указали, что хотите такое поведение для res. Поскольку обратный вызов приносит новую переменную item в область видимости для тела, TypeScript дает вам ошибку noImplicitAny, чтобы дать вам новую возможность решить, хотите ли вы такое же свободное поведение для операций на item.

...