Получить тип из предиката typeguard - PullRequest
2 голосов
/ 30 мая 2020

Обычно тип typeguard определяется как таковой:

(value: unknown) => value is Type

Где выделенная часть называется предикатом типа документацией :

(value: unknown) => **value is Type**

Забегая вперед, мы могли бы сказать (я не знаю, как, если даже в документации это определяется), что value - это параметр typeguard , is - это Двоичный код TypeScript оператор / ключевое слово для определения предикатов типа и Type - тип, который фактически гарантирует typeguard, гарантированный тип . Поскольку мы используем typeguards, чтобы гарантировать тип значения, мы могли бы сказать, что Type - самая интересная часть определения.

В силу этого возможно ли извлечь Type из определения типа typeguard ? Как?

Я думаю о чем-то вроде:

type Type = typeof typeguard; // (value: unknown) => value is Type
type TypePredicate = TypePredicateOf<Type>; // value is Type
type GuaranteedType = IsOf<TypePredicate>; // Type

Где GuaranteedType - желаемый результат.


Погуглил, у меня только нашел ответы по поводу определений типов generi c typeguards , но не понял, как получить из него часть Type.

1 Ответ

2 голосов
/ 30 мая 2020

Вы можете использовать условный вывод типа с ключевым словом infer, чтобы извлечь защищенный тип из сигнатуры защиты типа. Что-то вроде:

type GuardedType<T> = T extends (x: any) => x is infer U ? U : never;

И учитывая некоторые охранники определенного пользователем типа:

function isString(x: any): x is string {
  return typeof x === "string";
}

interface Foo {
  a: string;
}

function isFoo(x: any): x is Foo {
  return "a" in x && typeof x.a === "string"
}

Вы можете видеть, что это работает, как рекламируется:

type S = GuardedType<typeof isString>; // string
type F = GuardedType<typeof isFoo>; // Foo

Хорошо, надеюсь, это поможет; удачи!

Детская площадка ссылка на код

...