TypeScript не выведет для вас определенный тип защиты .Вы должны аннотировать его самостоятельно, например, так:
const makeIsBox = <L extends Letter>(fn: (letter: Letter) => letter is L) => (
box: Box
): box is Extract<Box, { type: L }> => fn(box.type);
Это все еще должно быть общим в L
.Он принимает функцию типа (l: Letter)=>l is L
и возвращает функцию типа (b: Box)=>b is Extract<Box, {type: L}>
.Это использует Extract
тип утилиты , чтобы выбрать только члена объединения Box
, который можно назначить на {type: L}
.
Это должно работать так, как вы хотите:
const isBoxA = makeIsBox(isA);
declare const box: Box;
if (isBoxA(box)) {
const value = box.value;
} else {
const status = box.status;
}
Надеюсь, это поможет;удачи!
Ссылка на код