@raury

Почему у переменной тип unknown?

Почему у val тип unknown, а не string? Версия ts - 4.1.2
type A<T> = T extends (param: infer R) => void ? R : string;

type F = () => void

let val: A<F>;
  • Вопрос задан
  • 176 просмотров
Решения вопроса 1
bingo347
@bingo347 Куратор тега TypeScript
Crazy on performance...
Во-первых, infer в самом предикате участвует как any
Во-вторых, функция с меньшим количеством аргументов является подтипом для функции с большим количеством аргументов (это позволяет, например, отдать в колбэк функцию, которая не использует всех переданных ей аргументов)

То есть тип () => void является потомком типа (param: any) => void, а значит Ваш предикат в типе A становится истинным и уходит в ветку, где Вы возвращаете R из infer, который выводится к вершине иерархии - типу unknown

То что Вы задумали, можно сделать так:
type A<T> = T extends (...param: infer P) => void
  ? P extends [infer R, ...unknown[]]
    ? R
    : string
  : string;
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы