'Typescript errors 'getters' is referenced directly or indirectly in its own type annotation

Please check codes firstly,

type GettersTypes = 'foo' | 'bar'

type State = {
  totalPrice: number
  products: any[]
}

export type Getters = {
  [key in GettersTypes]: (
    state: State, getters: GettersReturnType2<Getters, key> // error 'getters' is referenced directly or indirectly in its own type annotation
  ) => {
    price: number
    discount: any
  }
}

export type GettersReturnType<T, K extends string> = {
  readonly [key in Exclude<keyof T, K>]: T[key] extends ((...args: any) => any) ? ReturnType<T[key]> : never
}

export type GettersReturnType2<T, U extends keyof T> = T[U] extends ((...args: any) => any) ? ReturnType<T[U]> : never


declare const getters: Getters


getters.bar = function(state, getters) {

  const result = getters.foo
  return {
    price: 0,
    discount: 1
  }
}

Here is the play

In my opinion,GettersReturnType And GettersReturnType2 do the samething, but why use GettersReturnType2, ts will throw an error.



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source