Я пишу типы для существующей библиотеки.Я столкнулся с проблемой определения ограничения для типа, где два типа переменных должны удовлетворять некоторому ограничению (T1 [T2] должен быть массивом некоторого типа).
У меня 1-й интерфейс
interface GenericInterfaceWithArray<ElementType> {
arrayOfElements: ElementType[];
push: (value: ElementType) => void;
}
и вторая, которая использует предыдущую, а также имеет 2 переменные типа:
interface OuterInterface<
ObjectContainingArray,
KeyOfPropertyWithArray extends keyof ObjectContainingArray
> {
nestedProperty: GenericInterfaceWithArray<ObjectContainingArray[KeyOfPropertyWithArray]>;
// line above has incorrect definition because
// ObjectContainingArray[KeyOfPropertyWithArray] is an array
// - can I take type from 'first array element' here?
// smth like this line below
// GenericInterfaceWithArray<ObjectContainingArray[KeyOfPropertyWithArray][0]>;
// this does not work:
// `Type '0' cannot be used to index type 'ObjectContainingArray[KeyOfPropertyWithArray]'.`
}
Использование:
interface InterfaceWithArrayProp {
arrayProp: number[];
}
const myType: OuterInterface<InterfaceWithArrayProp, 'arrayProp'>;
myType.nestedProperty.push(25); // here should be validation for `number`.
// Currently I have type: `number[]`
Я попытался определить внутренний интерфейс альтернативным способом: как общиймассив (менее удовлетворительный, но приемлемый, если нет способа для первой версии):
interface GenericInterfaceWithArray<ArrayOfElements extends Array<any>> {
arrayOfElements: ArrayOfElements;
push: (value: ArrayOfElements[0]) => void;
}
Но теперь у меня есть ошибка от OuterInterface
: Type 'ObjectContainingArray[KeyOfPropertyWithArray]' does not satisfy the constraint 'any[]'.
Можно ли определитьчто T1[T2]
является массивом и типом передачи этого первого элемента в качестве параметра для другого универсального интерфейса?