【问题标题】:Type for an interleaved array of classes and values类型和值的交错数组
【发布时间】:2021-05-11 00:29:00
【问题描述】:

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

create(A, {x: 0, y: 0}, B, C, D, {w: 'foo'});

我尝试定义一个像这样的类型:

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

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

function create(...args: TypesWithInitializers) {...}

这会失败,并出现错误“类型别名 'ComponentTypesWithInitializers' 循环引用自身。ts(2456)”。我不知道如何解决这个问题。

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

【问题讨论】:

    标签: typescript


    【解决方案1】:

    看起来你不能做一个循环类型别名,像type MyType = MyType这样的东西是非法的。

    variadic tuple types 的帮助下,我做了如下的事情?

    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]
    

    VariadicComponent...Component 的数量决定了我们可以在标记的元组之间翻转多少次。然后函数签名如下所示:

    function register<G extends [...VariadicComponent]>(...args: [...G, ...G])
    
    

    [...G, ...G] 在那里,所以我们可以有不同的 arg 类型。除非我们同时在代码中同时包含[...Component, ...Components] [...G,...G],否则它不起作用。

    【讨论】:

      猜你喜欢
      • 2017-03-03
      • 1970-01-01
      • 2012-09-05
      • 1970-01-01
      • 1970-01-01
      • 2020-06-23
      • 2012-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多