Общее ограничение на переменные нескольких типов - PullRequest
0 голосов
/ 14 мая 2019

Я пишу типы для существующей библиотеки.Я столкнулся с проблемой определения ограничения для типа, где два типа переменных должны удовлетворять некоторому ограничению (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] является массивом и типом передачи этого первого элемента в качестве параметра для другого универсального интерфейса?

1 Ответ

0 голосов
/ 14 мая 2019

ОК, я понял, что могу использовать условные типы.

type FirstArrayElement<ElementsArrayType> = ElementsArrayType extends any[] ? ElementsArrayType[0] : never;

interface OuterInterface<
  ObjectContainingArray,
  KeyOfPropertyWithArray extends keyof ObjectContainingArray
> {
  nestedProperty: GenericInterfaceWithArray<FirstArrayElement<ObjectContainingArray[KeyOfPropertyWithArray]>>;
}
...