如何解决Typescript元组类型映射不起作用:缺少默认数组属性
我想创建一个将形状为[...T[]]
的元组映射为[...TodoStepBlueprint<T>[]]
的类型。
我对打字稿的了解有限,但我想我了解到目前为止所做的事情。
这是我到目前为止所拥有的:(是How to 'map' a Tuple to another Tuple type in Typescript 3.0的扩展),使用打字稿(3.7.5)
interface Strategy<T extends [...TodoStepBlueprint<AbstractTodoData>[]]> {}
type MaybeType<T> = T extends AbstractTodoData ? TodoStepBlueprint<T> : never;
type MaybeTypes<Tuple extends [...AbstractTodoData[]]> = {
[Index in keyof Tuple]: MaybeType<
Extract<Tuple[Index],[...AbstractTodoData[]]>
>;
} & { length: Tuple["length"] };
interface TodoStepBlueprint<
T extends AbstractTodoData,K = [...AbstractTodoData[]]
> {
readonly todoType: Constructor<T>;
readonly name: string;
readonly possibleNext?: Strategy<MaybeTypes<K>>;
// naming identifier
}
这会产生打字错误:
Type 'MaybeTypes<K>' does not satisfy the constraint 'TodoStepBlueprint<AbstractTodoData,AbstractTodoData[]>[]'.
Type 'MaybeTypes<K>' is missing the following properties from type 'TodoStepBlueprint<AbstractTodoData,AbstractTodoData[]>[]': pop,push,concat,join,and 25 more.ts(2344)
某种程度上,打字稿不再理解它是一个数组。我做错了什么?
解决方法
感谢您的所有答复:
这是我的工作解决方案。
interface Strategy<T extends [...TodoStepBlueprint<AbstractTodoData>[]]> {
getPossibleNext(): T;
getNext(): T[number];
}
type EnsureTodoStepBlueprintType<T> = T extends AbstractTodoData
? TodoStepBlueprint<T>
: never;
type MapToTodoStepBlueprintArrayType<Tuple extends any[]> = {
[Index in keyof Tuple]: EnsureTodoStepBlueprintType<Tuple[Index]>;
} & { length: Tuple["length"] };
interface TodoStepBlueprint<
TodoType extends AbstractTodoData,PossibleNextTodoTypes extends AbstractTodoData[] = []
> {
readonly todoType: Constructor<TodoType>;
readonly name: string;
readonly possibleNext?: Strategy<
MapToTodoStepBlueprintArrayType<PossibleNextTodoTypes>
>;
// naming identifier
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。