Я пытаюсь создать интерфейс строгой фильтрации:
type Filter<I, O extends I = I> = (value: I) => I extends O ? boolean : false
Написав эту строку, я хочу определить ограничение типа для функции, которая:
- получает значение типа
I
- возвращает
false
, если значение не ожидаемого типа (I extends O
не true
) - возвращает
true | false
если значение является ожидаемого типа и соответствует фильтру
Но Typescript игнорирует условный тип возврата:
type MessageA = { type: 'A' }
type MessageB = { type: 'B' }
type Message = MessageA | MessageB
const filter: Filter<Message, MessageA> = ({ type }) => type === 'A'
const inputMessage: Message = { type: 'B' }
if (filter(inputMessage)) {
// the following line produces error
const message: MessageA = inputMessage
// because according to TS compiler
// inputMessage is still `MessageA | MessageB`
}
Логически filter(inputMessage)
МОЖЕТ дать true
если inputMessage
равно типа MessageA
.
Я хотел бы понять «возможно ли это?» и «как это правильно написать?» если есть.
Я не ограничен версией машинописного текста, на данный момент установлена последняя (на данный момент) версия Typescript 3.9.5. Я использую VSCode 1.46, неважно, имеет ли это значение.