【问题标题】:Circular type referenced in its own initializer在自己的初始化程序中引用的循环类型
【发布时间】:2019-11-15 18:50:46
【问题描述】:

下面我相信我遇到了循环输入的问题,这是因为 MethodReturns 正在为 userthis.every 运行,然后是 userIdthis.every

这是错误:

'user' 隐式具有类型'any',因为它没有类型注释并且在其自己的初始化程序中直接或间接引用。(7022)

这是链接:

PlaygroundLink

代码如下:

export type ThenArg<T> = T extends Promise<infer U> ? U : T

export type FirstArg<T extends any> =
    T extends [infer R, ...any[]] ? R :
    T extends [] ? undefined :
    T;

export type MethodReturns<C extends any, M extends Array<keyof C>> = {
    [K in M[number]]: C[K]['fn'] extends ((...args: any[]) => any) ? FirstArg<ThenArg<ReturnType<C[K]['fn']>>> : never
}

type User = { id: number, uuid: string, name: string }
const getUserById = (id: number): User => ({ id, uuid: '1234', name: 'thomas' })
const getUserByUuid = (uuid: string): User => ({ id: 1, uuid, name: 'thomas' })

class Example {

    every <T extends Array<keyof Example>, M extends MethodReturns<Example, T>, G>(a: T, b: (solo: M) => G) {
        // return function (): G {
        //     return b({} as M) as G
        // }
        return { keys: a, fn: b}
    }

    steve = this.every(['woof'], ({ woof }) => woof + 1)
    meow = this.every([], () => 1)
    woof = this.every(['meow'], ({ meow }) => meow + 1)

    user = this.every(['userId'], ({ userId }) => getUserById(userId))
    userId = this.every(['user'], ({ user }) number => user.id)

}

有没有办法在语法上进行这项工作,并且不会引起问题。正如您在上面看到的,我正在输入这些返回值,但它仍然没有起到作用:

理想情况下,我可以为this.every 提供一个可选类型,以允许MethodReturns 在可用时以某种方式使用它。

class Example {
    user = this.every<number>(['userId'], ({ userId }) => getUserById(userId))
    userId = this.every<User>(['user'], ({ user }) number => user.id)
}

我也可以接受任何其他语法作为答案。

【问题讨论】:

  • 这个问题与this one 有什么不同吗?我倾向于关闭其中一个作为副本。
  • 另一个问题与从单个对象中引用类型有关。这与一个循环问题有关,以及如何通过这种可选类型泛型来缓解它。

标签: typescript generics circular-reference


【解决方案1】:

我认为您将不得不手动注释您的属性。这可能可以通过适当类型的类型别名来简化,例如:

type PropThing<T, K extends keyof Example> =
    { keys: K[], fn: (solo: MethodReturns<Example, K[]>) => T }

然后以下应该防止错误:

user: PropThing<User, "userId"> = this.every(['userId'], ({ userId }) => getUserById(userId))
userId: PropThing<number, "user"> = this.every(['user'], ({ user }) => user.id)

好的,希望对您有所帮助;祝你好运!

Link to code

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-21
    • 2020-04-13
    • 1970-01-01
    • 2019-01-01
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多