I write types for existing library. I've faced with problem of defining constraint for type where two variable types should satisfy some limitation (T1[T2] should be an array of some type).
I have 1st interface
interface GenericInterfaceWithArray<ElementType> {
arrayOfElements: ElementType[];
push: (value: ElementType) => void;
}
and second one which uses previous one and also has 2 type variables:
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]'.`
}
Usage:
interface InterfaceWithArrayProp {
arrayProp: number[];
}
const myType: OuterInterface<InterfaceWithArrayProp, 'arrayProp'>;
myType.nestedProperty.push(25); // here should be validation for `number`.
// Currently I have type: `number[]`
I've tried defining inner interface in alternative way: as generic of array (less satisfying but acceptable if there is no way for first version):
interface GenericInterfaceWithArray<ArrayOfElements extends Array<any>> {
arrayOfElements: ArrayOfElements;
push: (value: ArrayOfElements[0]) => void;
}
But now I have an error from OuterInterface
: Type 'ObjectContainingArray[KeyOfPropertyWithArray]' does not satisfy the constraint 'any[]'.
Is it possible to define that T1[T2]
is an array and pass type of this first element as parameter for another generic interface?
OK, I figured out that I can use conditional types.
type FirstArrayElement<ElementsArrayType> = ElementsArrayType extends any[] ? ElementsArrayType[0] : never;
interface OuterInterface<
ObjectContainingArray,
KeyOfPropertyWithArray extends keyof ObjectContainingArray
> {
nestedProperty: GenericInterfaceWithArray<FirstArrayElement<ObjectContainingArray[KeyOfPropertyWithArray]>>;
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.