Как использовать предикаты типа, чтобы присвоить тип значению неизвестного типа? - PullRequest
0 голосов
/ 27 мая 2020

У меня есть функция предиката типа, которая, как ожидается, придаст тип объекту JSON

interface Duck {
  canQuack: true
}

function isDuck(duck: unknown): duck is Duck {
  if (typeof duck !== "object" || ! duck) return false
  return duck.canQuack === true
}

Но машинописный текст жалуется, что canQuack не завершается на object.

Как выполнить проверку типа для объекта с типом unknown?

Ответы [ 2 ]

1 голос
/ 27 мая 2020

Вам понадобится дополнительная защита типа

interface Duck {
  canQuack: true;
}

function isDuck(duck: unknown): duck is Duck {
  if (typeof duck !== "object" || !duck) return false;
  const canQuackGuard = (o: object): o is { canQuack: unknown } =>
    "canQuack" in o;
  return (
    canQuackGuard(duck) &&
    typeof duck.canQuack === "boolean"
  );
}
0 голосов
/ 27 мая 2020

Если вы посмотрите документацию машинописного текста (https://www.typescriptlang.org/docs/handbook/advanced-types.html#using -type-predicates ), они рекомендуют привести к типу, а затем проверить значение. Просто убедитесь, что приведение безопасно, чтобы не получить ошибок во время выполнения (поэтому мы сначала проверяем, что это объект). В вашем случае решением будет.

interface Duck {
  canQuack: true
}

function isDuck(duck: unknown): duck is Duck {
  // Check that the candidate is an object
  return duck != null && (typeof duck === 'object' || typeof duck === 'function') 
  // check that it has canQuack
    && (duck as Duck).canQuack === true;
}

Edit : проверка объекта действительно работает, проверка «is object» скопирована из loda sh https://github.com/lodash/lodash/blob/4.17.15/lodash.js#L11745

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...