Определение объекта с любой опорой в машинописи - PullRequest
0 голосов
/ 03 октября 2018

Я только что переключился с JavaScript на TypeScript и преобразую кучу своего кода.

Я часто использовал этот код в JavaScript (уже преобразован в TypeScript):

function isObject (payload: any): payload is object {
  const type: string = Object.prototype.toString.call(payload).slice(8, -1)
  return type === 'Object'
}

Тогда я бы делал такие вещи в JavaScript

if (isObject(payload) && payload.id) return payload.id

Однако в TypeScript теперь я получаю ошибку, что id не существует в object.

Так что вместовозвращая payload is object в моей функции isObject, я думаю, что я должен вернуть что-то, что является объектом с любым реквизитом с любыми значениями.

Как я могу сделать это лучше всего?

1 Ответ

0 голосов
/ 03 октября 2018

Вы можете определить его, используя индексную сигнатуру , хотя я не уверен, какую выгоду вы получите от него по сравнению с any, так как вы можете индексировать в него любым свойством, оно не соответствуетбыть более безопасным для типов, чем любой.

function isObject (payload: any): payload is { [name: string]: any} {
    return typeof payload === 'object'; // this should work just the same
}

let payload: any;
if (isObject(payload) && payload.id) payload.id

Возможно, если вы начнете использовать строгие проверки на ноль, одним из преимуществ может быть то, что вы можете удалить undefined из типа результата:

function isObject (payload: any): payload is { [name: string]: object | number | string | boolean | undefined} {

    return typeof payload === 'object'
}

let payload: any;
if (isObject(payload) && payload.id) payload.id // payload.id is string | number | true | object here
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...