При условии, что я правильно понимаю ограничение, вы можете использовать условные типы для его представления:
type Operation<T> =
| FilterOp
| (T extends Array<any> ? ArrayFilterOp : never)
| (T extends string ? StringFilterOp : never)
| (T extends Date ? DateFilterOp : never);
type GenericFilter<T> = {
Property: string;
Value: T;
Operation: Operation<T>;
};
Это поддержит ваш заявленный вариант использования:
let dateFilter: GenericFilter<Date> = {
Property: "DateCreated",
Value: new Date(),
Operation: "DateIn"
};
а также работа с вспомогательной функцией, так что вы можете просто сделать вывод T
вместо указания ее вручную:
const asGenericFilter = <T>(filt: GenericFilter<T>) => filt;
let stringFilter = asGenericFilter({
Property: "Name",
Value: "Alice",
Operation: "StartsWith" // hinted as Operation<string>
})
Надеюсь, что это поможет;удачи!
Ссылка на код