Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 类和值的交错数组的类型_Typescript - Fatal编程技术网

Typescript 类和值的交错数组的类型

Typescript 类和值的交错数组的类型,typescript,Typescript,我正在使用一个函数构建一个API,该函数接受类和初始值的交错列表,以分配给它们的实例。值必须可分配给其前一个类的实例,并且可以省略。电话如下所示: create(A, {x: 0, y: 0}, B, C, D, {w: 'foo'}); function register<G extends [...VariadicComponent]>(...args: [...G, ...G]) 我试着这样定义一个类型: interface Type<C> { new()

我正在使用一个函数构建一个API,该函数接受类和初始值的交错列表,以分配给它们的实例。值必须可分配给其前一个类的实例,并且可以省略。电话如下所示:

create(A, {x: 0, y: 0}, B, C, D, {w: 'foo'});
function register<G extends [...VariadicComponent]>(...args: [...G, ...G])

我试着这样定义一个类型:

interface Type<C> {
  new(): C;
}

type TypesWithInitializers<C> =
  [] |
  [Type<any>, ...TypesWithInitializers<any>] |
  [Type<C>, Partial<C>, ...TypesWithInitializers<any>];

function create(...args: TypesWithInitializers) {...}
接口类型{
新的():C;
}
类型初始化器=
[] |
[类型,…类型初始化器]|
[类型,部分,…类型初始化器];
函数创建(…参数:类型初始化器){…}
此操作失败,错误为“类型别名”“组件类型初始化器”“循环引用自身。ts(2456)”。我不知道如何解决这个问题


我的理解是允许接口是递归的,但我不知道如何在接口中复制rest操作符,只知道如何声明特定元素或所有元素。我还看到了一些递归定义JSON结构的示例,这些JSON结构看起来与我正在做的非常相似,但我不知道关键区别是什么。

看起来无法创建循环类型别名,类似于
type MyType=MyType
的内容是非法的

在他的帮助下,我做了如下的事情

register(Test, {x: 1, y: 3})
register(Test, OtherTest)
register(Test, {x: 1, y: 3}, OtherTest)
register(Test, {test: "Yo"}, OtherTest, {test: 4})
register(Test, {test: "Yo"}, OtherTest, {test: 4}, OtherTest, {test: 5})
register(Test, {test: "Yo"}, OtherTest, {test: 4}, OtherTest, {test: 5}, Test, Test)
它的工作方式是要么有一堆
[Type,Object]
,后面跟着一堆
[Types]
,反之亦然,要么是两个元组中的任何一个

我的测试类型如下所示

@component
class Test {
    /** A test member of Test class */
    @prop(Type.int16) declare test: number
}

@component
class OtherTest {
    /** A test member of Test class */
    @prop(Type.int16) declare test: number
}
然后,我构建了标记的元组联合,如下所示

type Component =
| []
| [IType<any>]
| [IType<any>, Partial<any>]

type VariadicComponent = [...Component, ...Component]
[…G,…G]
在那里,因此我们可以有不同的arg类型。除非代码中同时包含
[…Component,…Components]
[…G,…G]
,否则它不会工作