Чтобы исключить некоторые столбцы для сопоставленного типа, нам нужно использовать промежуточный вспомогательный тип, позволяющий нам выбирать только ключи , соответствующие нашему условию, T[K] extends Desc
:
type ConfigurableColumnsKeys<T extends object> = {
[K in keyof T]: T[K] extends Desc ? K : never
}[keyof T];
Учитывая это, ColumnConfig
просто нужно отобразить этот общий тип c вместо исходного keyof T
:
type ColumnConfig<T extends object> = {
[P in ConfigurableColumnsKeys<T>]: Column<P>[]
};
Тогда ваш объект конфигурации будет правильно проверен:
// Error
name: [
{ field: 'abc', active: true }
]
Если вам нужно разрешить также массивы (т. Е. Address[]
вместо Address
), вы можете изменить тип помощника, отметив T extends Desc[]
. Кроме того, вам понадобится также помощник UnboxArray
, чтобы извлечь значение элемента Order[]
-> Order
для вашей конфигурации столбца:
type ConfigurableColumnsKeys<T extends object> = {
[K in keyof T]: T[K] extends Desc ? K : T[K] extends Desc[] ? K : never
}[keyof T];
type UnboxArray<T> = T extends Array<infer V> ? V : T;
type ColumnConfig<T extends object> = {
[P in ConfigurableColumnsKeys<T>]: Column<UnboxArray<T[P]>>[]
};
Вы можете увидеть его на работе на следующей площадке: Playground Link